RT-Thread Studio使用笔记(七):通过4G模块连接到阿里云

本文介绍了如何利用RT-Thread Studio配置4G模块SIM7600连接到阿里云物联网平台。通过阐述设备属性和事件的概念,展示了Alink JSON格式的数据交互,并提供了RT-Thread配置、发布与订阅主题的代码示例。在实践中,注意MQTT主题的正确设定以及避免因主机地址数组长度不足导致的问题。最终,实现了设备与云端的连接和数据通信。
摘要由CSDN通过智能技术生成

概述

    本文带大家一起,基于上篇文章中的的4G模块连接到阿里云平台

传送门:

RT-Thread Studio使用笔记(六):4G模块SIM7600的使用

https://blog.csdn.net/tigerots/article/details/108132814

参考资料:

https://help.aliyun.com/document_detail/89301.html?spm=a2c4g.11186623.6.706.bec8429dZDvMvG

 

阿里云创建产品

阿里云物联网平台地址:https://iot.console.aliyun.com/studio?spm=a2c56.12526802.1304866.1.743b107bMaky1X

 

关于属性和事件

 

阿里关于设备属性,事件的描述有专门的章节,我们一般选用Alink json格式

使用Alink格式的数据如下:

上行(Alink JSON):

  • 设备请求用的Topic: /sys/{productKey}/{deviceName}/thing/event/property/post

本例程使用的请求Topic

"/sys/a1ZkpqGqexK/DTU_4G_002/thing/event/property/post"

  • 设备请求用的payload数据, 应包含方法, ID, 参数几个重要选项

 {
      "method":  "thing.event.property.post",
      "id":  "20",
      "params": {
             "RGBColor": {
                     "Red": 20,
                     "Blue": 21,
                     "Green": 22
               }
      },
      "version": "1.0.0"
 }

 

  • 云响应设备Topic: /sys/{productKey}/{deviceName}/thing/event/property/post_reply

/sys/a1ZkpqGqexK/DTU_4G_002//thing/event/property/post_reply

  • 云响应设备的数据内容, code为200表示成功, ID号与请求ID号一致

{
     "code": 200,
      "data": {
      },
      "id": "45",
      "message": "success",
      "method": "thing.event.property.post",
      "version": "1.0"
 }

一定要了解,你的设备要订阅或发布的主题,否则无法进行嵌入式程序的编写。

 

RT-Thread配置

1. 使能阿里云的mqtt软件包,()如需要深入了解MQTT协议,建议大家观看超威的视频,裸机分析,讲的非常透彻),并根据阿里云上你的产品进行配置。

以上信息来自于阿里云设备管理,如下图所示:

2. 配置完成后,打开例程,即可根据阿里的主题规则,配置订阅和要发布的主题


uint32_t id_cnt = 0;
// 上传修改属性值
static int example_publish(void *handle)
{
    int             res = 0;
    const char     *fmt = "/sys/%s/%s/thing/event/property/post";
    char           *topic = NULL;
    int             topic_len = 0;

    char           *fmt2 = "{%s,%s,%s,%s}";
    char           *method = "\"method\": \"thing.event.property.post\"";// 方法
    char            id[16] = "";// 唯一ID
    char            params[128] = "";// 参数
    char           *version = "\"version\":\"1.0.0\"";// 版本,固定

    char           *payload = NULL;
    int             payload_len = 0;


    // 生成payload所用的参数
    id_cnt ++;
    HAL_Snprintf(id, 16, "\"id\": \"%d\"", id_cnt);
    HAL_Snprintf(params, 128, "\"params\":{\"CurrentHumidity\":%d,\"VehSpeed\":%d,\"Atmosphere\":%d,\"CurrentTemperature\":%d}",
                (id_cnt%100), (id_cnt%1150), (id_cnt%10+990), (id_cnt%10+20));

    // 生成payload
    payload_len = strlen(fmt2) + strlen(method) + strlen(id) + strlen(params) + strlen(version) + 1;
    payload = HAL_Malloc(payload_len);
    if (payload == NULL) {
        EXAMPLE_TRACE("memory not enough");
        return -1;
    }
    memset(payload, 0, payload_len);
    HAL_Snprintf(payload, payload_len, fmt2, method, id, params, version);


    // 生成topic
    topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
    topic = HAL_Malloc(topic_len);
    if (topic == NULL) {
        EXAMPLE_TRACE("memory not enough");
        return -1;
    }
    memset(topic, 0, topic_len);
    HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);

    // 发布主题
    res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, payload, strlen(payload));
    if (res < 0) {
        EXAMPLE_TRACE("publish failed, res = %d", res);
        HAL_Free(topic);
        return -1;
    }

    HAL_Free(topic);
    return 0;
}
static int example_subscribe(void *handle)
{
    int res = 0;
    const char *fmt = "/%s/%s/user/get";
    char *topic = NULL;
    int topic_len = 0;

    topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
    topic = HAL_Malloc(topic_len);
    if (topic == NULL) {
        EXAMPLE_TRACE("memory not enough");
        return -1;
    }
    memset(topic, 0, topic_len);
    HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);

    res = IOT_MQTT_Subscribe(handle, topic, IOTX_MQTT_QOS0, example_message_arrive, NULL);
    if (res < 0) {
        EXAMPLE_TRACE("subscribe failed");
        HAL_Free(topic);
        return -1;
    }

    HAL_Free(topic);
    return 0;
}

 

编译运行后,中断一直提示保存,出现异常,是因为(基于上一篇博客《RT-Thread Studio使用笔记(六):4G模块SIM7600的使用》)中的主机地址数组长度不够,此处解析的阿里云地址数据比较长,默认为32字节,会导致内存溢出

 

修改完成后, 即可通过控制台,成功连接到阿里云,并且能够实现主题的发布与订阅。

 

各位,不好意思,这篇博文遗漏比较多,不够详细, 本来计划边写代码,边写博客,但是因为中间公司的开发任务比较多,耽误了时间,所以没有及时完成博客,现在想补,但是手头已经没有的板子,无法截取相关操作的图片了,如果有需要交流该问题的小伙伴,请私信我。

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值