阿里云物联网平台
简介
阿里云物联网平台是阿里云推出的一站式物联网解决方案,帮助企业实现设备智能化连接、管理和数据处理。核心功能包括:
- 设备接入与管理 :支持多种协议,提供设备全生命周期管理。
- 数据采集与处理 :实时采集、存储和处理设备数据,支持规则引擎。
- 安全保障 :提供身份认证、数据加密和权限控制。
- 云端与边缘协同 :支持边缘计算,满足低延迟需求。
- 数据分析与可视化 :挖掘数据价值,提供直观的报表和仪表盘。
- 开放生态 :兼容第三方服务,无缝对接阿里云其他产品。
云平台实操
创建产品
登录阿里云物联网平台 https://iot.console.aliyun.com/product
进入设备管理界面,选择 产品 --> 创建产品

新建产品
在新建产品界面,依次选择或者填写如下信息:
- 产品名称: WB2-32S-Kit-IOT
- 所属品类:自定义品类(方便后续修改物模型)
- 节点类型:直连设备
- 连网方式:Wi-Fi
- 数据格式:ICA 标准数据格式(Alink JSON)
- 校验类型:弱校验
- 认证方式:设备秘钥
- 产品描述:添加描述信息,如 Ai-Thinker 无线产品

点击确认之后弹出如下的页面,先别着急添加设备,而是点击功能定义,设置物模型。

功能定义(物模型)
弹出功能定义界面,点击前往编辑草稿

添加功能
- 添加标准功能
- 其他类型
- 输入“当前温度” 按下 Enter 开始搜寻匹配的类型
- 从列表中选择 “当前温度”,所属品类为 “空气盒子”的功能,右侧已选功能就添加了
- 点击确定

按照上面的操作依次添加“当前温度”、“当前湿度”功能。

功能添加完毕后,一定要注意最下方的提示,发布上线 才正式生效。


添加设备(为了设备三要素)
进入设备开发标签,选择添加设备

手动添加一个设备名


查看设备三元素
当前设备证书是一机一密。在SDK中需要提供 ProductKey, DeviceName 和 DeviceSecret 才能注册成功。

物模型对应的Topic

往下翻,找到 物模型通信 Topic-->属性上报

找到 Alink JSON 下的请求 Topic
/sys/${productKey}/${deviceName}/thing/event/property/post 对应的消息类型就是右侧的 JSON 文本格式。

-
物联网平台设备端开发
芯片或者模组,原本需要自己适配物联网平台设备端SDK,如下是官网 C Link SDK ,可以下载并进行移植适配。
https://help.aliyun.com/zh/iot/developer-reference/link-sdks?spm=5176.11485173.console-base_help.dexternal.1c1d70d85aX25M

但是 Ai-WB2-32S-Kit SDK 已经移植好了,拿来修改下就能用,参见 Ai-Thinker-WB2/applications/iot-solution/ali_iot 工程。
ali_iot/
ali\_cloud/
ali\_csdk/ -- 阿里物联网平台 SDK 核心
components/
core/
demos/
external/
portfiles/
ali\_mqtt/ -- MQTT 应用,用户在这里订阅和发布TOPIC
ali\_ntp/ -- NTP 线程
ali\_ota/ -- 阿里物联网平台 OTA 功能实现
main/ -- 用户程序入口
上报云平台
硬件
DHT11 温湿度计和 AI-WB2-32S-Kit 连接关系如下
DHT11 |
WB2-32S-Kit |
3V3 |
3V3 |
GND |
GND |
NC |
NC |
I/O |
IO12 |
实物图


流程
主流程
系统上电启动,在main() 函数做了两件事:
- tcpip_init() 启动 LwIP 协议栈
- 创建 proc_main_entry() 线程,
在 proc_main_entry() 线程中,完成 WiFi 扫描连接,获取IP之后调用 ali_linkkit_main() 启动阿里云物联网平台 MQTT 连接线程:
- 注册 event_cb_wifi_event() ,这是 WiFi 协议栈的回调函数
- 调用 hal_wifi_start_firmware_task() 启动 WiFi 协议栈
- 调用 aos_post_event(CODE_WIFI_ON_INIT_DONE) 通知 WiFi 协议栈硬件初始化完毕
关键函数 ali_linkkit_main():
- 调用 aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile) 注册安信可对阿里云平台的适配层,包括内存申请、释放,Mutex、时间、网络等API
- 调用 ali_mqtt_init() 函数,这是应用层函数,启动MQTT连接到阿里云,订阅、发布消息

MQTT 流程

用户代码和 MQTT流程的交互点在用户调用 start_update_data() 实际触发 aiot_mqtt_send_thread() 线程,最终调用 pub_msg() 上传物模型消息到云平台。
关键代码
main() 函数创建线程,每隔3秒钟读取DTH11温湿度信息,然后调用 start_update_data() 通知 MQTT 线程。
static void proc_main_entry(void* pvParameters)
{
aos_register_event_filter(EV_WIFI, event_cb_wifi_event, NULL);
hal_wifi_start_firmware_task();
aos_post_event(EV_WIFI, CODE_WIFI_ON_INIT_DONE, 0);
dht11_basic_init();
while (1) {
// Post data to AliCloud
aos_msleep(3000);
if (0 == dht11_basic_read(&g_temperature, &g_humidity)) { // Read successfully
blog_info("%.2f C degree\t%u%%", g_temperature, g_humidity);
start_update_data();
} else {
blog_error("Read failed");
}
}
vTaskDelete(NULL);
}
MQTT 上传物模型线程 aiot_mqtt_send_thread() 等待信号量,然后调用 pub_msg() 上传。
/* 发送实时参数 */
void aiot_mqtt_send_thread(void* pvParameters)
{
// int32_t res = STATE_SUCCESS;
xSemaphore_send = xSemaphoreCreateBinary();
if (xSemaphore_send == NULL) {
printf("create fail\r\n");
}
while (g_mqtt_process_thread_running) {
if (xSemaphore_send != NULL) {
/* See if we can obtain the semaphore. If the semaphore is not
available wait 10 ticks to see if it becomes free. */
if (xSemaphoreTake(xSemaphore_send, portMAX_DELAY) == pdTRUE) {
// 这里上传数据
pub_msg(pvParameters);
}
}
}
vTaskDelete(NULL);
}
pub_msg() 构造 JSON 格式字符串,以物模型消息格式上报温度和湿度,最终调用 aiot_mqtt_pub() 上传MQTT消息。
/**
* @brief 上报物模型消息到云平台
*
* @param handle
*/
void pub_msg(void* handle)
{
static uint32_t id = 1;
char* version = "1.0";
// format: sys/${productKey}/${deviceName}/thing/event/property/post
memset(g_topic_property_post, 0, sizeof(g_topic_property_post));
sprintf(g_topic_property_post, "/sys/%s/%s/thing/event/property/post", g_product_key, g_device_name);
printf("g_topic_property_post=%s\r\n", g_topic_property_post);
// TODO: 此处换行导致 g_pub_msg 占用字节特比多,552 个字节。如果调用 cJSON 或者重新排版,可以减少字节个数
sprintf((char*)g_pub_msg,
"{ \
\"id\": \"%u\", \
\"version\" : \"%s\", \
\"method\" : \"thing.event.property.post\", \
\"params\" : { \
\"CurrentTemperature\": { \
\"value\": %.2f \
}, \
\"CurrentHumidity\" : { \
\"value\": %u \
} \
} \
}",
id++, version, g_temperature, g_humidity);
printf("g_pub_msg [len=%u] =%s\r\n", strlen(g_pub_msg), g_pub_msg);
int32_t res = aiot_mqtt_pub(handle, g_topic_property_post, (uint8_t*)g_pub_msg, strlen(g_pub_msg), 0);
if (res < 0) {
printf("aiot_mqtt_pub failed, res: -0x%04X\n", -res);
}
}
物联网平台日志

温度曲线
凸起的数值是手捏了DHT11导致温度提高。

湿度曲线
曲线凸起的地方是手捏了DHT11,湿度增加。

测评总结
幸好安信可已经适配了 Ali C SDK,不然重头开始适配阿里云物联网平台要花费不少时间。
创建产品、功能定义,其实各个物联网平台都差不多。