MQTT--單片機實現即時通訊

連接--->http://blog.csdn.net/zhou6343178/article/details/51182623bash

一、準備條件: 
a)硬件:ATMEGA644PA 8位單片機 ENC28J60 
b)下載MQTT C語言的包: 
C/C++ MQTT Embedded clients 
https://www.eclipse.org/paho/clients/c/embedded/ 
c)MQTT基礎知識 
http://mqtt.org/ 
http://download.csdn.net/detail/zhou6343178/9495445服務器

二、移植MQTTPacket到項目裏: 
複製文件夾MQTTPacket到工程,複製MQTTPacket\samples裏面的transport.c、transport.h到工程 
這裏寫圖片描述session

三、修改已經transport.c裏面的四個接口:eclipse

int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen); int transport_getdata(unsigned char* buf, int count); int transport_open(char* host, int port); int transport_close(int sock);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

看接口名稱就知道,該四個接口實現的是TCP數據的收發,具體修改須要根據已經實現的TCP接口來定。(單片機上經常使用的TCP/IP協議棧主要有uip、LwIP) 
注意:MQTT是tcp/ip的應用層,傳輸層須要本身實現,這四個接口分別對應TCP的鏈接、收、發和關閉。tcp

四、實現訂閱/發佈,查看MQTTPacket\samples下的pub0sub1.c。 
下面爲參數的意義: 
MQTTPacket_connectData data = MQTTPacket_connectData_initializer; //鏈接參數 
data.clientID.cstring = 「me2」; //客戶ID,惟一 
data.keepAliveInterval = 200; //保存存活時間200s 
data.cleansession = 1;//從新鏈接後是否清除之前的信息 0表示不清除,1表示重連清除 
data.username.cstring = 「admin」;//若是服務器須要用戶名密碼,這裏設置 
data.password.cstring = 「admin」; 
Qos : 
0 表示最多一次 
1 表示至少一次 
2 表示只有一次ui

MQTTDeserialize_publish(&dup,&qos,&retained,&msgid,&receivedTopic,&payload_in, &payloadlen_in, buf,buflen);
  • 1
  • 1

msgid:該包的ID,paketid,若是須要增長反饋(QoS爲1和2須要反饋),須要獲取該IDspa

發送反饋:.net

MQTTDeserialize_publish(&dup, &qos, &retained, &msgid,&receivedTopic,&payload_in, &payloadlen_in, buf, buflen);
int len = MQTTSerialize_puback(buf,buflen,msgid); transport_sendPacketBuffer(ack_buf,len);
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

接收服務器的反饋:code

if(PUBACK == MQTTPacket_read(buf,buflen,transport_getdata)) { unsigned char packettype = 0; unsigned char dup_ack = 0; unsigned short packetid = 0; MQTTDeserialize_ack(&packettype,&dup_ack,&packetid,buf,buflen); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

比較發送的msgid和反饋獲取的packetid,若是一致表示該包發送成功。 
等等,具體看文檔blog

五、服務器實現 mosquitto 
請參考:http://blog.csdn.net/xukai871105/article/details/39252653 
指令舉例: 
訂閱 mosquitto_sub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic 
-h 服務器域名 
-u 用戶名(沒有能夠省略) 
-P密碼(沒有能夠省略) 
-t topic名稱

發佈:mosquitto_pub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic -m hello 
-m 發佈的內容

以上基本實現單片機與服務器的聯調。若是須要手機控制單片機,可下載手機相關的MQTT包進行通信。

相關文章
相關標籤/搜索