連接--->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);
看接口名稱就知道,該四個接口實現的是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);
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);
接收服務器的反饋: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); }
比較發送的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包進行通信。