0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RT-Thread和Infineon的物联网demo设计简介

冬至子 来源:crystal266 作者:crystal266 2023-11-21 16:51 次阅读

1 开发板介绍

该开发板的主控芯片型号为CY8C624A,是一个具有 Cortex-M4F 和 Cortex-M0+ 的 双核CPU,该主控芯片的功能框图如下所示:

1.jpg

开发板两侧留有供调试和外接其他模块的排针接口,如下图所示。从图中可以看出预留出了串口、IIC、SPI、ADC和PWM等常见的外设和总线接口。

1.jpg

2 设计简介

2.1 功能简介

本次设计基于 RT-Thread 物联网操作系统和 Infineon 开发板,使用 RT-Studio 作为开发工具,使用 ESP8266-WIFI 模块作为物联网的通讯介质,使用腾讯云服务器作为MQTT服务器,使用腾讯连连作为人机交互端,整体的功能框图如下所示:

1.jpg

2.2 ESP8266 简介

本次使用的 ESP8266 模块如下图所示,ESP8266 是一款强大的 WIFI 模块,支持 AT 指令开发,SDK 开发、Lua 开发、Arduino 开发、Lua 开发等开发方式,本次为了方便和主控板通讯采用 AT 指令的方式进行开发。

3 开发步骤

本次开发使用 AT 组件和 MQTT 通讯协议进行设备和服务器之间的通讯,所以需要在配置中配置相应的组件。

3.1 AT 组件

RT-Thread 官方支持了丰富的 AT 设备,本次所用的 ESP8266 模块的配置如下所示,需要开启相应的组件并配置路由的信息和AT设备的串口。

1.jpg

3.2 MQTT 组件

RT-Thread 官方支持了多种 MQTT 组件,本次使用 PahoMQTT 组件进行开发,配置如下所示:

1.jpg

3.3 CJson 组件

为了方便和腾讯云服务器进行通讯,在设计通讯格式时采用物模型的方式进行通讯,需要用到 Json 数据格式,在嵌入式设备中通常使用 CJSOn 库对 Json 数据进行解析,CJson 的配置如下:

1.jpg

配制好的组件如下图所示:

1.jpg

3.4 腾讯云服务器的配置

腾讯云物联网开发平台作为本项目的云平台进行数据的转发。

1.jpg

4 关键代码编写

MQTT任务的代码如下,主要写了登录,退出,发布消息的代码,订阅回调函数。

#include
#include
#include
#include
#include "rtdevice.h"
#define DBG_TAG "mqtt_task.c"
#define DBG_LVL DBG_LOG
#include
#include "paho_mqtt.h"
#include "infineon_esp8266.h"
#include "json_parse.h"
#include "led.h"
#include "cJSON.h"
//#include "cJSON_util.h"
/**

  • MQTT URI farmat:
  • domain mode
  • tcp://iot.eclipse.org:1883
  • ipv4 mode
  • tcp://192.168.10.1:1883
  • ssl://192.168.10.1:1884
  • ipv6 mode
  • tcp://[fe80::20c:29ff:fe9a:a07e]:1883
  • ssl://[fe80::20c:29ff:fe9a:a07e]:1884
    /
    #define MQTT_URI "tcp://T0FR66L94D.iotcloud.tencentdevices.com:1883"
    #define MQTT_CLIENT_ID "T0FR66L94Dinfineon_esp8266"
    #define MQTT_USERNAME "T0FR66L94Dinfineon_esp8266;12010126;AVBVT;1647450202"
    #define MQTT_PASSWORD "68dab4c81b227f841ef86b6223711975106a4a4cfe6556f77504b606430eeae0;hmacsha256"
    #define MQTT_SUBTOPIC "$thing/down/property/T0FR66L94D/infineon_esp8266"
    #define MQTT_PUBTOPIC "$thing/up/property/T0FR66L94D/infineon_esp8266"
    #define MQTT_WILLMSG "Goodbye!"
    /
    define MQTT client context /
    static MQTTClient client;
    static int is_started = 0;
    /
    *
  • @brief MQTT 订阅回调函数
  • @param c 客户端标识
  • @param msg_data 收到的数据
  • @return 无
    */
    static void infineon_mqtt_sub_callback(MQTTClient *c, MessageData *msg_data)
    {
    *((char *) msg_data->message->payload + msg_data->message->payloadlen) = '�';
    LOG_D("mqtt sub callback: %.s",
    //msg_data->topicName->lenstring.len,
    //msg_data->topicName->lenstring.data,
    msg_data->message->payloadlen, (char * )msg_data->message->payload);
    parse_msg(msg_data->message->payloadlen, (char ) msg_data->message->payload); // 解析收到的数据
    }
    /
  • @brief MQTT 默认的订阅回调函数
  • @param c 客户端标识
  • @param msg_data 收到的数据
  • @return 无
    */
    static void infineon_mqtt_sub_default_callback(MQTTClient *c, MessageData *msg_data)
    {
    *((char *) msg_data->message->payload + msg_data->message->payloadlen) = '�';
    LOG_D("mqtt sub default callback: %.s %.s", msg_data->topicName->lenstring.len,
    msg_data->topicName->lenstring.data, msg_data->message->payloadlen, (char * )msg_data->message->payload);
    }
    /
  • @brief MQTT 连接的回调函数
  • @param c 客户端标识
  • @return 无
    /
    static void infineon_mqtt_connect_callback(MQTTClient c)
    {
    LOG_D("enter mqtt_connect_callback!");
    }
    /

    @brief MQTT 上线的回调函数
    @param c 客户端标识
    @return 无
    /
    static void infineon_mqtt_online_callback(MQTTClient c)
    {
    LOG_D("enter mqtt_online_callback!");
    }
    /

    @brief MQTT 掉线的回调函数
    @param c 客户端标识
    @return 无
    /
    static void infineon_mqtt_offline_callback(MQTTClient c)
    {
    LOG_D("enter mqtt_offline_callback!");
    }
    /
  • @brief MQTT 启动
  • @param 无
  • @return 成功返回0,失败返回-1
    /
    int infineon_mqtt_start(void)
    {
    /
    init condata param by using MQTTPacket_connectData_initializer /
    MQTTPacket_connectData condata = MQTTPacket_connectData_initializer;
    static char cid[20] = { 0 };
    if (is_started)
    {
    LOG_E("mqtt client is already connected.");
    return -1;
    }
    /
    config MQTT context param /
    {
    client.isconnected = 0;
    client.uri = MQTT_URI;
    /
    generate the random client ID /
    rt_snprintf(cid, sizeof(cid), "rtthread%d", rt_tick_get());
    /
    config connect param /
    memcpy(&client.condata, &condata, sizeof(condata));
    client.condata.clientID.cstring = MQTT_CLIENT_ID;
    client.condata.keepAliveInterval = 30;
    client.condata.cleansession = 1;
    client.condata.username.cstring = MQTT_USERNAME;
    client.condata.password.cstring = MQTT_PASSWORD;
    /
    config MQTT will param. /
    client.condata.willFlag = 1;
    client.condata.will.qos = 1;
    client.condata.will.retained = 0;
    client.condata.will.topicName.cstring = MQTT_PUBTOPIC;
    client.condata.will.message.cstring = MQTT_WILLMSG;
    /
    malloc buffer. /
    client.buf_size = client.readbuf_size = 1024;
    client.buf = rt_calloc(1, client.buf_size);
    client.readbuf = rt_calloc(1, client.readbuf_size);
    if (!(client.buf && client.readbuf))
    {
    LOG_E("no memory for MQTT client buffer!");
    return -1;
    }
    /
    set event callback function /
    client.connect_callback = infineon_mqtt_connect_callback;
    client.online_callback = infineon_mqtt_online_callback;
    client.offline_callback = infineon_mqtt_offline_callback;
    /
    set subscribe table and event callback /
    client.messageHandlers[0].topicFilter = rt_strdup(MQTT_SUBTOPIC);
    client.messageHandlers[0].callback = infineon_mqtt_sub_callback;
    client.messageHandlers[0].qos = QOS1;
    /
    set default subscribe event callback /
    client.defaultMessageHandler = infineon_mqtt_sub_default_callback;
    }
    /
    run mqtt client /
    paho_mqtt_start(&client);
    is_started = 1;
    return 0;
    }
    /
    *
    @brief MQTT 停止
    @param 无
    @return 成功返回0,失败返回-1
    /
    int infineon_mqtt_stop(void)
    {
    if (is_started == 1)
    {
    is_started = 0;
    return paho_mqtt_stop(&client);
    }
    }
    /
    *
    @brief MQTT 发布消息
    @param send_buff 要发布的消息的内容
    @return 成功返回0,失败返回-1
    /
    int infineon_mqtt_publish(char send_buff)
    {
    if (is_started == 0)
    {
    LOG_E("mqtt client is not connected.");
    return -1;
    }
    paho_mqtt_publish(&client, QOS1, MQTT_PUBTOPIC, send_buff);
    return 0;
    }
    /

    @brief MQTT 新订阅的回调函数
    @param client 客户端标识
    @param msg_data 收到的数据
    @return 无
    */
    void infineon_mqtt_new_sub_callback(MQTTClient *client, MessageData *msg_data)
    {
    *((char *) msg_data->message->payload + msg_data->message->payloadlen) = '�';
    LOG_D("mqtt new subscribe callback: %.s %.s", msg_data->topicName->lenstring.len,
    msg_data->topicName->lenstring.data, msg_data->message->payloadlen, (char * )msg_data->message->payload);
    }
    /

    @brief MQTT 订阅
    @param topic 要订阅的主题的名字
    @return 成功返回0,失败返回-1
    /
    int infineon_mqtt_subscribe(char topic)
    {
    if (is_started == 0)
    {
    LOG_E("mqtt client is not connected.");
    return -1;
    }
    return paho_mqtt_subscribe(&client, QOS1, topic, infineon_mqtt_new_sub_callback);
    }
    /

    @brief MQTT 取消订阅
    @param topic 要取消订阅的主题的名字
    @return 成功返回0,失败返回-1
    */
    int infineon_mqtt_unsubscribe(char topic)
    {
    if (is_started == 0)
    {
    LOG_E("mqtt client is not connected.");
    return -1;
    }
    return paho_mqtt_unsubscribe(&client, topic);
    }
    /

    json数据格式
    {
"method":"report",          // report 表示设备属性上报
"clientToken":"123",        // 用于上下行消息配对标识
"timestamp":1628646783,     // 属性上报的时间,格式为 UNIX 系统时间戳,不填写该字段表示默认为当前系统时间。单位为毫秒
"params":{                  // JSON 结构内为设备上报的属性值
  • "led":1,
    
"fan":1
  • 
    

}


}
/
/
*
@brief MQTT 处理线程
@param parameter 线程的入参
@return 无
*/
void mqtt_thread_entry(void *parameter)
{
while (1)
{
if (get_esp8266_link_status() == 0) // 等到 ESP8266 连接成功后才能连接腾讯云
{
break;
}
else
{
rt_thread_mdelay(1000);
}
}
infineon_mqtt_start(); // 启动mqtt,连接服务器
cJSON *root = NULL;
cJSON params = NULL;
char send_str = NULL;
while (1)
{
rt_thread_mdelay(5000); // publish 间隔
root = cJSON_CreateObject(); /
创建一个cJSON对象,要用 cJSON_Delete 释放内存 /
if (root != NULL)
{
cJSON_AddStringToObject(root, "method", "report");
cJSON_AddStringToObject(root, "clientToken", "123");
params = cJSON_CreateObject(); /
创建子对象 /
if (params != NULL)
{
cJSON_AddItemToObject(root, "params", params);
cJSON_AddNumberToObject(params, "led", get_led_status()); // 添加 LED 状态
cJSON_AddNumberToObject(params, "fan", get_fan_status()); // 风扇状态
send_str = cJSON_Print(root);
if (send_str != NULL)
{
LOG_D("send msg: %sn", send_str);
infineon_mqtt_publish(send_str);
}
}
}
if (send_str != NULL) // 释放空间
{
cJSON_free(send_str);
send_str = NULL;
}
if (root != NULL)
{
cJSON_Delete(root); // 防止内存泄露,会把下面所有的子节点都释放
}
}
}
/

@brief 启动 MQTT 处理线程
@param 无
@return 无
/
int start_mqtt_thread(void)
{
/
创建 MTQTT 处理线程 */
rt_thread_t thread = rt_thread_create("mqtt_thread", mqtt_thread_entry, RT_NULL, 2048, 10, 20);
if (thread != RT_NULL)
{
rt_thread_startup(thread); // 创建成功则启动线程
}
else
{
LOG_E("create mqtt thread failed");
return (-RT_ERROR);
}
return RT_EOK;
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人机交互
    +关注

    关注

    12

    文章

    1132

    浏览量

    54760
  • 物联网
    +关注

    关注

    2870

    文章

    41632

    浏览量

    358391
  • Cortex-M4F
    +关注

    关注

    0

    文章

    9

    浏览量

    7579
  • RT-Thread
    +关注

    关注

    31

    文章

    1149

    浏览量

    38892
  • ESP8266
    +关注

    关注

    50

    文章

    947

    浏览量

    43948
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4420次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    [联网毕设]RT-Thread项目教程——智能浇花系统 - 7-7yl-69简介#RT-Thread

    联网RT-Thread
    RT-ThreadIoTOS
    发布于 :2022年08月17日 14:47:42

    RT-Thread (嵌入式实时操作系统)简介

    优越之处。RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。经过近 12 个年头的沉淀,伴随着联网的兴起,它正演变成一个功能强大、组件丰富的
    发表于 05-14 09:56

    联网系列 STM32 + RT-thread 教程 精选资料分享

    进行信息交换和通信,以实现智能化识别、定位、跟踪、监管等功能。我们看下目前的联网工程师的薪资状态:开源了联网系列 STM32 + RT-thre
    发表于 08-03 06:39

    RT-Thread内核简介

    RT-Thread 内核简介前言1、RT-Thread 的架构2、RT-Thread 的内核3、RT-Thread 内核功能部分线程调度时钟
    发表于 08-06 07:44

    RT-Thread的线程简介

    文章目录RT-Thread的线程简介源码分析初始化线程线程脱离启动线程挂起线程线程睡眠线程让出测试参考资料:RTT官网文档关键字:分析RT-Thread源码、stm32、RTOS、线程管理器
    发表于 08-24 07:56

    【原创精选】RT-Thread征文精选技术文章合集

    基于RT-Thread操作系统软件框架设计思路RTthread线程启动详解RTthread线程调度详解NO5 专栏作者 :极速紫韵
    发表于 07-26 14:56

    RT-Thread开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-Inside的开发板——iBox物
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b>开发,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    RT-thread】如何将RT-thread系统移植到stm32

    1.RT-thread简介T-Thread(Real Time-Thread),是一个嵌入式实时多线程操作系统。在 RT-Thread 系统
    发表于 12-08 11:06 20次下载
    【<b class='flag-5'>RT-thread</b>】如何将<b class='flag-5'>RT-thread</b>系统移植到stm32

    Github RTOS榜单star榜第一:国产开源RT-Thread联网操作系统简介

    RT-Thread 简介作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它...
    发表于 02-07 11:51 0次下载
    Github RTOS榜单star榜第一:国产开源<b class='flag-5'>RT-Thread</b>物<b class='flag-5'>联网</b>操作系统<b class='flag-5'>简介</b>

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型
    的头像 发表于 07-09 11:27 4000次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    基于Infineon开发板实现RT-Thread联网DEMO

    这是一个基于 CY8CPROTO-062-4343W 开发板 + RT-Thread 实现的物联网 DEMO
    的头像 发表于 11-03 09:46 836次阅读

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> <b class='flag-5'>简介</b>

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    怎么设计一种基于RT-Threadinfineon开发板的智能家居系统?

    本次设计基于RT-Threadinfineon PSoC™ 62 with CAPSENSE™ evaluation kit开发板,实现了一个简易的智能家居系统。
    发表于 07-22 14:56 366次阅读
    怎么设计一种基于<b class='flag-5'>RT-Thread</b>和<b class='flag-5'>infineon</b>开发板的智能家居系统?