MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基于發布/訂閱(Publish/Subscribe)模式的輕量級通訊協議,該協議構建于TCP/IP協議上,由IBM在1999年發布。MQTT最大的優點在于可以以極少的代碼和有限的帶寬,為遠程設備提供實時可靠的消息服務。做為一種低開銷、低帶寬占用的即時通訊協議,MQTT在物聯網、小型設備、移動應用等方面有廣泛的應用。MQTT屬于應用層協議。最新版本為MQTT v5.0標準。本次連接阿里云物聯網平臺主要以MQTT標準協議3.1版本為主。
1.注冊阿里云賬號,登陸云平臺
1.1 搜索物聯網平臺,登錄物聯網平臺
1.2. 選擇公共實例,創建產品
設置產品信息
添加產品
每一個設備都有自己的三元組,單擊設備名字,查看設備三組:設備三元組很重要,在后面登錄阿里云平臺需要用到。
添加產品功能
2.連接阿里云
2.1 編寫ESP8266驅動程序,連接阿里云
//TCP+STA模式,連接服務器
#define WIFI_NAME "WBYQ" //wifi名
#define WIFI_PASSWORD "asdfghjkl23"http://WiFi密碼
#define SERVER_IP "a1knXG89uwh.iot-as-mqtt.cn-shanghai.aliyuncs.com"http://服務器ip
#define SERVER_PORT 1883//端口號
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("服務器連接成功\r\n");
服務器ip和端口號設置參考阿里云在線文檔
服務器IP格式:
${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:1883
${YourProductKey}為設備的ProductKey,上面講到設備三元組已提到過。
${YourRegionId} 是區域代碼,我這是屬于華東2,區域代碼:cn-shanghai
綜上,服務器ip為 ”a1knXG89uwh.iot-as-mqtt.cn-shanghai.aliyuncs.com”
2.2 MQTT連續服務端
MQTT連接阿里云需要三個參數:客戶端id、用戶名、密碼。
這三個參數填寫可參考阿里云文檔工具。
#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
根據阿里云文檔介紹,clientId可自定義,一般我們直接使用三元組中的DeviceName代替;timestamp可不填。綜上,mqttClientId: DS18B20|securemode=3,signmethod=hmacsha1|
2.4 用戶名
用戶名中deviceName用三元組中DeviceName代替;productKey用三元組中productKey代替。綜上,mqttUsername: DS18B20&a1knXG89uwh
2.5 密碼
密碼生成我們可以直接使用阿里云提供的密碼生成工具password工具
3.訂閱消息和發布消息
??3.1 訂閱消息
?將硬件采集到的數據上傳到云端我們稱之為發布消息;云端將數據下發給開發板稱為訂閱。
打開產品,查看產品詳細信息,可以看到有訂閱和發布接口。
#define SET_TOPIC "/sys/a1knXG89uwh/DS18B20/thing/service/property/set"http://訂閱
#define POST_TOPIC "/sys/a1knXG89uwh/DS18B20/thing/event/property/post"http://發布
stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
if(stat)printf("訂閱失敗\r\n");
else printf("訂閱成功\r\n");
4.發送心跳包
??MQTT屬于長連接,要想實現設備一直在線,就需要固定時給服務器發送心跳包,超過時間未發送則會被強制下線。
if(time>=5000)
{
time=0;
MQTT_SentHeart();//發送心跳包
}
5.主函數
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("服務器連接成功\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();//發送心跳包
}
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);
}
}
總結
??MQTT 是一個客戶端服務端架構的發布/訂閱模式的消息傳輸協議。 它的設計思想是輕巧、 開放、簡單、 規范, 因此易于實現。 消耗資源少,在MQTT3.1標準協議中僅有14個報文。每個報文都分為固定報頭、可變報頭和有效載荷3部分。
14個報文如下:
??關于MQTT每個報文詳解查看MQTT3.1協議。
-
單片機
+關注
關注
6037文章
44558瀏覽量
635238 -
物聯網
+關注
關注
2909文章
44634瀏覽量
373319 -
阿里云
+關注
關注
3文章
956瀏覽量
43038 -
ESP8266
+關注
關注
50文章
962瀏覽量
45004 -
MQTT
+關注
關注
5文章
651瀏覽量
22504
發布評論請先 登錄
相關推薦
評論