樹莓派如何搭建mqtt伺服器
A. 如何用樹莓派搭建伺服器
方法/步驟
1
在樹莓派上安裝linux系統,到官網下載系統壓縮包,推薦使用raspbian。
2
如果在windows下安裝,需要下載win32diskimager,解壓系統,將解壓出來的系統映像寫到內存卡(內存卡最好大點,推薦8G以上的內存卡)。
3
如果在Linux系統下安裝,先輸入命令:sudo fdisk -l
查詢內存卡的分區,一般是/dev/sdb。
把系統映像解壓到家目錄下/home/***,輸入命令:
sudo dd bs=1M if=~/2016-02-26-raspbian-jessie-lite.img of=/dev/sdb
這步按你自己的實際情況操作。
看到以下輸出就成功寫入了。
4
把內存卡裝入樹莓派,開機啟動,第一次會需要配置系統,可以按默認設置直接啟動進入系統。
5
安裝Apache。apache伺服器一般在linux軟體源列表有,可以用apt安裝。
在安裝可以先更新一下apt的軟體列表,以確定安裝的軟體是最新。
輸入命令:sudo apt-get update
更新完畢可以正式安裝apache了。
輸入命令:sudo apt-get install apache2
6
安裝mysql。這個也是軟體列表中的軟體,所以直接用apt安裝。因為我們是使用伺服器端應用,輸入以下命令安裝:
sudo apt-get install mysql-server
7
安裝php。
輸入命令:sudo apt-get install php5
php還需要對資料庫進行操作,所以還需要安裝php5-mysql
輸入命令:sudo apt-get install php5-mysql
8
注冊一個域名,用nat123將你的域名與你的IP進行域名解析。若是內網則還需要內網映射。
9
在瀏覽器輸入打開你的網址,網頁正常顯示伺服器就搭建成功了。
B. mqtt 伺服器如何使用設置最大發送數量
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,
C. Android MQTT 通信
MQTT 協議 是基於發布/訂閱模式的物聯網通信協議,憑借簡單易實現、支持 QoS、報文小等特點,占據了物聯網協議的半壁江山。
常用於 IOT 物聯網和一些需要服務端主動通知客戶端的場景。
1. 導入依賴
2. 創建 MqttHelper 輔助類,設置回調監聽
3. 連接 MQTT
連接成功或失敗,以及中途的連接掉線,會觸發 OnMqttStatusChangeListener 回調
4. MQTT 連接狀態監聽
5. MQTT 收發消息監聽
onSubMessage 訂閱的消息回調,因為存在訂閱多個 topic 的情況,所以回調能知道是來自哪個 Topic 的消息;
onPubMessage 發布的消息回調,用於確認發布的消息是否發送成功。
6. MQTT 訂閱 Topic
需要在 MQTT 連接成功後才能訂閱 topic,否則訂閱 Topic 不成功,收不到對應消息
7. MQTT 取消訂閱 Topic
8. MQTT 發布消息
9. MQTT 斷開連接
10. 通知設置
由於 MQTT 啟動了一個 Service,而 Android 8.0 以上對於後台 Service 限制時長 5 秒;所以將 MqttService 綁定到 Notification 上成為了一個前台通知;通知的標題和內容顯示可以在 strings.xml 中設置,對應屬性如下:
Android 8.0 及以上開啟前台服務綁定到通知,8.0 以下默認不啟用,可將 mqtt_foreground_notification_low_26 設為 true,將 8.0 以下設備也開啟前台通知服務
創建 MQTT 實例時需要傳送參數 MqttOptions,下面將介紹下部分參數;
1. Topic
MQTT 是一種發布/訂閱的消息協議, 通過設定的主題 Topic,
發布者向 Topic 發送的 payload 負載消息會經過伺服器, 轉發到所有訂閱襪橋
該 Topic 的訂閱者
通配符 : 假想移動端消息推送場景,有的系統消息是全體用戶接收,有的消息是 Android 或 iOS 設備接收, 又或者是某些消息具體推送到用戶,當然, 對應的多種類型消息可以通過多訂閱幾個對應的 Topic 解決,也可以使用通配符;
通配符有兩個, " + " 和 " # ", 與正斜杠 " / " 組合使用;加號只能表示一級Topic, 井號可以表示任意層級 Topic; 例如: 訂閱 Topic為 " System/+ ", 發布者發布的 Topic 可以是 System、System/Android、System/iOS; 但是不能是 System/iOS/123, 而訂閱的 Topic 如果是" System/# " 則可以收到;
注意,只有訂閱的 Topic 才可以使用 通配符, 發布和遺囑的 Topic 不能包含通配符.
2. ClientID
發布者和訂閱者都是屬於客戶端, 客戶端與服務端建立連接之後,發送的第一個報文消息必須是 Connect 消息隱好缺,而 Connect 的消息載荷中必須包含 clientID 客戶端唯一標識;
如果兩個客戶端的 clientID 一樣, 則服務端記錄第一個客戶端連接之後再收到第二個客戶端連接請求,則會向一個客戶端發送 Disconnect 報文斷開連接, 並連接第二個客戶端, 而如果此時設置了自動重連, 第一個客戶端再次連接,服務端又斷開與第二個的連接, 連上第一個客戶端, 如此將導灶辯致兩個客戶端不斷的被擠掉重連.
注意: clientID 使用的字元最好是 大小寫字母和數字, 長度最好限制在[1, 23] 之間;
3. 遺囑消息
可選參數, 客戶端沒有主動向服務端發起 disconnect 斷開連接消息,然而服務端檢測到和客戶端之間的連接已斷開, 此時服務端將該客戶端設置的遺囑消息發送出去
應用場景: 客戶端因網路等情況掉線之後, 可以及時通知到所有訂閱該遺囑 Topic 的客戶端;
遺囑 Topic 中不能存在通配符.
4. Session
客戶端和服務端之間建立的會話狀態, 一般用於消息保存, 如果設置清除 Session,則每次客戶端和服務端建立連接會創建一個新的會話,之前連接中的消息不能恢復,
而設置不清除會話, 對應發布者發送的 qos 為 1和2 的消息,還未被訂閱者接收確認,則需要保存在會話中, 以便訂閱者下次連接可以恢復這些消息;
注意: Session 存儲的消息是保存在內容中的, 所以如果不是重要的消息,最好是設置清除 Session, 或者設置 qos = 0;
5. 心跳包
標識客戶端傳輸一次控制報文到下一次傳輸之間允許的空閑時間;在這段時間內,如果客戶端沒有其他任何報文發送,必須發送一個 PINGREQ 報文到伺服器,而如果服務端在 1.5 倍心跳時間內沒有收到客戶端消息,則會主動斷開客戶端的連接,發送其遺囑消息給所有訂閱者。而服務端收到 PINGREQ 報文之後,立即返回 PINGRESP 報文給客戶端
心跳時間單位為秒,佔用2個位元組,最大 2^16 - 1 = 65535秒(18小時12分鍾15秒),設置為 0 表示不使用心跳機制; 心跳時間一般設置為幾分鍾或幾十秒即可,時間短點可以更快的發出遺囑消息通知掉線,但是時間短會增加消息頻率,影響服務端並發; 微信長連接為 300 秒,而三大運營商貌似也有個連接時間最小的為 5 分鍾。
6. qos
服務質量等級 qos 對應兩部分,一是客戶端到服務端發送的消息, 一是服務端到客戶端訂閱的消息; 從發布者到訂閱者實際 qos 為兩段路中 qos 最小的。
qos 可選值 0(最多交付一次)、1(最少交付一次)、2(正好交付一次);
qos = 0 :接收方不發送響應,發送方不進行重試;發送方只管發一次,不管是否發成功,也不管接收方是否成功接收,適用於不重要的數據傳輸;
qos = 1 :確保消息至少有一次到達接收方,發送方向接收方發送消息,需要等待接收方返回應答消息,如果發送方在一定時間之內沒有收到應答,發送方繼續下一次消息發送,直到收到應答消息,刪除本地消息緩存,不再發送;所以接收方可能收到1-n次消息;適用於需要收到所有消息,客戶端可以處理重復消息。
qos = 2 :確保消息只一次到達接收方,發送方和接收方之間消息處理流程最復雜;
Mqtt Qos 深度解讀 和 MQTT協議QoS2 准確一次送達的實現
7. payload 負載消息
位元組流類型, 是 MQTT 通信傳輸的真實數據
8. 保留消息
發布消息時設置, 對應參數 retain, 服務端將保留對應 Topic 最新的一條消息記錄; 保留消息的作用是每次客戶端連接上線都會收到其 Topic 的最後一條保留消息, 所以可能存在網路不穩定,頻繁掉線重連,每次重連重復收到保留消息;
可以向對應的 Topic 發送一條 空消息,用於清除保留消息。
MQTT 服務搭建 Apache Apollo 伺服器 搭建 MQTT 服務
Github 倉庫
mqtt 協議
D. 在雲伺服器上搭建了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的報文。
E. 使用 Node-RED 處理 MQTT 數據
本文將介紹使用 Node-RED 連接到 MQTT 伺服器,並對 MQTT 數據進行過濾和處理後再將其發送至 MQTT 伺服器的完整操作流程。讀者可以快速了解如何使用 Node-RED 對 MQTT 數據進行簡單的流處理。
Node-RED 無論是在你本地的電腦上,還是樹莓派等設備,亦或是雲端伺服器,都可以快速安裝和使用,下面將使用兩種比較常見的安裝方式:
使用 npm 進行全局安裝:
使用 Docker 進行安裝:
如果使用的是 npm 進行的全局安裝,那麼在提示安裝成功後,只需要在全局運行 node-red 命令就可以立即啟動 Node-RED。
無論是使用 Docker 還是 npm 在啟動成功後,我們只需要打開瀏覽器,輸入當前地址加 1880 埠號,即可打開 Node-RED 的瀏覽器編輯器頁面,例如在本地運行的話,打開瀏覽器,輸入 http://127.0.0.1:1880,當看到如下圖所示頁面後,說明 Node-RED 已經成功啟動:
本文將使用 EMQ 提供的 免費公共 MQTT 伺服器,該服務基於 MQTT 物聯網雲平台 - EMQX Cloud 創建,伺服器接入信息如下:
在下面的功能演示中,我們將提供一個使用 Node-RED 來處理接收到的包含溫濕度信息的 JSON 數據,然後對溫度值進行規則判斷,當溫度發生改變的時候,就將當前發生改變的溫度值通過 MQTT 再次發送出去的簡單使用案例。
我們首先在左側菜單欄中,拖拽一個 MQTT in 的節點到頁面中,雙擊節點後,右側出現一個編輯 MQTT 節點的配置頁面,我們根據內容提示,新建一個連接信息後,再填入 MQTT 的其它連接信息後,點擊 Done 按鈕後,即可保存該節點信息。
接入數據:我們拖拽一個 JSON 節點到頁面中,可以在 JSON 節點的配置頁面中,配置一個 Action,我們設置為 Always convert to JavasScript Object ,因為我們無法確定發送過來的數據是一個 JSON 格式的數據還是一個 JSON 字元串,因此第一步都將接收到的消息進行一個 JSON 轉換。配置完成後,我們將該節點與 MQTT in 節點進行連接。
過濾數據
我們配置完成格式化發送過來的消息數據後,我們就可以拖拽一個 filter 節點到頁面中,同樣雙擊節點後,在配置頁面中配置規則,我們先選擇一個 Mode,我們設置為 blcok unless value changes ,過濾規則為需要當前接收到數據的值發生改變,因為目前數據為 JSON 格式,我們判斷的是 JSON 數據內的某一個值,因此我們需要在 Property 這里設置值為 msg.payload.temperature 配置完成後我們點擊 Done 按鈕來保存數據過濾節點的配置,最後將該節點連接到上一步配置完成後的 JSON 節點。
使用模版
當過濾完數據後,同樣拖拽一個 template 節點到頁面中,雙擊節點後來配置模版內容,使過濾完成後的數據,能通過模版將數據進行輸出。當然也可以不需要這個步驟,直接將過濾後的數據進行輸出。
完成以上對數據的處理和過濾後,最後我們再來將處理完成後的數據使用 MQTT 將其發送出去,拖拽一個 MQTT out 的節點到頁面中,填入和 MQTT in 節點相同的連接信息,配置一個用戶接收數據的 Topic,最後保存完成後,再將其和 template 節點進行連接,點擊右上角的 Deploy 按鈕,即可對當前規則應用進行在線部署。
在完成整個流數據處理的功能編排以後,我們使用 MQTT 5.0 客戶端工具 - MQTT X 來測試和驗證該功能的可用性。我們新建一個連接,連接到剛才在 Node-RED 中配置的 MQTT 雲服務地址,然後輸入 MQTT in 節點內的 Topic 來發送一條消息,使 Node-RED 能夠接收到我們發送的 MQTT 數據。
然後我們再在 MQTT X 中訂閱一個在 MQTT out 節點內配置的 Topic,用於接收處理過的消息數據。當發送一條包含了溫濕度的消息數據後,我們可以接收到一條根據我們設定的消息模版發送過來的消息,再次發送就無法接收到。
因為此時溫度值沒有發生變化,當我們再次修改溫度值後,就會發現我們又接收到了一條包含提醒溫度值發生變化的消息。
至此,我們完成了安裝並使用 Node-RED 連接到 MQTT 雲服務,以及對 MQTT 消息數據進行過濾和處理,最後再將處理完成後的數據消息發送至 MQTT 伺服器的全部流程。
Node-RED 的交互和使用方式,即用 UI 方式描述通用業務邏輯,可以降低非專業開發人員的上手門檻,使用一個可視化工具快速地創建需要的復雜執行任務,可以通過簡單 Node 即節點連接構建出復雜的任務,特別是針對一些物聯網的應用場景,都很有幫助。
F. 樹莓派搭建文件伺服器
https://www.raspberrypi.org/downloads/raspberry-pi-os/
安裝 Etcher 之後啟動 Etcher,插入 SD 卡、選擇要安裝的 img 文件、選擇 SD 卡對應的磁碟分區
https://www.balena.io/etcher/
① 新建一個ssh空白文件,放到root目錄下,樹莓派開機會自動啟用
② 網路優先選擇有線網路
③ 無線網路
將刷好 Raspbian 系統的 SD 卡用電腦讀取。在 boot 分區,也就是樹莓派的 /boot 目錄下新建
具體詳情看下面
https://shumeipai.nxez.com/2017/09/13/raspberry-pi-network-configuration-before-boot.html
方法1:利用路由器軟體查看IP地址
方法2:
ssh連接默認用戶名:pi 密碼:raspberry
方法3:IP Scanner
1.切換 root許可權 sudo su
2.編輯下列文件
連接raw.githubusercontent.com失敗
step1 :
在 https://site.ip138.com/raw.Githubusercontent.com/
輸入raw.githubusercontent.com查詢IP地址
step2 :
sudo nano /etc/hosts
你查到的ip地址,香港的就行 raw.githubusercontent.com
比如:
151.101.76.133 raw.githubusercontent.com
OpenMediaVault項目地址:
https://github.com/OpenMediaVault-Plugin-Developers/installScript
執行安裝腳本:
step1:
輸入樹莓派的IP地址
初始用戶名:admin
密碼:openmediavault
step2:
1.連接硬碟
2.文件系統—>卸載硬碟
3.磁碟—>擦除
4.文件系統—>新建 文件系統選擇EXT4
5.掛載—>應用
6.共享文件夾—>新建一個文件夾 設置許可權
7.SMB/CIFS —>啟用
8.共享—>添加共享
mac登陸
前往:連接伺服器 smb://樹莓派的ip地址
windows
我的電腦—>右鍵—>映射網路驅動器—>找到共享的文件夾
G. MQTT簡單介紹
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發布/訂閱模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上。好比你給好友發送一封電子郵件,發送完成後你可以去做別的事情,收件人也不必立刻響應,可以在自己有空的時候查看郵件,是一個典型的非同步發布/訂閱場景。而另一種典型的同步請求/回答場景,可以用接打電話的場景來類比。
MQTT的設計遵循以下的原則:
為了滿足不同的場景,MQTT支持三種不同級別的服務質量(Quality of Service,QoS)為不同場景提供消息可靠性:
MQTT擁有14種不同的消息類型:
實現MQTT協議需要客戶端和伺服器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發布者(Publish)、代理(Broker)(伺服器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是伺服器,消息發布者可以同時是訂閱者。
MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分:
MQTT會構建底層網路傳輸:它將建立客戶端到伺服器的連接,提供兩者之間的一個有序的、無損的、基於位元組流的雙向傳輸。
當應用數據通過MQTT網路發送時,MQTT會把與之相關的服務質量(QoS)和主題名(Topic)相關連。
一個使用MQTT協議的應用程序或者設備,它總是建立到伺服器的網路連接。客戶端可以:
MQTT伺服器以稱為"消息代理"(Broker),可以是一個應用程序或一台設備。它是位於消息發布者和訂閱者之間,它可以:
訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話可以包含多個訂閱。每一個會話中的每個訂閱都有一個不同的主題篩選器。
每個客戶端與伺服器建立連接後就是一個會話,客戶端和伺服器之間有狀態交互。會話存在於一個網路之間,也可能在客戶端和伺服器之間跨越多個連續的網路連接。
連接到一個應用程序消息的標簽,該標簽與伺服器的訂閱相匹配。伺服器會將消息發送給訂閱所匹配標簽的每個客戶端。
一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。
消息訂閱者所具體接收的內容。
MQTT協議中定義了一些方法(也被稱為動作),來於表示對確定資源所進行操作。這個資源可以代表預先存在的數據或動態生成數據,這取決於伺服器的實現。通常來說,資源指伺服器上的文件或輸出。主要方法有: