⑴ MQTT用什麼協議寫最好求推薦!~
ET-iLink私有雲最好了,MQTT協議本質上面可以看一個IM通信協議,從以前移動PC時代來看,做的最好的IM通信伺服器是ejabberd,這個使用erlang語言實現,而且根據現在網上能夠找到一些測試結果來看,用erlang實現的MQTT開源伺服器最為高效可靠,從這二點來看用ERLANG實現最好。
⑵ mqtt 伺服器搭建需要用到java嗎
最近公司做的項目中有用到消息推送,經過多方面的篩選之後確定了使用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代碼如下:
⑶ 如何在windows上用c語言實現MQTT協議
C語言是一門通用計算機編程語言,廣泛應用於底層開發。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標准局為C語言制定了一套完整的美國國家標准語法,稱為ANSI C,作為C語言最初的標准。 目前2011年12月8日,國際標准化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標准,也是C語言的最新標准,該標准更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。
C語言是一門面向過程的計算機編程語言,與C++,Java等面向對象的編程語言有所不同。
其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
⑷ 嵌入式需要學什麼嵌入式需要學哪些課程和內容
1.1 有哪些設備使用單片機或Linux
所有的電子產品,所用技術都可以認為要麼是單片機,要麼是Linux;GUI方面主要是QT/Android,它們都是運行於Linux之上的。我們說的單片機不使用操作系統,但是使用單片機設備肯定遠遠超過Linux。很多人也是先學習單片機,從單片機進入電子工程師行業,日常生活中,有哪些產品使用單片機、Linux呢?下面舉一些例子:
下面我們用類比和邏輯推導出嵌入式Linux系統的組成,沒錯,「推導」。
從上圖可以知道:
組成:嵌入式Linux系統= bootloader + linux內核 + 根文件系統(裡面含有APP)。
bootloader:它的目的是啟動內核,去哪等讀內核?讀到哪裡?去Flash等外設讀內核,存到內存里去。所以需要有Flash里外設的驅動能力,為了調試方便還會有網路功能。所以,可以認為 booloader = 裸機集合,它就是一個復雜的單片機程序。
Linux內核:Linux內核的最主要目的是去啟動APP,APP保存在哪裡?保存在「根文件系統」里。「根文件系統」又保存在哪裡?在Flash、SD卡等設備里,甚至可能在網路上。所以Linux內核要有這些Flash、SD卡里設備的驅動能力。
不僅如此,Linux內核還有進程調度能力、內存管理等功能。
所以:Linux內核 = 驅動集合 + 進程調度 + 內存管理等。
2.3 要學習bootloader嗎
Bootloader有很多種,常用的叫u-boot。
在實際工作中,對於u-boot基本上是修修改改,甚至不改。但是u-boot本身是很復雜的,比如為了便於調試,它支持網路功能;有些內核是保存在FAT32分區里,於是它要能解析FAT32分區,讀FAT32分區的文件。
花那麼多精力去學習u-boot,但是工作中基本用不到,這對初學者很不友善。
所以,對於初學者,我建議:理解u-boot的作用、會使用u-boot的命令,這就可以了。
如果你的工作就是修改、完善bootloader,那麼再去研究它吧。
2.4 要學習Linux內核、要學習驅動程序嗎
之前我們說過Linux內核 = 驅動集合 + 進程調度 + 內存管理等,如果要學習Linux內核,從驅動程序入手是一個好辦法。
但是人人都要學習Linux內核、人人都要學習Linux驅動嗎?顯然不是。
作為初學者,懂幾個簡單的驅動程序,有利於工作交流;理解中斷、進程、線程的概念,無論是對驅動開發、應用程序開發,都是很有好處的。
所以對於初學者,建議前期只學習這幾個驅動:LED、按鍵、中斷。
LED驅動程序:這是最簡單的驅動程序。
按鍵驅動程序:它也比較簡單,從它引入「中斷」。
中斷:從「中斷」它可以引入:休眠-喚醒、進程/線程、POLL機制、非同步通知等概念。這些概念無論是對驅動開發,還是對應用開發,都很重要。
所以,對於初學者,我建議必須學習這幾個驅動:LED、按鍵、中斷。
入門之後,如果你想從事內核開發、驅動開發,那麼可以去鑽研幾個驅動程序(輸入系統、I2C匯流排、SPI匯流排等),掌握若干個大型驅動程序後,你對內核的套路就有所了解了,再去研究其他部分(比如進程管理、文件系統)時你會發現套路是如此通用。
攝像頭(VL42)、音效卡ALSA驅動是Linux中比較復雜的2類驅動,它們是很難的,如果工作與此相關再去研究。
2.5,要學習Linux應用程序嗎?先學一些基礎技能
要學,即使以後你只想研究內核,一些基本的應用開發編寫能力也是需要的:
基本設備的訪問,比如LCD、輸入設備
進程、線程、進程通信、線程同步與互斥
休眠-喚醒、POLL機制、信號
網路編程
①②③部分的知識,跟驅動有密切的關系,它們是相輔相承的。
掌握了基本驅動開發能力、基本應用開發能力之後,在工作中你就可以跟別人友好溝通了,不至於一臉懵逼。
2.6,應用程序是怎麼啟動的?要了解一下根文件系統
你辛辛苦苦寫出了應用程序,怎麼把它放到板子上,讓它開機就自動啟動?
你寫的程序,它依賴於哪些庫,這些庫放到板子上哪個目錄?
怎麼做一個可升級的系統?即使升級中途斷電了,也要保證程序至少還可以運行老的版本?
這些都需要我們了解一下根文件系統。
先了解一下init進程:它要讀取配置文件,根據配置文件啟動各個APP。
了解了init進程,你就了解了根文件系統的組成,就可以隨心所欲裁剪系統,為你的項目製作出最精簡的系統。
第3章 學習方法
3.1 先不要打破砂鍋問到底
嵌入式涉及的東西太多太雜了,如果心裡沒有主線,碰到什麼都要去研究個透徹,最終反而忘記自己要學什麼了。
嵌入式涉及硬體知識、軟體知識,軟體里涉及匯編、ARM架構、C語言、Makefile、Shell;又分為bootloader、內核、驅動、基本的APP、GUI。
比如我們會用到Makefile,了解它的基本規則,會用我們提供的Makefile就可以。
不需要深入研究那些make函數,因為在工作中都有現成的Makefile給你使用,不需要自己去編寫一套Makefile。何必花上好幾天去深入研究它呢?
比如我們會用到bootloader,難道又要花上幾個月來深入研究u-boot嗎?工作中基本不需要改u-boot,會用那幾個命令就可以。
甚至有些學員先去買本shell的書來學習shell命令,何必?我們在視頻中用到什麼命令,你不懂時再去網路一下這些命令就可以了。
不要脫離初學者的主線:應用基礎、驅動基礎。有了這2個基礎後,你想深入研究某部分時,再去花時間吧。
3.2 思路要清晰,不怕抄代碼
視頻里的代碼,請你一定要自己去寫一次、寫多次。為什麼我現在寫驅動那麼熟?我2009年在華清遠見上課時,
每次上課我都要給學生寫一次那些驅動,十幾次下來閉著眼睛都知道內核的套路了。
記不住那些函數?我也記不住,我都是去參考同類的驅動程序,這又不是閉卷考試。
但是要理清楚思路,你寫這個程序要完成什麼功能、怎麼實現這些功能?這個要弄清楚。
有了思路後再寫代碼,不知道怎麼寫?沒關系,看看視頻,看看示例,然後關閉視頻看看能否自己寫出來。
3.3 對自己的方向很了解,我只能帶你到這里了
我的專長是操作系統,是快速地帶領大家掌握一些項目開發的基礎知識。
如果你決定深入研究某方面時,我並不能帶你多久。你要去看源碼,去看這方面的專業書籍。
比如想深入鑽研內核的內存管理時,它有頁表映射(你需要閱讀ARM架構的手冊)、SLAB分配器、vmalloc/malloc實現、mmap實現、缺頁中斷、父進程子進程之間的頁面管理等等,內容非常多。有時候連書籍都沒有,你需要直接啃代碼。
當你想從事某個行業時,就需要深入研究行業相關的知識。
比如CAN匯流排,它可以寫成一本書:CAN協議、CAN報文、Socket CAN、車身網路拓撲結構,CAN應用報文,CAN網路管理報文,CAN診斷報文。
想做物聯網網關,需要深入研究MQTT,MQTT協議相對簡單,但是MQTT英文原版協議有130多頁,中文版有近100頁,是一本小書了。
每個行業都有自己的業務邏輯,在掌握基本的編程能力之一,你需要結合具體的業務去深入學習。
⑸ 關於mosquitto怎麼用c語言實現消息的訂閱和發送(mqtt)
1.目標:測試Mosquitto使用MQTT協議發消息的相關性能指標,包含發送速度,並發負載能力,資源佔用,消息到達率。
2.MQTT協議簡介:
1).建立長連接。客戶端發起請求和服務端建立長連接,建立成功後,服務端會返回ACK(CONNACK)
2).客戶端訂閱:客戶端發起訂閱,訂閱成功後,服務端會返回ACK(SUBACK)
3).發消息:發布者會給服務端發消息,服務端在把消息給合適的客戶端。
Qos=0(服務質量):客戶端消息收到後,不會發出ACK給服務端(PUBACK)。
Qos =1:服務端會發ACK給發布者,客戶端收到消息後會發ACK給服務端。
4).取消訂閱:客戶端發起取消訂閱,服務端返回ACK(UNSUBACK)
5)Pingreq&Pingresp:客戶端和服務端會保持心跳。
3.存在問題:
1. 如何模擬出40W的用戶
2. 如何長連接,訂閱,發消息,取消訂閱,Pingreq行為如何實現。
4. python開源庫 Mosquitto.py,解決所有問題
1. 模擬40W用戶
a)可以使用虛擬機和Mosquitto.py實現,具體為:一般一台虛擬機最多是6W+的模擬數據(需要修改句柄數,我使用5W),方法是Client_id可以簡單的做出5W個來,然後調用Mosquitto裡面的connect方法,建立長連接。准備8台虛擬機就可以實現40W客戶端的模擬
2.行為的模擬
a)訂閱:Mosquitto.subscribe / 發消息:Mosquitto.publish / 取消訂閱:Mosquitto.unsubscribe。 簡單一句話 Mosquitto庫實現所有的行為.
5. 指標:發送速度,到達率,並發負載,資源佔用。
a. 發送速度:服務端日誌記錄,分析解決
b. 到達率: 1.客戶端記錄下收到消息,分析計算。2.計算服務端收到的PUBACK(客戶端收到消息返回的ACK),進行計算
c. 並發負載:5W 用戶不斷增加,注意觀察服務端的負載情況。
e.資源佔用:其實主要是cpu/mem/帶寬:cpu多核的話需要觀察top命令下的_id欄位, mem可以觀察free -h命令的剩餘mem, 帶寬可以使用mpstat進行觀察
6. 可以遇見問題:
a. 模擬客戶端的虛擬機需要修改句柄數才能支持5W的客戶端模擬數量
b. 要先吃透MQTT協議的流程,吃透了進行測試會非常的方便
c. Clear session,設置為true則不為客戶端保留休息,設置為false保留消息。其實就是客戶端離線後在連接上可以收到之前推出的消息。
⑹ 虛擬主機 能安裝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,連接數等很多信息。
⑺ 在雲伺服器上搭建了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和Websocket的區別是什麼
簡單回答一下, MQTT ( MQ Telemetry Transport ) 是針對物聯網而設計的, 如手機對家裡的智能開關, 而 WebSocket 是針對瀏覽器與伺服器之間而設計的. 兩者基本上是兩個世界的東西.
MQTT 只是一個介面, 讓兩個 "物件" 能夠透過 TCP 協議通訊, 但並沒有規定(在應用層面上)通訊中要怎樣"對答", 如 pop3 郵件伺服器會有:
S: 220 我是 xxx 伺服器
C: HELO myServer
S: 250 Nice to meet you
C: auth login
....
這些是沒有硬性被定義的, 兩個 "物件" 之間要怎麼"聊天", 由你自己來定.
WebSocket 則是一個 http 協議中的伸延 (先這麼理解吧!), 而 http 協議, 基本上就是一個請求, 一個回答, 然後就自動掛線, 客端和伺服器端不會婆婆媽媽. 但即使就前面說的, 一問一答, 當中便有大量的 header 字串來往, 如果要處理串流這樣大的數據再 + 一大堆 header, 這樣就是很龐大的負擔, websocket 就開了這個婆媽之門, 客端和伺服器端可以以 full plex 的形式做大量 binary 的數據傳輸, 決省了一大堆 header, 其中一些安全機制也保證了大堆資料不被搞亂. 但無論如何, WebSocket 離不開 HTTP!!!
以上, 只是很概念的說法, 便於你理解, 詳細你得自己翻下文獻了.