【Clion开发】【三】阿里云物联网平台使用之M61开发板阿里云平台物模型使用

[复制链接]
查看633 | 回复6 | 2024-1-31 15:42:59 | 显示全部楼层 |阅读模式
本帖最后由 wxlinus 于 2024-1-31 15:47 编辑

【Clion开发】【二】阿里云物联网平台使用之M61开发板连接阿里云平台

经过上面的相关内容我们已经可以连接到阿里云物联网平台了,现在我们就来学习一下如何使用阿里云物联网平台的物模型功能
物模型是阿里云物联网平台为产品定义的数据模型,用于描述产品的功能。

物模型介绍.png

物模型详细的内容添加与新建可以参考官方文档:定义物模型属性、事件和服务_物联网平台(IoT)-阿里云帮助中心 (aliyun.com)
我们下边就讲讲如何使用物模型来点m61开发板上面的灯
原理图.png

灯的定义
  1. **
  2. * RGB灯引脚定义
  3. */
  4. #define LED3_R 12
  5. #define LED3_G 14
  6. #define LED3_B 15
复制代码
1、在阿里云物联网平台上新建相关物模型
新建物模型.png
添加自定义功能.png

2、设备端开发
物模型属性上报,云端会根据上报数据改变设备状态,这里暂时注释了,上报频率高会打印日志太多不好调试
物模型上报.png

上报的数据都会对应到云端的对应物模型根据上报的属性对应
详细参考官方文档
物模型属性、事件、服务的Alink JSON数据格式和Topic_物联网平台(IoT)-阿里云帮助中心 (aliyun.com)

例如LightSwitch就是把对应标识的物模型数据变为0"{\"LightSwitch\": 0}"

物模型数据.png

物模型设置属性
通过调用SetDevicePropertySetDevicesProperty下发设置属性指令到设备。实现设置设备属性的原理,请参见Alink协议中设置属性原理图

相关解析的代码主要是判断接收到云端相应消息后进行解析进行开关灯
  1. static void rgb_led_dm_set(char *data) {
  2.     if (data == NULL) {
  3.         LOG_E("data is no's json");
  4.     }
  5.     cJSON *root = cJSON_Parse(data);
  6.     if (root == NULL) {
  7.         LOG_E("root is null");
  8.     }
  9.     cJSON *led_r = cJSON_GetObjectItem(root, "LED_R");
  10.     if (led_r != NULL) {
  11.         if(led_r->valueint==0){
  12.             led_off(LED3_R);
  13.         } else{
  14.             led_on(LED3_R);
  15.         }
  16.     }
  17.     cJSON *led_g = cJSON_GetObjectItem(root, "LED_G");
  18.     if (led_g != NULL) {
  19.         if(led_g->valueint==0){
  20.             led_off(LED3_G);
  21.         } else{
  22.             led_on(LED3_G);
  23.         }
  24.     }
  25.     cJSON *led_b = cJSON_GetObjectItem(root, "LED_B");
  26.     if (led_b != NULL) {
  27.         if(led_b->valueint==0){
  28.             led_off(LED3_B);
  29.         } else{
  30.             led_on(LED3_B);
  31.         }
  32.     }
  33.     cJSON_Delete(root);
  34. }
复制代码
3、状态验证
在云端打开调试页面设置一下属性

Snipaste_2024-01-31_13-56-32.png
可以看到设备端接收到了对应消息
串口打印数据.png
开发板灯也亮了
开发板亮灯.png
4、小结
物模型还有很多功能比如采集温湿度传感器的数据上报到云端,都是类似的,只要新建号对应的物模型就行。
基于物模型我们还能做很多东西比如数据流转、数据保存、云产品流转、web可视化相关内容、这个等以后有时间在写了。
设备端物模型相关的函数回调由以下函数实现
  1. <blockquote>/**
复制代码
我们这次涉及到的是属性设置函数就是收到数据解析然后判断对应状态然后开灯与关灯

  1. <blockquote>/**
复制代码


物模型相关api是作为组件集成到linksdk中的
物模型api.png
初始化相关代码主要是mqtt初始化中dm开头的一些函数
  1. uint8_t user_mqtt_init(void) {
  2.     int32_t res = STATE_SUCCESS;
  3.     //安全凭据结构体, 如果要用TLS, 这个结构体中配置CA证书等参数
  4.     aiot_sysdep_network_cred_t cred;
  5.     uint8_t protocol_version = 0;

  6.     //配置SDK的底层依赖
  7.     aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
  8.     //配置SDK的日志输出
  9.     aiot_state_set_logcb(demo_state_logcb);

  10.     //创建SDK的安全凭据, 用于建立TLS连接
  11.     memset(&cred, 0, sizeof(aiot_sysdep_network_cred_t));
  12.     //使用RSA证书校验MQTT服务端
  13.     cred.option = AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA;
  14.     //最大的分片长度为16K, 其它可选值还有4K, 2K, 1K, 0.5K
  15.     cred.max_tls_fragment = 16384;
  16.     //TLS建连时, 支持Server Name Indicator
  17.     cred.sni_enabled = 1;
  18.     //用来验证MQTT服务端的RSA根证书
  19.     cred.x509_server_cert = ali_ca_cert;
  20.     //用来验证MQTT服务端的RSA根证书长度
  21.     cred.x509_server_cert_len = strlen(ali_ca_cert);

  22.     //创建1个MQTT客户端实例并内部初始化默认参数
  23.     mqtt_handle = aiot_mqtt_init();
  24.     if (mqtt_handle == NULL) {
  25.         LOG_E("aiot_mqtt_init failed\n");
  26.         return -1;
  27.     }

  28.     // 配置MQTT协议的版本
  29.     protocol_version = AIOT_MQTT_VERSION_5_0;
  30.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_VERSION, (void *) &protocol_version);
  31.     // 配置MQTT服务器地址
  32.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_HOST, (void *) mqtt_host);
  33.     // 配置MQTT服务器端口
  34.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_PORT, (void *) &port);
  35.     // 配置设备productKey
  36.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_PRODUCT_KEY, (void *) product_key);
  37.     // 配置设备deviceName
  38.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_DEVICE_NAME, (void *) device_name);
  39.     // 配置设备deviceSecret
  40.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_DEVICE_SECRET, (void *) device_secret);
  41.     // 配置网络连接的安全凭据, 上面已经创建好了
  42.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_NETWORK_CRED, (void *) &cred);
  43.     // 配置MQTT默认消息接收回调函数
  44.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_RECV_HANDLER, (void *) demo_mqtt_default_recv_handler);
  45.     // 配置MQTT事件回调函数
  46.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_EVENT_HANDLER, (void *) demo_mqtt_event_handler);

  47.     // 如果要使用MQTT 5.0的assigned clientId功能, 需要将use_assigned_clientid置为1
  48.     uint8_t use_assigned_clientid = 0;
  49.     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_ASSIGNED_CLIENTID, (void *) (&use_assigned_clientid));

  50.     //初始化物模型
  51.     user_dm_init();

  52.     // 创建建连的属性集合,并添加用户属性
  53.     mqtt_properties_t *conn_props = aiot_mqtt_props_init();
  54.     mqtt_property_t user_prop = {
  55.             .id = MQTT_PROP_ID_USER_PROPERTY,
  56.             .value.str_pair.key.len = strlen("demo_key"),
  57.             .value.str_pair.key.value = (uint8_t *) "demo_key",
  58.             .value.str_pair.value.len = strlen("demo_value"),
  59.             .value.str_pair.value.value = (uint8_t *) "demo_value",
  60.     };
  61.     aiot_mqtt_props_add(conn_props, &user_prop);

  62.     // 通过MQTT 5.0的方式与服务器建连
  63.     res = aiot_mqtt_connect_v5(mqtt_handle, NULL, NULL);
  64.     aiot_mqtt_props_deinit(&conn_props);
  65.     if (res < STATE_SUCCESS) {
  66.         //尝试建立连接失败, 销毁MQTT实例, 回收资源
  67.         aiot_dm_deinit(&dm_handle);
  68.         aiot_mqtt_deinit(&mqtt_handle);
  69.         LOG_E("aiot_mqtt_connect failed: -0x%04X\n\r\n", -res);
  70.         LOG_E("please check variables like mqtt_host, produt_key, device_name, device_secret in demo\r\n");
  71.         return -1;
  72.     }


  73.     //创建一个单独的任务用于执行aiot_mqtt_process, 它会自动发送心跳保活, 以及重发QoS1的未应答报文
  74.     g_mqtt_process_task_running = 1;
  75.     xTaskCreate(demo_mqtt_process_task, "aiot_mqtt_process", 1024 * 2, NULL, 3, g_mqtt_process_task);


  76.     // 创建一个单独的任务用于执行aiot_mqtt_recv, 它会循环收取服务器下发的MQTT消息, 并在断线时自动重连
  77.     g_mqtt_recv_task_running = 1;
  78.     xTaskCreate(demo_mqtt_recv_task, "aiot_mqtt_recv", 1024 * 2, NULL, 3, g_mqtt_recv_task);

  79.     //通知MQTT连接成功
  80.     user_state_send_notify(STATE_MQTT_CONNECTED_OK, 0);
  81.     return 0;
  82. }
复制代码



相关代码已经放在gitee上面m61sdk: 安信可m61模组sdk移植项目 (gitee.com)








本帖被以下淘专辑推荐:

回复

使用道具 举报

1084504793 | 2024-1-31 16:04:06 | 显示全部楼层
回复

使用道具 举报

楚华 | 2024-1-31 16:35:11 | 显示全部楼层
赞一个
回复

使用道具 举报

爱笑 | 2024-1-31 16:41:33 | 显示全部楼层
真不错!
用心做好保姆工作
回复

使用道具 举报

7788 | 2024-1-31 22:30:57 | 显示全部楼层
学习学习
回复

使用道具 举报

WT_0213 | 2024-2-1 08:59:15 | 显示全部楼层
学习学习
回复

使用道具 举报

lazy | 2024-2-1 09:26:21 | 显示全部楼层
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则