衡阳派盒市场营销有限公司

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

    文章

    1217

    瀏覽量

    55531
  • 物聯網
    +關注

    關注

    2913

    文章

    44923

    瀏覽量

    377006
  • Cortex-M4F
    +關注

    關注

    0

    文章

    9

    瀏覽量

    7659
  • RT-Thread
    +關注

    關注

    31

    文章

    1305

    瀏覽量

    40386
  • ESP8266
    +關注

    關注

    50

    文章

    962

    瀏覽量

    45328
收藏 人收藏

    評論

    相關推薦

    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開發組(2015-03-31)。RT-Thread做為國內有較大影響力的開源實時操作系統,本文是RT-Thread實時操作系統的編程指南
    發表于 11-26 16:06 ?0次下載

    RT-Thread開發,如何有效學習RT-Thread的五個步驟

    RT-Thread推出RT-Thread Inside戰略開放RT-Thread開發平臺授權合作,與硬件十萬個為什么合作首次推出第一款RT-Inside的開發板——iBox
    的頭像 發表于 09-25 09:55 ?3.5w次閱讀
    <b class='flag-5'>RT-Thread</b>開發,如何有效學習<b class='flag-5'>RT-Thread</b>的五個步驟

    RT-Thread資深開發者朱天龍正式加盟RT-Thread

    新年伊始,中國自主聯網操作系統廠商RT-Thread迎來一位聯網行業的技術大咖!
    發表于 01-10 09:08 ?9809次閱讀

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運行于RT-Thread聯網操作系統平臺上,面向不同應用領域的通用軟件組件 。RT-Thread 同時提供了開放
    的頭像 發表于 05-21 11:29 ?1.1w次閱讀
    <b class='flag-5'>RT-Thread</b>軟件包定義和使用

    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>操作系統<b class='flag-5'>簡介</b>

    RT-Thread學習筆記 RT-Thread的架構概述

    的種種優越之處。RT-Thread 是一款完全由國內團隊開發維護的嵌入式實時操作系統(RTOS),具有完全的自主知識產權。經過 16 個年頭的沉淀,伴隨著聯網的興起,它正演變成一個功能強大、組件豐富的
    的頭像 發表于 07-09 11:27 ?4610次閱讀
    <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 ?1239次閱讀

    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 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    報名RT-Thread x Infineon創意創客大賽,體驗英飛凌新款開發板!

    的科技型競賽活動,旨在充分挖掘和培養開發者的創新能力和工程實踐素質,提高針對實際問題進行設計制作的能力,對聯網操作系統 RT-Thread 和嵌入式應用系統的理解和設計能力。同時,本次大賽也為工程師
    的頭像 發表于 04-03 22:10 ?671次閱讀

    基于RT-Thread Studio學習

    前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
    的頭像 發表于 05-15 11:00 ?4123次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學習

    怎么設計一種基于RT-Threadinfineon開發板的智能家居系統?

    本次設計基于RT-Threadinfineon PSoC? 62 with CAPSENSE? evaluation kit開發板,實現了一個簡易的智能家居系統。
    發表于 07-22 14:56 ?519次閱讀
    怎么設計一種基于<b class='flag-5'>RT-Thread</b>和<b class='flag-5'>infineon</b>開發板的智能家居系統?
    澳门新世纪娱乐城| 百家乐官网筹码托盘| 百家乐官网推锅| 灌南县| 哪个百家乐官网玩法平台信誉好 | 百家乐技术辅助软件| 百家乐连开6把小| 至尊百家乐官网娱乐网| 全景网百家乐官网的玩法技巧和规则| 阜城县| 百家乐霸王闲| 任我赢百家乐官网自动投注分析系统 | 百家乐官网有免费玩| 皇冠网最新网址| 网上百家乐官网合法吗| 百家乐官网槛| 百家乐发牌靴发牌盒| 百家乐官网打大必赢之法| 博彩百家乐官网字谜总汇二丹东| 志丹县| 新锦江百家乐官网娱乐| 澳门百家乐官网娱乐城网址| 宝都棋牌下载| 威尼斯人娱乐城线上博彩| 娱乐城开户送彩金| 盐亭县| 百家乐扑克牌耙| 大发888bjl| 百家乐官网的寻龙定穴| 百家乐官网又称为什么| 永利高娱乐| 现金百家乐| 三公百家乐官网在线哪里可以| 驻马店市| 视频百家乐平台出租| 大发888娱乐场 注册| 钱百家乐官网取胜三步曲| 百家乐薯片| 威尼斯人娱乐城真人游戏| 百家乐官网赌场现金网| 高档百家乐官网桌子|