发帖
1 0 0

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

OldNewman
金牌会员

4

主题

50

回帖

1567

积分

金牌会员

积分
1567
Ai-WB2系列 20 1 昨天 19:34

阿里云物联网平台

简介

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

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

云平台实操

创建产品

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

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

image.png

新建产品

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

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

image.png

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

image.png

功能定义(物模型)

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

image.png

添加功能

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

image.png

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

image.png

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

image.png

image.png

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

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

image.png

手动添加一个设备名

image.png

image.png

查看设备三元素

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

image.png

物模型对应的Topic

image.png

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

image.png

找到 Alink JSON 下的请求 Topic

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

image.png

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

芯片或者模组,原本需要自己适配物联网平台设备端SDK,如下是官网 C Link SDK ,可以下载并进行移植适配。

https://help.aliyun.com/zh/iot/developer-reference/link-sdks?spm=5176.11485173.console-base_help.dexternal.1c1d70d85aX25M

image.png

但是 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

实物图

image.png

image.png

流程

主流程

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

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

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

  1. 注册 event_cb_wifi_event() ,这是 WiFi 协议栈的回调函数
  2. 调用 hal_wifi_start_firmware_task() 启动 WiFi 协议栈
  3. 调用 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连接到阿里云,订阅、发布消息

image.png

MQTT 流程

image.png

用户代码和 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);
    }
}

物联网平台日志

image.png

温度曲线

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

image.png

湿度曲线

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

image.png

测评总结

幸好安信可已经适配了 Ali C SDK,不然重头开始适配阿里云物联网平台要花费不少时间。

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

──── 0人觉得很赞 ────

使用道具 举报

赞👍
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28623 个
  • 话题数: 40772 篇