|
基礎(chǔ)stm32+ESP8266+OneNET移動云平臺+濕度的自動澆花系統(tǒng),在大學(xué)里面做的,突然逛下論壇發(fā)一發(fā)!
制作出來的實(shí)物圖如下:
6ED50C41CCCFD81A17FB9FED4567A35F.png (385.31 KB, 下載次數(shù): 51)
下載附件
2022-5-12 17:14 上傳
P1T(RR6]YH[07SDOUH64@9G.png (46.75 KB, 下載次數(shù): 50)
下載附件
2022-5-12 17:14 上傳
單片機(jī)源程序如下:
- #include "main.h"
- #include "ds18b20.h"
- #include "dht11.h"
- #include "beep.h"
- int main()
- {
-
- u16 timeCount = 0; //發(fā)送間隔變量
- u8 *dataPtr = NULL;
- // u8 data[10]={0x12,0x23,0x45,0x68,0x79,0xAB,0x00,0xEF};
- u8 buf[256];
- u8 t[4] = {12,34,56};
- LED0 = 1;
- LED1 = 1;
- Stm32_Clock_Init(9); //系統(tǒng)時(shí)鐘設(shè)置
- uart_init(72,9600); //串口初始化為9600
- delay_init(72); //延時(shí)初始化
- LED_Init(); //初始化與LED連接的硬件接口
- DHT11_Init();
- BEEP_Init();
- // DS18B20_Init();
- ESP8266_Init(); //初始化ESP8266
- while(OneNET_DevLink()) //接入OneNET
- delay_ms(100);
-
- while(1)
- {
- dataPtr = ESP8266_GetIPD(0);
- if(dataPtr != NULL)
- OneNET_RevPro(dataPtr);
-
- if(++timeCount >= 1000) //發(fā)送間隔5s
- {
- printf( "OneNET_SendData\r\n");
- OneNET_SendData(buf,5,t,4); //發(fā)送數(shù)據(jù)
-
- timeCount = 0;
- ESP8266_ClearBuff();
- }
-
-
- delay_ms(10);
-
- }
- }
復(fù)制代碼
1.具體使用方法可參考:sample.c
SDK使用的三種類型:
1.組包-發(fā)送-刪包
只需要調(diào)用接口函數(shù)封裝一包數(shù)據(jù),成發(fā)送即可。
2.組包-發(fā)送-等待平臺返回-刪包
連接平臺和心跳請求需要等待平臺的返回結(jié)果。
3.數(shù)據(jù)點(diǎn)上傳
數(shù)據(jù)點(diǎn)上傳分5步:1.獲取json格式數(shù)據(jù)流長度
2.根據(jù)長度封裝協(xié)議頭
3.封裝一包數(shù)據(jù)
4.發(fā)送數(shù)據(jù)
5.釋放內(nèi)存
內(nèi)存方案的三種方式
1.動態(tài)分配
只需要聲明 EDP_PACKET_STRUCTURE edpPacket = {NULL, 0, 0, 0};
然后調(diào)用組包函數(shù)即可。
2.全局?jǐn)?shù)
聲明一個(gè)全局?jǐn)?shù)組,如 unsigned char dataMem[128]
然后再調(diào)用組包函數(shù)之前
edpPacket._data = dataMem;
edpPacket._len = sizeof(dataMem);
即可。
3.局部數(shù)組
方式同2,數(shù)組為局部變量。
- //協(xié)議頭文件
- #include "mqttkit.h"
- //==========================================================
- // 函數(shù)名稱: EDP_NewBuffer
- // 函數(shù)功能: 申請內(nèi)存
- // 入口參數(shù): edpPacket:包結(jié)構(gòu)體
- // size:大小
- // 返回參數(shù): 無
- // 說明: 1.可使用動態(tài)分配來分配內(nèi)存
- // 2.可使用局部或全局?jǐn)?shù)組來指定內(nèi)存
- //==========================================================
- void MQTT_NewBuffer(MQTT_PACKET_STRUCTURE *mqttPacket, uint32 size)
- {
-
- uint32 i = 0;
- if(mqttPacket->_data == NULL)
- {
- mqttPacket->_memFlag = MEM_FLAG_ALLOC;
-
- mqttPacket->_data = (uint8 *)MQTT_MallocBuffer(size);
- if(mqttPacket->_data != NULL)
- {
- mqttPacket->_len = 0;
-
- mqttPacket->_size = size;
-
- for(; i < mqttPacket->_size; i++)
- mqttPacket->_data[i] = 0;
- }
- }
- else
- {
- mqttPacket->_memFlag = MEM_FLAG_STATIC;
-
- for(; i < mqttPacket->_size; i++)
- mqttPacket->_data[i] = 0;
-
- mqttPacket->_len = 0;
-
- if(mqttPacket->_size < size)
- mqttPacket->_data = NULL;
- }
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_DeleteBuffer
- // 函數(shù)功能: 釋放數(shù)據(jù)內(nèi)存
- // 入口參數(shù): edpPacket:包結(jié)構(gòu)體
- // 返回參數(shù): 無
- // 說明:
- //==========================================================
- void MQTT_DeleteBuffer(MQTT_PACKET_STRUCTURE *mqttPacket)
- {
- if(mqttPacket->_memFlag == MEM_FLAG_ALLOC)
- MQTT_FreeBuffer(mqttPacket->_data);
-
- mqttPacket->_data = NULL;
- mqttPacket->_len = 0;
- mqttPacket->_size = 0;
- mqttPacket->_memFlag = MEM_FLAG_NULL;
- }
- int32 MQTT_DumpLength(size_t len, uint8 *buf)
- {
-
- int32 i = 0;
-
- for(i = 1; i <= 4; ++i)
- {
- *buf = len % 128;
- len >>= 7;
- if(len > 0)
- {
- *buf |= 128;
- ++buf;
- }
- else
- {
- return i;
- }
- }
- return -1;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketConnect
- // 函數(shù)功能: 連接消息組包
- // 入口參數(shù): user:用戶名:產(chǎn)品ID
- // password:密碼:鑒權(quán)信息或apikey
- // devid:設(shè)備ID
- // cTime:連接保持時(shí)間
- // clean_session:離線消息清除標(biāo)志
- // qos:重發(fā)標(biāo)志
- // will_topic:異常離線topic
- // will_msg:異常離線消息
- // will_retain:消息推送標(biāo)志
- // mqttPacket:包指針
- // 返回參數(shù): 0-成功 其他-失敗
- //
- // 說明:
- //==========================================================
- uint8 MQTT_PacketConnect(const int8 *user, const int8 *password, const int8 *devid,
- uint16 cTime, uint1 clean_session, uint1 qos,
- const int8 *will_topic, const int8 *will_msg, int32 will_retain,
- MQTT_PACKET_STRUCTURE *mqttPacket)
- {
-
- uint8 flags = 0;
- uint8 will_topic_len = 0;
- uint16 total_len = 15;
- int16 len = 0, devid_len = strlen(devid);
-
- if(!devid)
- return 1;
-
- total_len += devid_len + 2;
-
- //斷線后,是否清理離線消息:1-清理 0-不清理--------------------------------------------
- if(clean_session)
- {
- flags |= MQTT_CONNECT_CLEAN_SESSION;
- }
-
- //異常掉線情況下,服務(wù)器發(fā)布的topic------------------------------------------------------
- if(will_topic)
- {
- flags |= MQTT_CONNECT_WILL_FLAG;
- will_topic_len = strlen(will_topic);
- total_len += 4 + will_topic_len + strlen(will_msg);
- }
-
- //qos級別--主要用于PUBLISH(發(fā)布態(tài))消息的,保證消息傳遞的次數(shù)-----------------------------
- switch((unsigned char)qos)
- {
- case MQTT_QOS_LEVEL0:
- flags |= MQTT_CONNECT_WILL_QOS0; //最多一次
- break;
-
- case MQTT_QOS_LEVEL1:
- flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_QOS1); //最少一次
- break;
-
- case MQTT_QOS_LEVEL2:
- flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_QOS2); //只有一次
- break;
-
- default:
- return 2;
- }
-
- //主要用于PUBLISH(發(fā)布態(tài))的消息,表示服務(wù)器要保留這次推送的信息,如果有新的訂閱者出現(xiàn),就把這消息推送給它。如果不設(shè)那么推送至當(dāng)前訂閱的就釋放了
- if(will_retain)
- {
- flags |= (MQTT_CONNECT_WILL_FLAG | MQTT_CONNECT_WILL_RETAIN);
- }
-
- //賬號為空 密碼為空---------------------------------------------------------------------
- if(!user || !password)
- {
- return 3;
- }
- flags |= MQTT_CONNECT_USER_NAME | MQTT_CONNECT_PASSORD;
-
- total_len += strlen(user) + strlen(password) + 4;
-
- //分配內(nèi)存-----------------------------------------------------------------------------
- MQTT_NewBuffer(mqttPacket, total_len);
- if(mqttPacket->_data == NULL)
- return 4;
-
- memset(mqttPacket->_data, 0, total_len);
-
- /*************************************固定頭部***********************************************/
-
- //固定頭部----------------------連接請求類型---------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_CONNECT << 4;
-
- //固定頭部----------------------剩余長度值-----------------------------------------------
- len = MQTT_DumpLength(total_len - 5, mqttPacket->_data + mqttPacket->_len);
- if(len < 0)
- {
- MQTT_DeleteBuffer(mqttPacket);
- return 5;
- }
- else
- mqttPacket->_len += len;
-
- /*************************************可變頭部***********************************************/
-
- //可變頭部----------------------協(xié)議名長度 和 協(xié)議名--------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = 0;
- mqttPacket->_data[mqttPacket->_len++] = 4;
- mqttPacket->_data[mqttPacket->_len++] = 'M';
- mqttPacket->_data[mqttPacket->_len++] = 'Q';
- mqttPacket->_data[mqttPacket->_len++] = 'T';
- mqttPacket->_data[mqttPacket->_len++] = 'T';
-
- //可變頭部----------------------protocol level 4-----------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = 4;
-
- //可變頭部----------------------連接標(biāo)志(該函數(shù)開頭處理的數(shù)據(jù))-----------------------------
- mqttPacket->_data[mqttPacket->_len++] = flags;
-
- //可變頭部----------------------保持連接的時(shí)間(秒)----------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(cTime);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(cTime);
-
- /*************************************消息體************************************************/
- //消息體----------------------------devid長度、devid-------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(devid_len);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(devid_len);
-
- strncat((int8 *)mqttPacket->_data + mqttPacket->_len, devid, devid_len);
- mqttPacket->_len += devid_len;
-
- //消息體----------------------------will_flag 和 will_msg---------------------------------
- if(flags & MQTT_CONNECT_WILL_FLAG)
- {
- unsigned short mLen = 0;
-
- if(!will_msg)
- will_msg = "";
-
- mLen = strlen(will_topic);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(mLen);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(mLen);
- strncat((int8 *)mqttPacket->_data + mqttPacket->_len, will_topic, mLen);
- mqttPacket->_len += mLen;
-
- mLen = strlen(will_msg);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(mLen);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(mLen);
- strncat((int8 *)mqttPacket->_data + mqttPacket->_len, will_msg, mLen);
- mqttPacket->_len += mLen;
- }
-
- //消息體----------------------------use---------------------------------------------------
- if(flags & MQTT_CONNECT_USER_NAME)
- {
- unsigned short user_len = strlen(user);
-
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(user_len);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(user_len);
- strncat((int8 *)mqttPacket->_data + mqttPacket->_len, user, user_len);
- mqttPacket->_len += user_len;
- }
- //消息體----------------------------password----------------------------------------------
- if(flags & MQTT_CONNECT_PASSORD)
- {
- unsigned short psw_len = strlen(password);
-
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(psw_len);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(psw_len);
- strncat((int8 *)mqttPacket->_data + mqttPacket->_len, password, psw_len);
- mqttPacket->_len += psw_len;
- }
- return 0;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketDisConnect
- // 函數(shù)功能: 斷開連接消息組包
- // 入口參數(shù): mqttPacket:包指針
- // 返回參數(shù): 0-成功 1-失敗
- // 說明:
- //==========================================================
- uint1 MQTT_PacketDisConnect(MQTT_PACKET_STRUCTURE *mqttPacket)
- {
- MQTT_NewBuffer(mqttPacket, 2);
- if(mqttPacket->_data == NULL)
- return 1;
-
- /*************************************固定頭部***********************************************/
-
- //固定頭部----------------------頭部消息-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_DISCONNECT << 4;
-
- //固定頭部----------------------剩余長度值-----------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = 0;
-
- return 1;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_UnPacketConnectAck
- // 函數(shù)功能: 連接消息解包
- // 入口參數(shù): rev_data:接收的數(shù)據(jù)
- // 返回參數(shù): 1、255-失敗 其他-平臺的返回碼
- // 說明:
- //==========================================================
- uint8 MQTT_UnPacketConnectAck(uint8 *rev_data)
- {
- if(rev_data[1] != 2)
- return 1;
-
- if(rev_data[2] == 0 || rev_data[2] == 1)
- return rev_data[3];
- else
- return 255;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketSaveData
- // 函數(shù)功能: 數(shù)據(jù)點(diǎn)上傳組包
- // 入口參數(shù): devid:設(shè)備ID(可為空)
- // send_buf:json緩存buf
- // send_len:json總長
- // type_bin_head:bin文件的消息頭
- // type:類型
- // 返回參數(shù): 0-成功 1-失敗
- // 說明:
- //==========================================================
- uint1 MQTT_PacketSaveData(const int8 *devid, int16 send_len, int8 *type_bin_head, uint8 type, MQTT_PACKET_STRUCTURE *mqttPacket)
- {
- if(type==5)//type=5,json類型的打包函數(shù)
- {
- if(MQTT_PacketPublish(MQTT_PUBLISH_ID, "$dp", NULL, send_len + 3, MQTT_QOS_LEVEL1, 0, 1, mqttPacket) == 0)
- {
- mqttPacket->_data[mqttPacket->_len++] = type; //類型
-
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(send_len);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(send_len);
-
- return 0;
- }
- else
- return 1;
- }
- if(type==2)//type=2,二進(jìn)制類型的打包函數(shù)
- {
- if(MQTT_PacketPublish(MQTT_PUBLISH_ID, "$dp", NULL, send_len, MQTT_QOS_LEVEL1, 0, 1, mqttPacket)==0)
- return 0;
- else
- return 1;
- }
- return 1;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_UnPacketCmd
- // 函數(shù)功能: 命令下發(fā)解包
- // 入口參數(shù): rev_data:接收的數(shù)據(jù)指針
- // cmdid:cmdid-uuid
- // req:命令
- // 返回參數(shù): 0-成功 其他-失敗原因
- // 說明:
- //==========================================================
- uint8 MQTT_UnPacketCmd(uint8 *rev_data, int8 **cmdid, int8 **req)
- {
- int8 *dataPtr = strchr((int8 *)rev_data + 3, '/'); //加3是跳過頭信息
-
- uint32 remain_len = 0;
- uint16 req_len = 0;
-
- if(dataPtr == NULL) //未找到'/'
- return 1;
- dataPtr++; //跳過'/'
-
- MQTT_ReadLength(rev_data + 1, 4, &remain_len); //讀取剩余字節(jié)
-
- *cmdid = (int8 *)MQTT_MallocBuffer(37); //cmdid固定36字節(jié),多分配一個(gè)結(jié)束符的位置
- if(*cmdid == NULL)
- return 2;
-
- memset(*cmdid, 0, 37); //全部清零
- memcpy(*cmdid, (const int8 *)dataPtr, 36); //復(fù)制cmdid
- dataPtr += 36;
-
- req_len = remain_len - 44; //命令長度 = 剩余長度(remain_len) - 2 - 5($creq) - 1(\) - cmdid長度
- *req = (int8 *)MQTT_MallocBuffer(req_len + 1); //分配命令長度+1
- if(*req == NULL)
- {
- MQTT_FreeBuffer(*cmdid);
- return 3;
- }
-
- memset(*req, 0, req_len + 1); //清零
- memcpy(*req, (const int8 *)dataPtr, req_len); //復(fù)制命令
-
- return 0;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketSubscribe
- // 函數(shù)功能: Subscribe消息組包
- // 入口參數(shù): pkt_id:pkt_id
- // qos:消息重發(fā)次數(shù)
- // topics:訂閱的消息
- // topics_cnt:訂閱的消息個(gè)數(shù)
- // mqttPacket:包指針
- // 返回參數(shù): 0-成功 其他-失敗
- // 說明:
- //==========================================================
- uint8 MQTT_PacketSubscribe(uint16 pkt_id, enum MqttQosLevel qos, const int8 *topics[], uint8 topics_cnt, MQTT_PACKET_STRUCTURE *mqttPacket)
- {
-
- uint32 topic_len = 0, remain_len = 0;
- int16 len = 0;
- uint8 i = 0;
-
- if(pkt_id == 0)
- return 1;
-
- //計(jì)算topic長度-------------------------------------------------------------------------
- for(; i < topics_cnt; i++)
- {
- if(topics[i] == NULL)
- return 2;
-
- topic_len += strlen(topics[i]);
- }
-
- //2 bytes packet id + topic filter(2 bytes topic + topic length + 1 byte reserve)------
- remain_len = 2 + 3 * topics_cnt + topic_len;
-
- //分配內(nèi)存------------------------------------------------------------------------------
- MQTT_NewBuffer(mqttPacket, remain_len + 5);
- if(mqttPacket->_data == NULL)
- return 3;
-
- /*************************************固定頭部***********************************************/
-
- //固定頭部----------------------頭部消息-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_SUBSCRIBE << 4 | 0x02;
-
- //固定頭部----------------------剩余長度值-----------------------------------------------
- len = MQTT_DumpLength(remain_len, mqttPacket->_data + mqttPacket->_len);
- if(len < 0)
- {
- MQTT_DeleteBuffer(mqttPacket);
- return 4;
- }
- else
- mqttPacket->_len += len;
-
- /*************************************payload***********************************************/
-
- //payload----------------------pkt_id---------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(pkt_id);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(pkt_id);
-
- //payload----------------------topic_name-----------------------------------------------
- for(i = 0; i < topics_cnt; i++)
- {
- topic_len = strlen(topics[i]);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_MSB(topic_len);
- mqttPacket->_data[mqttPacket->_len++] = MOSQ_LSB(topic_len);
-
- strncat((int8 *)mqttPacket->_data + mqttPacket->_len, topics[i], topic_len);
- mqttPacket->_len += topic_len;
-
- mqttPacket->_data[mqttPacket->_len++] = qos & 0xFF;
- }
- return 0;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_UnPacketSubscrebe
- // 函數(shù)功能: Subscribe的回復(fù)消息解包
- // 入口參數(shù): rev_data:接收到的信息
- // 返回參數(shù): 0-成功 其他-失敗
- // 說明:
- //==========================================================
- uint8 MQTT_UnPacketSubscribe(uint8 *rev_data)
- {
-
- uint8 result = 255;
- if(rev_data[2] == MOSQ_MSB(MQTT_SUBSCRIBE_ID) && rev_data[3] == MOSQ_LSB(MQTT_SUBSCRIBE_ID))
- {
- switch(rev_data[4])
- {
- case 0x00:
- case 0x01:
- case 0x02:
- //MQTT Subscribe OK
- result = 0;
- break;
-
- case 0x80:
- //MQTT Subscribe Failed
- result = 1;
- break;
-
- default:
- //MQTT Subscribe UnKnown Err
- result = 2;
- break;
- }
- }
-
- return result;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketPublishAck
- // 函數(shù)功能: Publish Ack消息組包
- // 入口參數(shù): pkt_id:packet id
- // mqttPacket:包指針
- // 返回參數(shù): 0-成功 1-失敗原因
- // 說明: 當(dāng)收到的Publish消息的QoS等級為1時(shí),需要Ack回復(fù)
- //==========================================================
- uint1 MQTT_PacketPublishAck(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
- {
- MQTT_NewBuffer(mqttPacket, 4);
- if(mqttPacket->_data == NULL)
- return 1;
-
- /*************************************固定頭部***********************************************/
-
- //固定頭部----------------------頭部消息-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBACK << 4;
-
- //固定頭部----------------------剩余長度-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = 2;
-
- /*************************************可變頭部***********************************************/
-
- //可變頭部----------------------pkt_id長度-----------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
- mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
-
- return 0;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_UnPacketPublishAck
- // 函數(shù)功能: Publish Ack消息解包
- // 入口參數(shù): rev_data:收到的數(shù)據(jù)
- // 返回參數(shù): 0-成功 1-失敗原因
- // 說明:
- //==========================================================
- uint1 MQTT_UnPacketPublishAck(uint8 *rev_data)
- {
- if(rev_data[1] != 2)
- return 1;
- if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
- return 0;
- else
- return 1;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketPublishRec
- // 函數(shù)功能: Publish Rec消息組包
- // 入口參數(shù): pkt_id:packet id
- // mqttPacket:包指針
- // 返回參數(shù): 0-成功 1-失敗原因
- // 說明: 當(dāng)收到的Publish消息的QoS等級為2時(shí),先收到rec
- //==========================================================
- uint1 MQTT_PacketPublishRec(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
- {
- MQTT_NewBuffer(mqttPacket, 4);
- if(mqttPacket->_data == NULL)
- return 1;
-
- /*************************************固定頭部***********************************************/
-
- //固定頭部----------------------頭部消息-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBREC << 4;
-
- //固定頭部----------------------剩余長度-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = 2;
-
- /*************************************可變頭部***********************************************/
-
- //可變頭部----------------------pkt_id長度-----------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
- mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
-
- return 0;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_UnPacketPublishRec
- // 函數(shù)功能: Publish Rec消息解包
- // 入口參數(shù): rev_data:接收到的數(shù)據(jù)
- // 返回參數(shù): 0-成功 1-失敗
- // 說明:
- //==========================================================
- uint1 MQTT_UnPacketPublishRec(uint8 *rev_data)
- {
- if(rev_data[1] != 2)
- return 1;
- if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
- return 0;
- else
- return 1;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketPublishRel
- // 函數(shù)功能: Publish Rel消息組包
- // 入口參數(shù): pkt_id:packet id
- // mqttPacket:包指針
- // 返回參數(shù): 0-成功 1-失敗原因
- // 說明: 當(dāng)收到的Publish消息的QoS等級為2時(shí),先收到rec,再回復(fù)rel
- //==========================================================
- uint1 MQTT_PacketPublishRel(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
- {
- MQTT_NewBuffer(mqttPacket, 4);
- if(mqttPacket->_data == NULL)
- return 1;
-
- /*************************************固定頭部***********************************************/
-
- //固定頭部----------------------頭部消息-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBREL << 4 | 0x02;
-
- //固定頭部----------------------剩余長度-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = 2;
-
- /*************************************可變頭部***********************************************/
-
- //可變頭部----------------------pkt_id長度-----------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
- mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
-
- return 0;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_UnPacketPublishRel
- // 函數(shù)功能: Publish Rel消息解包
- // 入口參數(shù): rev_data:接收到的數(shù)據(jù)
- // 返回參數(shù): 0-成功 1-失敗
- // 說明:
- //==========================================================
- uint1 MQTT_UnPacketPublishRel(uint8 *rev_data, uint16 pkt_id)
- {
- if(rev_data[1] != 2)
- return 1;
- if(rev_data[2] == MOSQ_MSB(pkt_id) && rev_data[3] == MOSQ_LSB(pkt_id))
- return 0;
- else
- return 1;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketPublishComp
- // 函數(shù)功能: Publish Comp消息組包
- // 入口參數(shù): pkt_id:packet id
- // mqttPacket:包指針
- // 返回參數(shù): 0-成功 1-失敗原因
- // 說明: 當(dāng)收到的Publish消息的QoS等級為2時(shí),先收到rec,再回復(fù)rel
- //==========================================================
- uint1 MQTT_PacketPublishComp(uint16 pkt_id, MQTT_PACKET_STRUCTURE *mqttPacket)
- {
- MQTT_NewBuffer(mqttPacket, 4);
- if(mqttPacket->_data == NULL)
- return 1;
-
- /*************************************固定頭部***********************************************/
-
- //固定頭部----------------------頭部消息-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PUBCOMP << 4;
-
- //固定頭部----------------------剩余長度-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = 2;
-
- /*************************************可變頭部***********************************************/
-
- //可變頭部----------------------pkt_id長度-----------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = pkt_id >> 8;
- mqttPacket->_data[mqttPacket->_len++] = pkt_id & 0xff;
-
- return 0;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_UnPacketPublishComp
- // 函數(shù)功能: Publish Comp消息解包
- // 入口參數(shù): rev_data:接收到的數(shù)據(jù)
- // 返回參數(shù): 0-成功 1-失敗
- // 說明:
- //==========================================================
- uint1 MQTT_UnPacketPublishComp(uint8 *rev_data)
- {
- if(rev_data[1] != 2)
- return 1;
- if(rev_data[2] == MOSQ_MSB(MQTT_PUBLISH_ID) && rev_data[3] == MOSQ_LSB(MQTT_PUBLISH_ID))
- return 0;
- else
- return 1;
- }
- //==========================================================
- // 函數(shù)名稱: MQTT_PacketPing
- // 函數(shù)功能: 心跳請求組包
- // 入口參數(shù): mqttPacket:包指針
- // 返回參數(shù): 0-成功 1-失敗
- // 說明:
- //==========================================================
- uint1 MQTT_PacketPing(MQTT_PACKET_STRUCTURE *mqttPacket)
- {
- MQTT_NewBuffer(mqttPacket, 2);
- if(mqttPacket->_data == NULL)
- return 1;
-
- /*************************************固定頭部***********************************************/
-
- //固定頭部----------------------頭部消息-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = MQTT_PKT_PINGREQ << 4;
-
- //固定頭部----------------------剩余長度-------------------------------------------------
- mqttPacket->_data[mqttPacket->_len++] = 0;
-
- return 0;
- }
復(fù)制代碼
Keil代碼下載:
ESP8266和MQTT協(xié)議.7z
(107.22 KB, 下載次數(shù): 112)
2022-5-12 18:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|