MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測(cè)傳輸協(xié)議),是一種基于發(fā)布/訂閱(Publish/Subscribe)模式的輕量級(jí)通訊協(xié)議,該協(xié)議構(gòu)建于TCP/IP協(xié)議上,由IBM在1999年發(fā)布。MQTT最大的優(yōu)點(diǎn)在于可以以極少的代碼和有限的帶寬,為遠(yuǎn)程設(shè)備提供實(shí)時(shí)可靠的消息服務(wù)。做為一種低開(kāi)銷、低帶寬占用的即時(shí)通訊協(xié)議,MQTT在物聯(lián)網(wǎng)、小型設(shè)備、移動(dòng)應(yīng)用等方面有廣泛的應(yīng)用。MQTT屬于應(yīng)用層協(xié)議。最新版本為MQTT v5.0標(biāo)準(zhǔn)。本次連接阿里云物聯(lián)網(wǎng)平臺(tái)主要以MQTT標(biāo)準(zhǔn)協(xié)議3.1版本為主。
1.注冊(cè)阿里云賬號(hào),登陸云平臺(tái)

1.1 搜索物聯(lián)網(wǎng)平臺(tái),登錄物聯(lián)網(wǎng)平臺(tái)

1.2. 選擇公共實(shí)例,創(chuàng)建產(chǎn)品

設(shè)置產(chǎn)品信息

添加產(chǎn)品



每一個(gè)設(shè)備都有自己的三元組,單擊設(shè)備名字,查看設(shè)備三組:設(shè)備三元組很重要,在后面登錄阿里云平臺(tái)需要用到。

添加產(chǎn)品功能

2.連接阿里云
2.1 編寫ESP8266驅(qū)動(dòng)程序,連接阿里云
//TCP+STA模式,連接服務(wù)器
#define WIFI_NAME "WBYQ" //wifi名
#define WIFI_PASSWORD "asdfghjkl23"http://WiFi密碼
#define SERVER_IP "a1knXG89uwh.iot-as-mqtt.cn-shanghai.aliyuncs.com"http://服務(wù)器ip
#define SERVER_PORT 1883//端口號(hào)
while(1)
{
stat=Esp8266_STA_TCPclinet_Init((u8 *)WIFI_NAME,(u8 *)WIFI_PASSWORD,(u8 *)SERVER_IP,SERVER_PORT);
if(stat==0)break;
Delay_Ms(500);
printf("stat=%d\r\n",stat);
}
printf("服務(wù)器連接成功\r\n");
服務(wù)器ip和端口號(hào)設(shè)置參考阿里云在線文檔


服務(wù)器IP格式:
${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:1883
${YourProductKey}為設(shè)備的ProductKey,上面講到設(shè)備三元組已提到過(guò)。
${YourRegionId} 是區(qū)域代碼,我這是屬于華東2,區(qū)域代碼:cn-shanghai
綜上,服務(wù)器ip為 ”a1knXG89uwh.iot-as-mqtt.cn-shanghai.aliyuncs.com”
2.2 MQTT連續(xù)服務(wù)端
MQTT連接阿里云需要三個(gè)參數(shù):客戶端id、用戶名、密碼。
這三個(gè)參數(shù)填寫可參考阿里云文檔工具。
#define ClientID "STM32|securemode=3,signmethod=hmacsha1|"
#define Username "STM32&a17b5WKUY0S"
#define Password "ebff9579ed3e610228da8c035afc9636954c43bd"http://密文
while(1)
{
MQTT_Init();
stat=MQTT_Connect(ClientID,Username,Password);
if(stat==0)break;
Delay_Ms(500);
printf("正在連接....\r\n");
}
printf("阿里云連接成功\r\n");
2.3 客戶端ID
根據(jù)阿里云文檔介紹,clientId可自定義,一般我們直接使用三元組中的DeviceName代替;timestamp可不填。綜上,mqttClientId: DS18B20|securemode=3,signmethod=hmacsha1|
2.4 用戶名
用戶名中deviceName用三元組中DeviceName代替;productKey用三元組中productKey代替。綜上,mqttUsername: DS18B20&a1knXG89uwh
2.5 密碼
密碼生成我們可以直接使用阿里云提供的密碼生成工具password工具

3.訂閱消息和發(fā)布消息
??3.1 訂閱消息
?將硬件采集到的數(shù)據(jù)上傳到云端我們稱之為發(fā)布消息;云端將數(shù)據(jù)下發(fā)給開(kāi)發(fā)板稱為訂閱。
打開(kāi)產(chǎn)品,查看產(chǎn)品詳細(xì)信息,可以看到有訂閱和發(fā)布接口。

#define SET_TOPIC "/sys/a1knXG89uwh/DS18B20/thing/service/property/set"http://訂閱
#define POST_TOPIC "/sys/a1knXG89uwh/DS18B20/thing/event/property/post"http://發(fā)布
stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
if(stat)printf("訂閱失敗\r\n");
else printf("訂閱成功\r\n");
4.發(fā)送心跳包
??MQTT屬于長(zhǎng)連接,要想實(shí)現(xiàn)設(shè)備一直在線,就需要固定時(shí)給服務(wù)器發(fā)送心跳包,超過(guò)時(shí)間未發(fā)送則會(huì)被強(qiáng)制下線。
if(time>=5000)
{
time=0;
MQTT_SentHeart();//發(fā)送心跳包
}
5.主函數(shù)
while(1)
{
stat=Esp8266_STA_TCPclinet_Init((u8 *)WIFI_NAME,(u8 *)WIFI_PASSWORD,(u8 *)SERVER_IP,SERVER_PORT);
if(stat==0)break;
Delay_Ms(500);
printf("stat=%d\r\n",stat);
}
printf("服務(wù)器連接成功\r\n");
while(1)
{
MQTT_Init();
stat=MQTT_Connect(ClientID,Username,Password);
if(stat==0)break;
Delay_Ms(500);
printf("正在連接....\r\n");
}
printf("阿里云連接成功\r\n");
stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
if(stat)printf("訂閱失敗\r\n");
else printf("訂閱成功\r\n");
while(1)
{
if(usart3_flag)
{
usart3_cnt=0;
usart3_flag=0;
}
Delay_Ms(1);
time++;
cnt++;
if(time>=5000)
{
time=0;
MQTT_SentHeart();//發(fā)送心跳包
}
if(cnt>=1000)
{
cnt=0;
temp=DS18B20_GetTemp()*0.0625;
sprintf(mqtt_message,"{"method":"thing.event.property.post","id":"0000000001"," params":{"RoomTemp":%.2f},"version":"1.0.0"}",temp);//溫度
MQTT_PublishData(POST_TOPIC,mqtt_message,0);
}
}
總結(jié)
??MQTT 是一個(gè)客戶端服務(wù)端架構(gòu)的發(fā)布/訂閱模式的消息傳輸協(xié)議。 它的設(shè)計(jì)思想是輕巧、 開(kāi)放、簡(jiǎn)單、 規(guī)范, 因此易于實(shí)現(xiàn)。 消耗資源少,在MQTT3.1標(biāo)準(zhǔn)協(xié)議中僅有14個(gè)報(bào)文。每個(gè)報(bào)文都分為固定報(bào)頭、可變報(bào)頭和有效載荷3部分。

14個(gè)報(bào)文如下:

??關(guān)于MQTT每個(gè)報(bào)文詳解查看MQTT3.1協(xié)議。
-
單片機(jī)
+關(guān)注
關(guān)注
6063文章
44930瀏覽量
647383 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2927文章
45947瀏覽量
388523 -
阿里云
+關(guān)注
關(guān)注
3文章
1006瀏覽量
43899 -
ESP8266
+關(guān)注
關(guān)注
51文章
965瀏覽量
46981 -
MQTT
+關(guān)注
關(guān)注
5文章
670瀏覽量
23501
發(fā)布評(píng)論請(qǐng)先 登錄
esp8266連接阿里云平臺(tái)時(shí)mqtt連接超時(shí)
基于鴻蒙Hi3861V100 MQTT協(xié)議 對(duì)接阿里云物聯(lián)網(wǎng)平臺(tái)
STM32F103板子是如何通過(guò)MQTT協(xié)議連接阿里云物聯(lián)網(wǎng)平臺(tái)的呢
esp8266怎樣通過(guò)MQTT協(xié)議連接阿里云
STM32+ESP8266+MQTT協(xié)議如何連接OneNet物聯(lián)網(wǎng)平臺(tái)?
stm32通過(guò)esp8266 AT命令連接阿里云物聯(lián)網(wǎng)
M5311模塊MQTT協(xié)議連接阿里云物聯(lián)網(wǎng)平臺(tái)相關(guān)資料下載
NodeMCU是怎樣通過(guò)MQTT連接阿里云物聯(lián)網(wǎng)的
stm32通過(guò)esp8266 AT命令連接阿里云物聯(lián)網(wǎng)
NodeMCU 通過(guò)MQTT 連接阿里云物聯(lián)網(wǎng)

ESP8266通過(guò)MQTT協(xié)議連接ONENET

STM32 + ESP8266 + MQTT協(xié)議連接OneNet

STM32驅(qū)動(dòng)ESP8266連接阿里云(1)----使用AT指令連接阿里云

評(píng)論