mqtt如何搭建伺服器接受消息
『壹』 設備將數據發送到MQTT伺服器,那伺服器怎麼數據轉發到後台系統
MQTT直接存到後台資料庫里,或交給消息中間件處理
『貳』 如何用mosquitto搭建伺服器
Mosquitto是一款實現了消息推送協議MQTT v3.1的開源消息代理軟體,提供輕量級的,支持可發布/可訂閱的的消息推送模式,使設備對設備之間的短消息通信變得簡單,比如現在應用廣泛的低功耗感測器,手機、嵌入式計算機、微型控制器等移動設備。
Mosquitto官網:
MQTT協議:
客戶端連接日誌
1403334375: New connection from 121.201.8.163 on port 1883.
1403334375: New client connected from 121.201.8.163 as zhoujing (c0, k60, ujoyo).
1403334375: Sending CONNACK to zhoujing (0)
以上是一個客戶端正常連接的日誌。
第一行:伺服器收到一個新的連接請求
1403334375: 表示連接的時間點
121.201.8.163: 客戶端的IP地址
1883: 連接的伺服器埠號
第二行:伺服器為客戶端建立連接
zhoujing (c0, k60, ujoyo): 客戶端連接指定的ClientID為'zhoujing'
c0: 表示cleanSession=false,不清除session
k60: 表示keep-alive=60s
ujoyo: 表示使用的伺服器賬號為joyo
第三行:發送連接ACK包給客戶端
客戶端訂閱過程日誌
1403334375: Received SUBSCRIBE from zhoujing
1403334375: jiji/chat/9 (QoS 2)
1403334375: zhoujing 2 jiji/chat/9
1403334375: Sending SUBACK to zhoujing
第一行:伺服器收到一個來自ClientID為zhoujing的訂閱請求
第二行:伺服器識別zhoujing訂閱的主題為 jiji/chat/9,指定的QOS=2(有且只發送一次)
第三行:給ClientID=zhoujing客戶端發送訂閱ACK回包
伺服器發送內容給客戶端日誌
1403334378: Sending PUBLISH to zhoujing (d0, q2, r0, m1, 'jiji/chat/9', ... (396 bytes))
1403334378: Received PUBREC from zhoujing (Mid: 1)
1403334378: Sending PUBREL to zhoujing (Mid: 1)
1403334378: Received PUBCOMP from zhoujing (Mid: 1)
第一行:伺服器正在發送一個消息給ClientID=zhoujing的客戶端,消息體大小為396 bytes,消息主題為『jiji/chat/9』
(d0, q2, r0, m1)的解釋, 以下參數具體含義,參考MQTT協議
d: 表示mqtt報頭的DUP欄位
q: 表示的QOS欄位
r: 表示的是RETAIN
m: 表示的是消息ID,即mid
第二行:發布收稿階段,有保證的交付第一部分
第三行:出版發行階段,有保證的交付第二部分
第四行:發布完成,有保證的交付第三部分,至此一個內容發部過程完成
客戶端主動斷開連接的日誌
客戶端主動斷開連接的只有一行日誌,很簡單。如下所示:
1403334380: Received DISCONNECT from JY_API_PUSH_CLIENT
接收客戶端發布內容的過程日誌
1403334389: Received PUBLISH from JY_API_PUSH_CLIENT (d0, q2, r0, m1, 'jiji/chat/9', ... (396 bytes))
1403334389: Sending PUBREC to JY_API_PUSH_CLIENT (Mid: 1)
1403334389: Received PUBREL from JY_API_PUSH_CLIENT (Mid: 1)
1403334389: Sending PUBCOMP to JY_API_PUSH_CLIENT (Mid: 1)
第一行:接收來自ClientID=JY_API_PUSH_CLIENT的發布請求,發布的消息主題為'jiji/chat/9',消息大小為396 bytes
第二行:伺服器發送PUBREC給客戶端,此過程與發送消息給客戶端正好對稱,只不過是Received和Sending的對象反過來而已
第三行:伺服器接收到客戶端已經釋放的命令,內容交付第二步完成
第四行:通知客戶端,接收完成,至此一個消息發布完成,內容交付第三步完成
同一個ClientID重復連接時
1403334510: New connection from 121.201.7.150 on port 1883.
1403334510: Client JY_API_PUSH_CLIENT already connected, closing old connection.
接收客戶端心跳包
1403336716: Received PINGREQ from 36383A64663A6464003V0
1403336716: Sending PINGRESP to 36383A64663A6464003V0
客戶端連接超時,伺服器主動清除連接信息
1403336671: Client 33303A33393A3236003V0 has exceeded timeout, disconnecting.
客戶端socket異常時的日誌
1403337602: Socket error on client 351BBJKFX62C1, disconnecting.
1403337602: Socket error on client 351BBJKFX62C0, disconnecting.
最近公司做的項目中有用到消息推送,經過多方面的篩選之後確定了使用MQTT協議,相對於XMPP,MQTT更加輕量級,並且佔用用戶很少的帶寬。
MQTT是IBM推出的一種針對移動終端設備的基於TCP/IP的發布/預訂協議,可以連接大量的遠程感測器和控制設備。
MQTT的官網見:http://mqtt.org/。其中http://mqtt.org/software裡面提供了官方推薦的各種伺服器和客戶端使用的各種語言版本的API。
下面以伺服器Apollo 1.6為例,之前嘗試過使用ActiveMQ,效果很不理想,只能實現伺服器和客戶端一對一的通信,從官網上了解到Apollo屬於activemq的一個子工程。先不管這些了,言歸正傳,以下在windows環境下。
1、在這里下載Apollo伺服器,下載後解壓,然後運行apache-apollo-1.6\bin\apollo.cmd,輸入create mybroker(名字任意取,這里是根據官網介紹的來取的)創建伺服器實例,伺服器實例包含了所有的配置,運行時數據等,並且和一個伺服器進程關聯。
2、create mybroker之後會在bin目錄下生成mybroker文件夾,裡麵包含有很多信息,其中etc\apollo.xml文件下是配置伺服器信息的文件,etc\users.properties文件包含連接MQTT伺服器時用到的用戶名和密碼,後面會介紹,可以修改原始的admin=password,可以接著換行添加新的用戶名密碼。
3、打開cmd,運行…apache-apollo-1.6\bin\mybroker\bin\apollo-broker.cmd run 開啟伺服器,可以在瀏覽器中輸入http://127.0.0.1:61680/查看是否安裝成功,該界面展示了topic,連接數等很多信息。
經過上面的簡單步驟,伺服器基本上就已經完成,下一篇將介紹Android客戶端的編寫和注意事項。
客戶端使用的API,開始我使用的是mqtt-client,使用過後發現問題百出,不能很好的滿足要求,後來使用了官方推薦的Eclipse Paho,下面開始客戶端代碼的編寫,為了方便測試這里有android和j2se兩個工程:
1、新建android工程MQTTClient
2、MainActivity代碼如下:
『肆』 怎樣從MQTT 伺服器 應答中獲取時間戳
定義3個虛擬用戶組,分別進行連接,發布,訂閱操作。
* 連接者:虛擬用戶數=10, 發起10個到伺服器的背景連接,每2秒鍾發一次心跳請求,15秒後斷連。
* 發布者:虛擬用戶數=5,每隔一秒發送一條32位元組的隨機串,帶時間戳,循環10次結束。
* 訂閱者:虛擬用戶數=2,接收相應話題上的消息,每隔一秒輸出采樣間隔里接收到的消息統計,循環10次結束。
在JMeter中運行該場景,15秒鍾左右運行結束。可以在測試結果樹中看到每個操作的詳細信息。表格視圖的"Sample Time"列出了操作花費的時間(毫秒)。由於這次測試在本地,並發用戶數很少,所以連接、消息發送、接收時延都很短。您可以指向實際的MQTT伺服器,模擬更大的並發用戶數。
『伍』 想問一下,如何用MQTT協議搭建一個物聯網空調的阿里雲伺服器,謝謝
MQTT推薦使用EMQ,來自國人開發的產品
『陸』 ubuntu mqtt 服務怎麼搭建
在Ubuntu下搭建MQTT伺服器",主要涉及到【MQTT】在Ubuntu下搭建MQTT伺服器方面的內容,對於【MQTT】在Ubuntu下搭建MQTT伺服器感興趣的同學可以參考一下。
『柒』 在雲伺服器上搭建了mqtt,為什麼手機連接不上mqtt,要怎麼做才能連接上求求大神幫忙
MQTT協議是廣泛應用的物聯網協議,使用測試MQTT協議需要MQTT的代理。有兩種方法使用MQTT服務,一是租用現成的MQTT伺服器,如阿里雲,網路雲,華為雲等公用的雲平台提供的MQTT服務,使用公用的MQTT伺服器的好處是省事,但如果僅僅用於測試學習還需要注冊帳號,靈活性差些,有的平台還需要付費。另一方法是自己使用開源的MQTT組件來搭建。
MQTT伺服器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。
這里介紹的是用輕量級的mosquitto開源項目來搭建一個屬於自己的MQTT伺服器。
第一步:需要安裝一台linux主機,這不多介紹,可以使用真機安裝也可以使用虛擬機安裝。如果僅僅是自己測試使用都可以。
第二步:下載mosquitto需要的依賴
sudo apt-get install libssl-devsudo apt-get install uuid-devsudo apt-get install cmake
第三步:下載mosquitto並解壓,現在mosquitto官網最新的版本是1.5.1
tar xzvf mosquitto-1.5.1.tar.gz
第四步:編譯
cd mosquitto-1.5.1/
make
make install
第五步:啟動mosquitto
./mosquitto -v
1535473957: mosquitto version 1.5.1 starting
1535473957: Using default config.
1535473957: Opening ipv4 listen socket on port 1883.
1535473957: Opening ipv6 listen socket on port 1883.
這時候mosquitto就會以默認的參數啟動。如果需要帶配置文件可以修改配置文件mosquitto.conf,
啟動時候加上參數 -c,
./mosquitto -c mosquitto.conf
可以看到,mosquitto監聽的埠為1883.
這時候我們的MQTT伺服器就搭建好了。可找一個mqtt客戶端來測試一下。
先發布一個主題「home/garden/fountain/2」
內容是「hello world」
這時候在mosquitto會列印出下面的log
535474247: New connection from 192.168.1.105 on port 1883.
1535474247: New client connected from 192.168.1.105 as MQTT_FX_Client (c1, k60).
1535474247: No will message specified.
1535474247: Sending CONNACK to MQTT_FX_Client (0, 0)
1535474307: Received PINGREQ from MQTT_FX_Client
1535474307: Sending PINGRESP to MQTT_FX_Client
1535474339: Received PUBLISH from MQTT_FX_Client (d0, q0, r0, m0, 'home/garden/fountain/2', ... (12 bytes))
1535474367: Received PINGREQ from MQTT_FX_Client
1535474367: Sending PINGRESP to MQTT_FX_Client
訂閱主題「home/garden/fountain/2」
可以看到收到了自己發布的消息。
用wireshark抓包
可以看到抓到了一個MQTT的publish的報文。
『捌』 為啥連接mqtt伺服器直接可以接收到消息
MQTT還有一些有趣的特性,其中之一是遺囑(last-will-and-testament)消息,可以用於區分兩種不同的靜默,一種是沒有主題相關數據推送,另一種是你的數據接收器出現故障。
『玖』 怎麼將消息發送到mqtt代理伺服器
通過Cocoa Pods添加MQTTKit
MQTTKit在github上鏈接https://github.com/NormanLeeIOS/MQTTKit#send-a-message,down下來。
cd到工程目錄,輸入pod install,用xcode打開工程的打開xcworkspace擴展名的文件。
如果不是MQTTKit存在更新的版本,則輸入pod update。
新建一個MQTT的服務請求
NSString *clientID = ...
MQTTClient *client = [[MQTTClient alloc] initWithClientId:clientID];
發送消息,每次發送消息包括目標host和本地MQTT消息.具體MQTT格式消息見代碼。這里Host可以是Server的IP,不需要host表解析。
// connect to the MQTT server
[self.client connectToHost:@"iot.eclipse.org"
completionHandler:^(NSUInteger code) {
if (code == ConnectionAccepted) {
// when the client is connected, send a MQTT message
[self.client publishString:@"Hello, MQTT"
toTopic:@"/MQTTKit/example"
withQos:AtMostOnce
retain:NO
completionHandler:^(int mid) {
NSLog(@"message has been delivered");
}];
}
}];
訂閱主題並接受MQTT格式的消息,這部分在viewdidload中實現。
// define the handler that will be called when MQTT messages are received by the client
[self.client setMessageHandler:^(MQTTMessage *message) {
NSString *text = [message.payloadString];
NSLog(@"received message %@", text);
}];
// connect the MQTT client
[self.client connectToHost:@"iot.eclipse.org"
completionHandler:^(MQTTConnectionReturnCode code) {
if (code == ConnectionAccepted) {
// when the client is connected, subscribe to the topic to receive message.
[self.client subscribe:@"/MQTTKit/example"
withCompletionHandler:nil];
}
}];
斷開連接
[self.client :^(NSUInteger code) {
// The client is disconnected when this completion handler is called
NSLog(@"MQTT client is disconnected");
}];
整個連接建立、發送消息、接受消息、斷開連接都是通過Block的消息機制來實現,因此需要對block有很好地理解。