欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于RT-Thread和Infineon的物聯(lián)網(wǎng)demo設(shè)計(jì)簡(jiǎn)介

冬至子 ? 來(lái)源:crystal266 ? 作者:crystal266 ? 2023-11-21 16:51 ? 次閱讀

1 開(kāi)發(fā)板介紹

該開(kāi)發(fā)板的主控芯片型號(hào)為CY8C624A,是一個(gè)具有 Cortex-M4F 和 Cortex-M0+ 的 雙核CPU,該主控芯片的功能框圖如下所示:

1.jpg

開(kāi)發(fā)板兩側(cè)留有供調(diào)試和外接其他模塊的排針接口,如下圖所示。從圖中可以看出預(yù)留出了串口、IIC、SPI、ADC和PWM等常見(jiàn)的外設(shè)和總線接口。

1.jpg

2 設(shè)計(jì)簡(jiǎn)介

2.1 功能簡(jiǎn)介

本次設(shè)計(jì)基于 RT-Thread 物聯(lián)網(wǎng)操作系統(tǒng)和 Infineon 開(kāi)發(fā)板,使用 RT-Studio 作為開(kāi)發(fā)工具,使用 ESP8266-WIFI 模塊作為物聯(lián)網(wǎng)的通訊介質(zhì),使用騰訊云服務(wù)器作為MQTT服務(wù)器,使用騰訊連連作為人機(jī)交互端,整體的功能框圖如下所示:

1.jpg

2.2 ESP8266 簡(jiǎn)介

本次使用的 ESP8266 模塊如下圖所示,ESP8266 是一款強(qiáng)大的 WIFI 模塊,支持 AT 指令開(kāi)發(fā),SDK 開(kāi)發(fā)、Lua 開(kāi)發(fā)、Arduino 開(kāi)發(fā)、Lua 開(kāi)發(fā)等開(kāi)發(fā)方式,本次為了方便和主控板通訊采用 AT 指令的方式進(jìn)行開(kāi)發(fā)。

3 開(kāi)發(fā)步驟

本次開(kāi)發(fā)使用 AT 組件和 MQTT 通訊協(xié)議進(jìn)行設(shè)備和服務(wù)器之間的通訊,所以需要在配置中配置相應(yīng)的組件。

3.1 AT 組件

RT-Thread 官方支持了豐富的 AT 設(shè)備,本次所用的 ESP8266 模塊的配置如下所示,需要開(kāi)啟相應(yīng)的組件并配置路由的信息和AT設(shè)備的串口。

1.jpg

3.2 MQTT 組件

RT-Thread 官方支持了多種 MQTT 組件,本次使用 PahoMQTT 組件進(jìn)行開(kāi)發(fā),配置如下所示:

1.jpg

3.3 CJson 組件

為了方便和騰訊云服務(wù)器進(jìn)行通訊,在設(shè)計(jì)通訊格式時(shí)采用物模型的方式進(jìn)行通訊,需要用到 Json 數(shù)據(jù)格式,在嵌入式設(shè)備中通常使用 CJSOn 庫(kù)對(duì) Json 數(shù)據(jù)進(jìn)行解析,CJson 的配置如下:

1.jpg

配制好的組件如下圖所示:

1.jpg

3.4 騰訊云服務(wù)器的配置

騰訊云物聯(lián)網(wǎng)開(kāi)發(fā)平臺(tái)作為本項(xiàng)目的云平臺(tái)進(jìn)行數(shù)據(jù)的轉(zhuǎn)發(fā)。

1.jpg

4 關(guān)鍵代碼編寫(xiě)

MQTT任務(wù)的代碼如下,主要寫(xiě)了登錄,退出,發(fā)布消息的代碼,訂閱回調(diào)函數(shù)。

#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 訂閱回調(diào)函數(shù)
  • @param c 客戶(hù)端標(biāo)識(shí)
  • @param msg_data 收到的數(shù)據(jù)
  • @return 無(wú)
    */
    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); // 解析收到的數(shù)據(jù)
    }
    /
  • @brief MQTT 默認(rèn)的訂閱回調(diào)函數(shù)
  • @param c 客戶(hù)端標(biāo)識(shí)
  • @param msg_data 收到的數(shù)據(jù)
  • @return 無(wú)
    */
    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 連接的回調(diào)函數(shù)
  • @param c 客戶(hù)端標(biāo)識(shí)
  • @return 無(wú)
    /
    static void infineon_mqtt_connect_callback(MQTTClient c)
    {
    LOG_D("enter mqtt_connect_callback!");
    }
    /

    @brief MQTT 上線的回調(diào)函數(shù)
    @param c 客戶(hù)端標(biāo)識(shí)
    @return 無(wú)
    /
    static void infineon_mqtt_online_callback(MQTTClient c)
    {
    LOG_D("enter mqtt_online_callback!");
    }
    /

    @brief MQTT 掉線的回調(diào)函數(shù)
    @param c 客戶(hù)端標(biāo)識(shí)
    @return 無(wú)
    /
    static void infineon_mqtt_offline_callback(MQTTClient c)
    {
    LOG_D("enter mqtt_offline_callback!");
    }
    /
  • @brief MQTT 啟動(dòng)
  • @param 無(wú)
  • @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 無(wú)
    @return 成功返回0,失敗返回-1
    /
    int infineon_mqtt_stop(void)
    {
    if (is_started == 1)
    {
    is_started = 0;
    return paho_mqtt_stop(&client);
    }
    }
    /
    *
    @brief MQTT 發(fā)布消息
    @param send_buff 要發(fā)布的消息的內(nèi)容
    @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 新訂閱的回調(diào)函數(shù)
    @param client 客戶(hù)端標(biāo)識(shí)
    @param msg_data 收到的數(shù)據(jù)
    @return 無(wú)
    */
    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數(shù)據(jù)格式
    {
"method":"report",          // report 表示設(shè)備屬性上報(bào)
"clientToken":"123",        // 用于上下行消息配對(duì)標(biāo)識(shí)
"timestamp":1628646783,     // 屬性上報(bào)的時(shí)間,格式為 UNIX 系統(tǒng)時(shí)間戳,不填寫(xiě)該字段表示默認(rèn)為當(dāng)前系統(tǒng)時(shí)間。單位為毫秒
"params":{                  // JSON 結(jié)構(gòu)內(nèi)為設(shè)備上報(bào)的屬性值
  • "led":1,
    
"fan":1
  • 
    

}


}
/
/
*
@brief MQTT 處理線程
@param parameter 線程的入?yún)?br /> @return 無(wú)
*/
void mqtt_thread_entry(void *parameter)
{
while (1)
{
if (get_esp8266_link_status() == 0) // 等到 ESP8266 連接成功后才能連接騰訊云
{
break;
}
else
{
rt_thread_mdelay(1000);
}
}
infineon_mqtt_start(); // 啟動(dòng)mqtt,連接服務(wù)器
cJSON *root = NULL;
cJSON params = NULL;
char send_str = NULL;
while (1)
{
rt_thread_mdelay(5000); // publish 間隔
root = cJSON_CreateObject(); /
創(chuàng)建一個(gè)cJSON對(duì)象,要用 cJSON_Delete 釋放內(nèi)存 /
if (root != NULL)
{
cJSON_AddStringToObject(root, "method", "report");
cJSON_AddStringToObject(root, "clientToken", "123");
params = cJSON_CreateObject(); /
創(chuàng)建子對(duì)象 /
if (params != NULL)
{
cJSON_AddItemToObject(root, "params", params);
cJSON_AddNumberToObject(params, "led", get_led_status()); // 添加 LED 狀態(tài)
cJSON_AddNumberToObject(params, "fan", get_fan_status()); // 風(fēng)扇狀態(tài)
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); // 防止內(nèi)存泄露,會(huì)把下面所有的子節(jié)點(diǎn)都釋放
}
}
}
/

@brief 啟動(dòng) MQTT 處理線程
@param 無(wú)
@return 無(wú)
/
int start_mqtt_thread(void)
{
/
創(chuàng)建 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); // 創(chuàng)建成功則啟動(dòng)線程
}
else
{
LOG_E("create mqtt thread failed");
return (-RT_ERROR);
}
return RT_EOK;
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 人機(jī)交互
    +關(guān)注

    關(guān)注

    12

    文章

    1217

    瀏覽量

    55563
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2914

    文章

    44977

    瀏覽量

    377452
  • Cortex-M4F
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    7661
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1306

    瀏覽量

    40426
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    962

    瀏覽量

    45369
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread內(nèi)核簡(jiǎn)介

    RT-Thread 內(nèi)核簡(jiǎn)介前言1、RT-Thread 的架構(gòu)2、RT-Thread 的內(nèi)核3、RT-Thread 內(nèi)核功能部分線程調(diào)度時(shí)鐘
    發(fā)表于 08-06 07:44

    RT-Thread的線程簡(jiǎn)介

    文章目錄RT-Thread的線程簡(jiǎn)介源碼分析初始化線程線程脫離啟動(dòng)線程掛起線程線程睡眠線程讓出測(cè)試參考資料:RTT官網(wǎng)文檔關(guān)鍵字:分析RT-Thread源碼、stm32、RTOS、線程管理器
    發(fā)表于 08-24 07:56

    【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集

    基于RT-Thread操作系統(tǒng)軟件框架設(shè)計(jì)思路RTthread線程啟動(dòng)詳解RTthread線程調(diào)度詳解NO5 專(zhuān)欄作者 :極速紫韻
    發(fā)表于 07-26 14:56

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開(kāi)發(fā)組(2015-03-31)。RT-Thread做為國(guó)內(nèi)有較大影響力的開(kāi)源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread開(kāi)發(fā),如何有效學(xué)習(xí)RT-Thread的五個(gè)步驟

    RT-Thread推出RT-Thread Inside戰(zhàn)略開(kāi)放RT-Thread開(kāi)發(fā)平臺(tái)授權(quán)合作,與硬件十萬(wàn)個(gè)為什么合作首次推出第一款RT-Inside的開(kāi)發(fā)板——iBox
    的頭像 發(fā)表于 09-25 09:55 ?3.5w次閱讀
    <b class='flag-5'>RT-Thread</b>開(kāi)發(fā),如何有效學(xué)習(xí)<b class='flag-5'>RT-Thread</b>的五個(gè)步驟

    RT-Thread資深開(kāi)發(fā)者朱天龍正式加盟RT-Thread

    新年伊始,中國(guó)自主聯(lián)網(wǎng)操作系統(tǒng)廠商RT-Thread迎來(lái)一位聯(lián)網(wǎng)行業(yè)的技術(shù)大咖!
    發(fā)表于 01-10 09:08 ?9815次閱讀

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運(yùn)行于RT-Thread聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)上,面向不同應(yīng)用領(lǐng)域的通用軟件組件 。RT-Thread 同時(shí)提供了開(kāi)放
    的頭像 發(fā)表于 05-21 11:29 ?1.1w次閱讀
    <b class='flag-5'>RT-Thread</b>軟件包定義和使用

    Github RTOS榜單star榜第一:國(guó)產(chǎn)開(kāi)源RT-Thread聯(lián)網(wǎng)操作系統(tǒng)簡(jiǎn)介

    RT-Thread 簡(jiǎn)介作為一名 RTOS 的初學(xué)者,也許你對(duì) RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會(huì)逐漸發(fā)現(xiàn) RT-Thread 的魅力和它...
    發(fā)表于 02-07 11:51 ?0次下載
    Github RTOS榜單star榜第一:國(guó)產(chǎn)開(kāi)源<b class='flag-5'>RT-Thread</b><b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>操作系統(tǒng)<b class='flag-5'>簡(jiǎn)介</b>

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    的種種優(yōu)越之處。RT-Thread 是一款完全由國(guó)內(nèi)團(tuán)隊(duì)開(kāi)發(fā)維護(hù)的嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS),具有完全的自主知識(shí)產(chǎn)權(quán)。經(jīng)過(guò) 16 個(gè)年頭的沉淀,伴隨著聯(lián)網(wǎng)的興起,它正演變成一個(gè)功能強(qiáng)大、組件豐富的
    的頭像 發(fā)表于 07-09 11:27 ?4622次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    基于Infineon開(kāi)發(fā)板實(shí)現(xiàn)RT-Thread聯(lián)網(wǎng)DEMO

    這是一個(gè)基于 CY8CPROTO-062-4343W 開(kāi)發(fā)板 + RT-Thread 實(shí)現(xiàn)的聯(lián)網(wǎng) DEMO
    的頭像 發(fā)表于 11-03 09:46 ?1243次閱讀

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

    RT-Thread文檔_RT-Thread 簡(jiǎn)介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> <b class='flag-5'>簡(jiǎn)介</b>

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    報(bào)名RT-Thread x Infineon創(chuàng)意創(chuàng)客大賽,體驗(yàn)英飛凌新款開(kāi)發(fā)板!

    的科技型競(jìng)賽活動(dòng),旨在充分挖掘和培養(yǎng)開(kāi)發(fā)者的創(chuàng)新能力和工程實(shí)踐素質(zhì),提高針對(duì)實(shí)際問(wèn)題進(jìn)行設(shè)計(jì)制作的能力,對(duì)聯(lián)網(wǎng)操作系統(tǒng) RT-Thread 和嵌入式應(yīng)用系統(tǒng)的理解和設(shè)計(jì)能力。同時(shí),本次大賽也為工程師
    的頭像 發(fā)表于 04-03 22:10 ?675次閱讀

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個(gè)賬號(hào)登陸,開(kāi)啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?4162次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

    怎么設(shè)計(jì)一種基于RT-Threadinfineon開(kāi)發(fā)板的智能家居系統(tǒng)?

    本次設(shè)計(jì)基于RT-Threadinfineon PSoC? 62 with CAPSENSE? evaluation kit開(kāi)發(fā)板,實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的智能家居系統(tǒng)。
    發(fā)表于 07-22 14:56 ?523次閱讀
    怎么設(shè)計(jì)一種基于<b class='flag-5'>RT-Thread</b>和<b class='flag-5'>infineon</b>開(kāi)發(fā)板的智能家居系統(tǒng)?