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字节,会导致内存溢出

 

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

 

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

RT-Thread作品秀】基于RT-Thread的气压温度测量系统作者:安静的句型 概述(说明应用产生的背景、实现功能)基于ART-Pi,利用MS-P2XD10气压传感器模块,L610-CN-00-MiniPCIe-10Cat模块,设计了一款气压温度测量系统,测量环境的大气压力和温度,并上报到阿里云连接到物模型,实时显示。 开发环境(所采用的软、硬件方案)硬件:ART-Pi;L610;LPS22HH RT-Thread版本:4.0.3 开发工具及版本:MDK-v5.27.0.0 RT-Thread使用情况概述(简要总结下应用中RT-Thread使用情况:内核部分、组件部分、软件包部分、内核、其他)使用RT-Thread内核中使用线程、信号量、 邮箱、内存池等功能,在读取到传感器数据后,将气压和温度数据通过邮箱传输到阿里云发布线程,向云端发送。 调用了FinSH组件用于系统过程调试,监视线程应用情况、设备使用情况、其它信息等。 加载了多个软件包: AT DEVICE软件包,用于L610的驱动。 WebClient软件包,测试L610功能。 ali_iotkit软件包,配置阿里云三元组信息,连接阿里云。 cJSON软件包,进行数据封装。 硬件框架(概述应用所采用的硬件方案框图,并对核心部分做介绍)利用ART-Pi作为主控单元,通过I2C接口与LPS22HH气压传感器模块通讯,获取气压和温度值。通过UART接口与L610Cat通讯模块通讯,与云端连接。 其中LPS22HH需注意连线,具体连线如下: LPS22HH板 ART-Pi 定义 VDD P1-1 3.3V VDDIO P1-1 3.3V SA0 P2-39 GND SDA P1-3 I2C-SDA SCL P1-5 I2C-SCL CS P1-1 3.3V GND P1-39 GND 其中VDD和VDDIO都是为LPS22HH供电,直接使用ART-Pi的3.3V电源。SA0是用于选择地址,接地后地址为0x5C。SDA和SCL是I2C接口“i2c3”。CS作为片选信号,接高电平后选择接口为I2C。 L610连线如下: L610板 ART-Pi 定义 UA1_TX P1-10 UART-TX UA1_RX P1-8 UART-RX AUTO_POWER_ON_1 P1-6 GND AUTO_POWER_ON_2 P1-12 PI5 CTS短路帽不接。 电源短路帽接至VUSB。 连接USB接口供电和通讯。 软件框架说明(介绍应用所采用的软件方案框图、流程图等,并加以解说)在main.c文件中首先进行了L1610的上电,mqtt初始化,lps22hh初始化等,并创建了四个线程,LED闪烁线程、阿里云发送数据线程、接收阿里云命令线程、定时器线程。 当前实现了基础功能: 通过控制台发送读取传感器数据指令后,在阿里云显示的功能。 后期还需继续完善两个功能: 硬件定时器功能,可按设定的时间间隔进行工作,采集传感器数据并上报云端,当前使能了timer13,但是定时器无法正常工作,程序是按照文档和原潘多拉板直接移植的,暂未找到问题原因。 阿里云下发命令功能,阿里云可以下发命令控制LED开关,下发命令控制硬件定时器定时间隔,随时修改传感器上报数据频率。除了阿里云在线调试界面,暂未找到如何下发命令方法。 还有一些问题: L610的初始化过程有些不太清楚,看at_device_l610.c文件,是在其中创建了一个初始化的线程并直接调用了,这个怎么能在main中统一初始化呢,现在是在main中延时了10秒等待初始化完成后再执行mqtt等初始化。 对接sensor设备框架未成功,尝试了创建sensor设备成功,但是初始化过程应该有问题,对于一个传感器两个参数的情况暂未了解透彻。 软件模块说明(介绍应用软件关键部分的逻辑、采用的实现方式等)sensor_st_lps22hh应用模块直接调用了st的函数库lps2hh_reg,首先创建了stmdev_ctx_t变量,完成了寄存器读写函数的实例化,在此需注意lps22hh的地址,选择了sa0为gnd后地址为0x5c,此地址为7位,可以直接在i2c设备框架中直接赋值无需右移。另外在读取寄存器值时应首先写地址然后才是读数据。参考st的polling文件,编写了初始化函数和读取数据函数,直接读取气压和温度值,并发送至邮箱。 api_ali应用模块参考ali-iotkit的mqtt_example文件,在ENV中配置好三元组信息后,进行mqtt初始化,读取三元组,与云端建立mqtt连接,并订阅了发布和读取主题。编写了数据发布函数,可由发布线程直接调用。试验了cJSON软件包,直接打包成json数据,试验了直接赋值字符串,均可正常实现。试验了接收命令线程,在阿里云
要将STM32接入阿里云平台实现数据上传和命令下发,首先需要进行以下步骤。 1. 准备硬件:选择合适的STM32开发板,并连接必要的传感器或执行器。确保能够通过STM32从设备获取所需的数据或执行相应的操作。 2. 创建阿里云账号:在阿里云官网注册账号并登录。 3. 创建物联网平台实例:进入物联网平台控制台,在实例列表中点击"创建实例"按钮。根据实际需求选择合适的计费方式、区域和规格,然后点击"创建"完成实例创建。 4. 创建产品和设备:在物联网平台控制台,点击"设备管理",然后点击"创建产品"。填写产品名称、节点类型、数据格式等信息。创建产品后,点击产品详情页面中的"设备管理",再点击"添加设备",填写设备名称和设备标识码,并将设备与产品进行绑定。 5. 编写STM32代码:使用合适的开发环境编写STM32代码,实现与阿里云平台的通信。需要安装并使用阿里云提供的物联网软件开发套件(SDK),通过SDK提供的API实现数据上传和命令下发功能。 6. 配置设备连接参数:在STM32代码中配置设备连接参数,包括设备的产品Key、设备Key、设备密钥等。这些参数可以在物联网平台控制台的"设备管理"页面中找到。 7. 数据上传:使用SDK提供的API,将STM32获取到的数据封装成阿里云平台所定义的数据格式,然后通过SDK的数据上传接口将数据发送到阿里云平台。 8. 命令下发:阿里云平台提供了远程管理设备的功能,可以通过控制台或API发送命令给设备。在STM32代码中,使用SDK提供的命令接收接口来接收来自阿里云平台的命令,并根据命令内容执行相应的操作。 通过以上步骤,我们可以实现STM32与阿里云平台的连接,实现数据上传和命令下发的功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值