Skip to content

由 OldNewman 贡献,Ai-Thinker 进行整理

【AI-WB2-32S-Kit 测评】04 阿里云物联网平台上报温湿度 ​

阿里云物联网平台 ​

简介 ​

阿里云物联网平台是阿里云推出的一站式物联网解决方案,帮助企业实现设备智能化连接、管理和数据处理。核心功能包括:

  1. 设备接入与管理 :支持多种协议,提供设备全生命周期管理。
  2. 数据采集与处理 :实时采集、存储和处理设备数据,支持规则引擎。
  3. 安全保障 :提供身份认证、数据加密和权限控制。
  4. 云端与边缘协同 :支持边缘计算,满足低延迟需求。
  5. 数据分析与可视化 :挖掘数据价值,提供直观的报表和仪表盘。
  6. 开放生态 :兼容第三方服务,无缝对接阿里云其他产品。

云平台实操 ​

创建产品 ​

登录阿里云物联网平台 https://iot.console.aliyun.com/product

进入设备管理界面,选择 产品 --> 创建产品

新建产品 ​

在新建产品界面,依次选择或者填写如下信息:

  1. 产品名称: WB2-32S-Kit-IOT
  2. 所属品类:自定义品类(方便后续修改物模型)
  3. 节点类型:直连设备
  4. 连网方式:Wi-Fi
  5. 数据格式:ICA 标准数据格式(Alink JSON)
  6. 校验类型:弱校验
  7. 认证方式:设备秘钥
  8. 产品描述:添加描述信息,如 Ai-Thinker 无线产品

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

功能定义(物模型) ​

弹出功能定义界面,点击前往编辑草稿

添加功能 ​

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

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

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

添加设备(为了设备三要素) ​

进入设备开发标签,选择添加设备

手动添加一个设备名 ​

查看设备三元素 ​

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

物模型对应的Topic ​

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

找到 Alink JSON 下的请求 Topic

/sys/productKey/{deviceName}/thing/event/property/post 对应的消息类型就是右侧的 JSON 文本格式。

  1. 物联网平台设备端开发 ​

芯片或者模组,原本需要自己适配物联网平台设备端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/

📜 点击展开完整代码
html
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 连接关系如下

DHT11WB2-32S-Kit
3V33V3
GNDGND
NCNC
I/OIO12

实物图 ​

流程 ​

主流程 ​

系统上电启动,在main() 函数做了两件事:

  1. tcpip_init() 启动 LwIP 协议栈
  2. 创建 proc_main_entry() 线程,

在 proc_main_entry() 线程中,完成 WiFi 扫描连接,获取IP之后调用 ali_linkkit_main() 启动阿里云物联网平台 MQTT 连接线程:

📜 点击展开完整代码
c
注册 event_cb_wifi_event() ,这是 WiFi 协议栈的回调函数
调用 hal_wifi_start_firmware_task() 启动 WiFi 协议栈
调用 aos_post_event(CODE_WIFI_ON_INIT_DONE) 通知 WiFi 协议栈硬件初始化完毕

关键函数 ali_linkkit_main():

  1. 调用 aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile) 注册安信可对阿里云平台的适配层,包括内存申请、释放,Mutex、时间、网络等API
  2. 调用 ali_mqtt_init() 函数,这是应用层函数,启动MQTT连接到阿里云,订阅、发布消息

MQTT 流程 ​

用户代码和 MQTT流程的交互点在用户调用 start_update_data() 实际触发 aiot_mqtt_send_thread() 线程,最终调用 pub_msg() 上传物模型消息到云平台。

关键代码 ​

main() 函数创建线程,每隔3秒钟读取DTH11温湿度信息,然后调用 start_update_data() 通知 MQTT 线程。

📜 点击展开完整代码
c++
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() 上传。

📜 点击展开完整代码
c++
/* 发送实时参数 */

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消息。

📜 点击展开完整代码
c++
/**
 * @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,不然重头开始适配阿里云物联网平台要花费不少时间。

创建产品、功能定义,其实各个物联网平台都差不多。

Released under the MIT License. Build Time 2026-09-30 17:31:25