2.MQTT再學習 -- 搭建MQTT服務器及測試

最近在搞 PM2.5 採集,需要用到 MQTT 傳輸協議。協議部分看了幾天的,講的七七八八。本身在 intel 上有 寫好的MQTT 的源碼,現在的工作其實也就是移植到單片機上或者DM368板卡上。不過,對於之前沒有接觸過的我來說,還是從頭開始,搭建服務器及測試一下爲好。

MQTT服務器有好多種,參看:Servers/Brokers 

Apache-Apollo:一個代理服務器,在ActiveMQ基礎上發展而來,可以支持STOMP、AMQP、MQTT、Openwire、SSL和WebSockets等多種協議,並且Apollo提供後臺管理頁面,方便開發者管理和調試。
EMQ:EMQ 2.0,號稱百萬級開源MQTT消息服務器,基於Erlang/OTP語言平臺開發,支持大規模連接和分佈式集羣,發佈訂閱模式的開源MQTT消息服務器。
HiveMQ:一個企業級的MQTT代理,主要用於企業和新興的機器到機器M2M通訊和內部傳輸,最大程度的滿足可伸縮性、易管理和安全特性,提供免費的個人版。HiveMQ提供了開源的插件開發包。
Mosquitto:一款實現了消息推送協議MQTT v3.1的開源消息代理軟件,提供輕量級的、支持可發佈/可訂閱的消息推送模式。


這篇文章我們只講兩種,一種是 Mosquitto、另一種是 Apollo,以及它們在 linux 下和 Windows 下的安裝。

我們本篇都會來一一做講解。

參看:【MQTT】在Ubuntu下搭建MQTT服務器

一、Ubuntu 下 MQTT 服務器搭建之Apollo

(1) 首先要搞清楚什麼是 Apollo 

參看:ActiveMQ's next generation of messaging

ActiveMQ Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the original ActiveMQ. It accomplishes this using a radically different threading and message dispatching architecture. Like ActiveMQ, Apollo is a multi-protocol broker and supports STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets.

翻譯一下:

ActiveMQ Apollo是從原始ActiveMQ的基礎構建的更快,更可靠,更易於維護的消息代理。 它使用完全不同的線程和消息調度架構來實現。 像ActiveMQ一樣,Apollo是一個多協議代理,支持STOMP,AMQP,MQTT,Openwire,SSL和WebSockets。


看到沒,有支持 MQTT  

下載:Download it today!



(2)安裝

先解壓

# sudo tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz 

查看 bin/apollp.cmd

  1. # cat apollo.cmd
  2. @REM
  3. @REM Licensed to the Apache Software Foundation (ASF) under one or more
  4. @REM contributor license agreements. See the NOTICE file distributed with
  5. @REM this work for additional information regarding copyright ownership.
  6. @REM The ASF licenses this file to You under the Apache License, Version 2.0
  7. @REM (the "License"); you may not use this file except in compliance with
  8. @REM the License. You may obtain a copy of the License at
  9. @REM
  10. @REM http://www.apache.org/licenses/LICENSE-2.0
  11. @REM
  12. @REM Unless required by applicable law or agreed to in writing, software
  13. @REM distributed under the License is distributed on an "AS IS" BASIS,
  14. @REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. @REM See the License for the specific language governing permissions and
  16. @REM limitations under the License.
  17. @REM
  18. @echo off
  19. setlocal
  20. if NOT "%APOLLO_HOME%"=="" goto CHECK_APOLLO_HOME
  21. PUSHD .
  22. CD %~dp0..
  23. set APOLLO_HOME=%CD%
  24. POPD
  25. :CHECK_APOLLO_HOME
  26. if exist "%APOLLO_HOME%\bin\apollo.cmd" goto CHECK_JAVA
  27. :NO_HOME
  28. echo APOLLO_HOME environment variable is set incorrectly. Please set APOLLO_HOME.
  29. goto END
  30. :CHECK_JAVA
  31. set _JAVACMD=%JAVACMD%
  32. if "%JAVA_HOME%" == "" goto NO_JAVA_HOME
  33. if not exist "%JAVA_HOME%\bin\java.exe" goto NO_JAVA_HOME
  34. if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe
  35. goto RUN_JAVA
  36. :NO_JAVA_HOME
  37. if "%_JAVACMD%" == "" set _JAVACMD=java.exe
  38. echo.
  39. echo Warning: JAVA_HOME environment variable is not set.
  40. echo.
  41. :RUN_JAVA
  42. set CLASSPATH=%APOLLO_HOME%\lib\apollo-boot.jar
  43. set BOOTDIRS=%APOLLO_HOME%\lib
  44. if NOT "x%APOLLO_BASE%" == "x" set BOOTDIRS=%APOLLO_BASE%\lib;%BOOTDIRS%
  45. if "%JVM_FLAGS%" == "" set JVM_FLAGS=-server -Xmx1G -XX:-UseBiasedLocking
  46. if "%APOLLO_ASSERTIONS%"=="false" goto noAPOLLO_ASSERTIONS
  47. set JVM_FLAGS=-ea %JVM_FLAGS%
  48. :noAPOLLO_ASSERTIONS
  49. if "x%APOLLO_OPTS%" == "x" goto noAPOLLO_OPTS
  50. set JVM_FLAGS=%JVM_FLAGS% %APOLLO_OPTS%
  51. :noAPOLLO_OPTS
  52. if "x%APOLLO_DEBUG%" == "x" goto noDEBUG
  53. set JVM_FLAGS=%JVM_FLAGS% -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
  54. :noDEBUG
  55. if "x%APOLLO_PROFILE%" == "x" goto noPROFILE
  56. set JVM_FLAGS=-agentlib:yjpagent %JVM_FLAGS%
  57. :noPROFILE
  58. if "%JMX_OPTS%" == "" set JMX_OPTS=-Dcom.sun.management.jmxremote
  59. rem set JMX_OPTS=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
  60. set JVM_FLAGS=%JVM_FLAGS% %JMX_OPTS%
  61. set JVM_FLAGS=%JVM_FLAGS% -Dapollo.home="%APOLLO_HOME%"
  62. if NOT "x%APOLLO_BASE%" == "x" set JVM_FLAGS=%JVM_FLAGS% -Dapollo.base="%APOLLO_BASE%"
  63. set JVM_FLAGS=%JVM_FLAGS% -classpath "%CLASSPATH%"
  64. "%_JAVACMD%" %JVM_FLAGS% org.apache.activemq.apollo.boot.Apollo "%BOOTDIRS%" org.apache.activemq.apollo.cli.Apollo %*
  65. :END
  66. endlocal
  67. GOTO :EOF
  68. :EOF
由於搭建 Apollo 環境變量需要有 JAVA_HOME,這個時候需要安裝 JDK

安裝 JDK



從上圖可以看到,這個Linux版本有 x86 和 x64 等版本。如果查看你的 Ubuntu 是什麼版本呢?
方法一:getconf LONG_BIT
在linux終端輸入 getconf LONG_BIT 命令
如果是32位機器,則結果爲32
  1. [root@localhost ~]# getconf LONG_BIT
  2. 32
如果是64位機器,則結果爲64
  1. [root@localhost ~]# getconf LONG_BIT
  2. 64
方法二:uname -a
如果是64位機器,會輸出x86_64

  1. [chenzhou@testweb01 ~]$ uname -a
  2. Linux testweb01 2.6.18-308.4.1.el5 #1 SMP Tue Apr 17 17:08:00 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
可以看到,uname-a執行後的結果中輸出了x86_64,說明該機器是64位的,否則代表該機器是32位的
  1. [root@localhost ~]# uname -a
  2. Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux
方法三:file /sbin/init 或者 file /bin/ls
示例:32位機器
file /sbin/init

  1. [root@localhost ~]# file /sbin/init
  2. /sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
file /bin/ls
  1. [root@localhost ~]# file /bin/ls
  2. /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
示例:64位機器
file /sbin/init

  1. [chenzhou@testweb01 ~]$ file /sbin/init
  2. /sbin/init: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
file /bin/ls
  1. [chenzhou@testweb01 ~]$ file /bin/ls
  2. /bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
可以通過命令結果中的64-bit或者32-bit來判斷該機器是64位還是32位

最後如下經過測試,我的Ubuntu是32位的,下載  jdk-8u144-linux-i586.tar.gz
  1. # uname -a
  2. Linux ubuntu 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux
  3. #getconf LONG_BIT
  4. 32

通過終端在/usr/local目錄下新建java文件夾,命令行:
sudo mkdir /usr/local/java
然後進入java目錄,命令行:
cd /usr/local/java
解壓壓縮包:
sudo tar xvf jdk-8u25-linux-x64.tar.gz
設置jdk環境變量:
  1. # gedit /etc/profile
  2. 在最後添加下面代碼:
  3. export JAVA_HOME=/usr/local/java/jdk1.8.0_144
  4. export JRE_HOME=${JAVA_HOME}/jre
  5. export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
  6. export PATH=${JAVA_HOME}/bin:$PATH
  7. 使用 source /etc/profile 使它立即生效
檢驗是否安裝成功:
  1. # java -version
  2. java version "1.8.0_144"
  3. Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
  4. Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)

配置 Apollo

進入apache-apollo-1.7.1/bin目錄
cd apache-apollo-1.7.1/bin/
輸入 ./apollo 可以查看幫助
  1. # ./apollo
  2. usage: apollo [--log <log_level>] <command> [<args>]
  3. The most commonly used apollo commands are:
  4. create creates a new broker instance
  5. disk-benchmark Benchmarks your disk's speed
  6. help Display help information
  7. version Displays the broker version
  8. See 'apollo help <command>' for more information on a specific command.
創建一個Broker示例:/apollo create mybroker,MQTT服務器都是叫Broker。
  1. # ./apollo create mybroker
  2. Creating apollo instance at: mybroker
  3. Generating ssl keystore...
  4. You can now start the broker by executing:
  5. "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker" run
  6. Or you can setup the broker as system service and run it in the background:
  7. sudo ln -s "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service" /etc/init.d/
  8. /etc/init.d/apollo-broker-service start
後面會有提示怎麼啓動服務器,以及創建一個service。
啓動Apollo :
  1. # ./mybroker/bin/apollo-broker run
  2. _____ .__ .__
  3. / _ \ ______ ____ | | | | ____
  4. / /_\ \\____ \ / _ \| | | | / _ \
  5. / | \ |_> > <_> ) |_| |_( <_> )
  6. \____|__ / __/ \____/|____/____/\____/
  7. \/|__| Apache Apollo (1.7.1)
  8. Loading configuration file '/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/etc/apollo.xml'.
  9. INFO | OS : Linux 3.2.0-23-generic-pae (Ubuntu 12.04 LTS)
  10. INFO | JVM : Java HotSpot(TM) Server VM 1.8.0_144 (Oracle Corporation)
  11. INFO | Apollo : 1.7.1 (at: /home/tarena/project/MQTT/apache-apollo-1.7.1)
  12. INFO | OS is restricting the open file limit to: 100000
  13. INFO | Accepting connections at: tcp://0.0.0.0:61613
  14. INFO | Accepting connections at: tls://0.0.0.0:61614
  15. INFO | Starting store: leveldb store at /home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/data
  16. INFO | Accepting connections at: ws://0.0.0.0:61623/
  17. INFO | Accepting connections at: wss://0.0.0.0:61624/
  18. INFO | Administration interface available at: https://127.0.0.1:61681/
  19. INFO | Administration interface available at: http://127.0.0.1:61680/
之後查看打印信息即可知道MQTT要連接的端口和管理頁面端口。

然後打開Ubuntu瀏覽器,輸入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/
即可進入 Apollo Console 窗口。


默認的登錄id和密碼是 admin 和 password 

二、Windows 下 MQTT 服務器搭建之Apollo

(1)下載 Apollo


(2)安裝

解壓得到如下文件。
這裏需要注意了,解壓 apache-apollo-1.7.1 所在文件夾名稱不能有 中文或者空格,後面會提到出現什麼錯誤。

進入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夾
按住 shift鍵選擇 apollo.cmd 再點擊右鍵。選擇 在此處打開命令窗口。


然後在 cmd 窗口執行 apollo.cmd。然後就可以看到發生錯誤。上面Ubuntu下安裝時已經提到,還需要安裝 JDK。

(3)安裝 JDK


Windows 系統是多少位的,這個應該很清楚吧。查看 我的電腦->屬性,查看有關計算機的基本信息。

我的電腦爲 win 10 64位,下載並安裝 jdk-8u144-windows-x64.exe
然後配置 JDK 環境變量
我的電腦->屬性->高級系統設置->高級->環境變量


這部分我們之前將 FFmpeg 的Windows安裝說明時有提到過的。可看到有用戶變量和系統變量。
修改“用戶變量”爲當前用戶使用,其他 Windows 用戶不能夠使用。如果要使每個用戶都能夠使用,你需要修改 "系統變量" 。

注意,不要夠刪除在變量中原來已有的內容。如果之前已存在變量,則在其之後用分號“;”分隔,然後添加。


我們只讓當前用戶可用,修改用戶變量即可。
在用戶環境變量中新建變量 JAVA_HOME,設置變量值 F:\Program Files\Java\jdk1.8.0_144

新建PATH,設置變量值%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

新建CLASSPATH,設置變量值.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar注意前面的.表示當前目錄。然後點擊“確定”按鈕。

到此,配置完成。打開 cmd 測試一下配置是否成功。
輸入java -version,顯示版本java version "1.8.0_144",輸入javac -version,也顯示javac 1.8.0_144,說明JDK安裝及環境變量配置成功。


然後接着上面來講。進入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夾
按住 shift鍵選擇 apollo.cmd 再點擊右鍵。選擇 在此處打開命令窗口。
再次在 cmd 窗口執行 apollo.cmd,可以看到如下的信息,這就和 Ubuntu 下安裝對上了。

(4)創建服務器實例

在 CMD 命令窗口輸入 apollo create mybroker ,當然 mybroker 這個名字可以隨便起。


然後查看 mybroker 可以發現裏面包含有很多信息,其中etc\apollo.xml文件下是配置服務器信息的文件,etc\users.properties文件包含連接MQTT服務器時用到的用戶名和密碼,可以修改原始的admin=password,可以接着換行添加新的用戶名密碼。

bin:保存與該實例關聯的執行腳本。
etc:保存實例配置文件
data:保存用於存儲持久消息的數據文件
日誌:保存旋轉日誌文件
tmp:保存在代理運行之間安全刪除的臨時文件

打開cmd,運行 apache-apollo-1.7.1\bin\mybroker\bin\apollo-broker.cmd run 開啓服務器,如下圖所示:


這裏需要注意了,所在 apache-apollo-1.7.1 所在文件夾名稱不能有 中文或者空格。因爲我上面的是存放在 360安全瀏覽下載 這個目錄下了。導致出現系統找不到指定的路徑。


然後打開瀏覽器上,輸入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/
即可進入 Apollo Console 窗口。

默認的登錄id和密碼是 admin 和 password 

三、MQTT 客戶端測試

Apollo 服務器安裝已經講完,接下來簡單測試一下發布訂閱。
這裏面網上有 MQTT協議之Apache Apollo 安裝使用 這種文章用的是 java,在Android上測試的。
這就不太適合我了,不懂 Android 藍瘦香菇啊

再有一種是用 谷歌瀏覽器上的 擴展程序 mqttlens
首先添加該插件


點擊 獲取更多擴展程序


搜索 mqttlens ,最後添加至 CHROME


安裝完成!!
下面進行測試
先運行 Apollo 服務器



然後啓動 mqttlens 


然後點擊 Connections+


出現下圖,並填寫好相關的信息

然後就進入了,訂閱發佈界面

OK,到此結束

四、Ubuntu 下 MQTT 服務器搭建之Mosquitto

Mosquitto 是一款實現了消息推送協議MQTT v3.1的開源消息代理軟件,提供輕量級的、支持可發佈/可訂閱的消息推送模式。現在我們開始搭建服務器。

(1)下載相關文件

(2)安裝編譯

《1》安裝 libwebsockets-2.0.2.tar.gz

解壓:
tar -zxvf libwebsockets-2.0.2
進入該目錄:
cd libwebsockets-2.0.2/
新建目錄 build
mkdir build
進入 build
cd build
跨平臺編譯
cmake .. -DLIB_SUFFIX=64
編譯:
make && make install

這裏需要注意,cmake .. 提示 程序“cmake”尚未安裝
安裝 sudo apt-get install cmake

《2》安裝

解壓:mosquitto-1.4.14
tar -zxvf mosquitto-1.4.14.tar.gz
進入該目錄:
cd mosquitto-1.4.14/
更改config.mk 讓其支持 websockets
WITH_WEBSOCKETS:=no

WITH_WEBSOCKETS:=yes
編譯:
make && make install

這裏會出現兩處錯誤:
致命錯誤: ares.h:沒有那個文件或目錄
    解決方法:sudo apt-get install libc-ares-dev libc-ares2
致命錯誤:uuid/uuid.h: 沒有這個文件或目錄 
    解決方法:sudo apt-get install uuid-dev

至此程序已經安裝完畢!
程序文件將默認安裝到以下位置
路徑程序文件
/usr/local/sbinmosquiotto server
/etc/mosquittoconfiguration
/usr/local/binutility command
 

 

 




修正鏈接庫路徑
由於操作系統版本及架構原因,很容易出現安裝之後的鏈接庫無法被找到,如啓動mosquitto客戶端可能出現找不到
libmosquitto.so.1文件,因此需要添加鏈接庫路徑
  1. 修正鏈接庫
  2. vim /etc/ld.so.conf.d/liblocal.conf
  3. /usr/local/lib64
  4. /usr/local/lib
再執行 ldconfig 

cp mosquitto.conf /etc/mosquitto
修改mosquitto.conf文件
在 /etc/mosquitto/mosquitto.conf 的 Default Listener 一節添加如下幾行:
  1. # =================================================================
  2. # Default listener
  3. # =================================================================
  4. # IP address/hostname to bind the default listener to. If not
  5. # given, the default listener will not be bound to a specific
  6. # address and so will be accessible to all network interfaces.
  7. # bind_address ip-address/host name
  8. #bind_address
  9. # Port to use for the default listener.
  10. pid_file /var/run/mosquitto.pid
  11. user tarena
  12. port 1883
  13. max_connections -1
  14. allow_anonymous true
  15. listener 8080
  16. protocol websockets
這裏有出現兩個問題:
Error: Invalid user 'mosquitto'.
解決方法:修改配置文件 mosquitto.conf ,增加登錄的用戶,例如當前登錄用戶爲root
因此在上面添加  user root
但是運行 mosquitto 時會出現警告
1502156001: Warning: Mosquitto should not be run as root/administrator.
所以改爲普通用戶 user tarena  (改成你自己的)

下面測試時打開 mosquitto 會出現錯誤
# mosquitto -c /etc/mosquitto/mosquitto.conf
1502415109: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting
1502415109: Config loaded from /etc/mosquitto/mosquitto.conf.
1502415109: Opening websockets listen socket on port 8080.
1502415109: Error: Unable to create websockets listener on port 8080.
解決方法:
重裝了好幾遍,網上查了好久。最後發現,是修改上面的mosquitto.conf文件時有空格,將空格刪掉就好了。
居然還有這種操作,醉醉噠...  

(3)測試

《1》打開mosquitto

 打開一個終端輸入
mosquitto -c /etc/mosquitto/mosquitto.conf
  1. # mosquitto -c /etc/mosquitto/mosquitto.conf
  2. 1502159482: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting
  3. 1502159482: Config loaded from /etc/mosquitto/mosquitto.conf.
  4. 1502159482: Opening websockets listen socket on port 8080.
  5. 1502159482: Opening ipv4 listen socket on port 1883.
  6. 1502159482: Opening ipv6 listen socket on port 1883.
mosquitto 選項介紹:
  1. -c,--config文件
  2. 從文件加載配置。 如果沒有給出,則使用mosquitto.conf(5)中描述的默認值。
  3. -d,--daemon
  4. 在後臺運行蚊子作爲守護進程。 所有其他行爲保持不變。
  5. -p,--port
  6. 在指定的端口上監聽,而不是默認的1883.除了配置文件中的端口設置外,還會起作用。 可以指定多次以打開在不同端口上偵聽的多個套接字。 該套接字將綁定到所有網絡接口。
  7. -v,--verbose
  8. 使用詳細日誌記錄。 這相當於在配置文件中將log_type設置爲全部。 這種覆蓋和記錄選項在配置文件中給出。

《2》訂閱主題

打開另一個終端輸入:
mosquitto_sub -t test 
  1. 此時第一個終端多了一行信息
  2. # mosquitto -c /etc/mosquitto/mosquitto.conf
  3. 1502159482: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting
  4. 1502159482: Config loaded from /etc/mosquitto/mosquitto.conf.
  5. 1502159482: Opening websockets listen socket on port 8080.
  6. 1502159482: Opening ipv4 listen socket on port 1883.
  7. 1502159482: Opening ipv6 listen socket on port 1883.
  8. 1502159601: New connection from 127.0.0.1 on port 1883.
  9. 1502159601: New client connected from 127.0.0.1 as mosqsub|2431-ubuntu (c1, k60)
mosquitto_sub 選項介紹
  1. 下面的選項可以在命令行中給出,但也可以放置在位於$ XDG_CONFIG_HOME / mosquitto_sub或$ HOME / .config / mosquitto_sub的配置文件中,每行一對 - 吸附值。配置文件中的值將被用作默認值,並且可以通過使用命令行來覆蓋。這個例外是-t和-T,如果在配置文件中給出,將不會被覆蓋。還要注意,目前一些選項不能被否定,例如-S。具有#作爲第一個字符的配置文件行將被視爲註釋,不會進一步處理。
  2. -a
  3. 將輸出連接綁定到本地IP地址/主機名。如果需要將網絡通信限制在特定接口上,請使用此參數。
  4. -c,--disable-clean-session
  5. 禁用“'clean session”標誌。這意味着客戶端的所有訂閱將在斷開連接後維護,以及到達的後續QoS 1和QoS 2消息。當客戶端重新連接時,它將接收所有排隊的消息。如果使用此選項,建議使用 -id 手動設置客戶機ID
  6. --cafile
  7. 定義包含受信任的PEM編碼的CA證書的文件的路徑。用於啓用SSL通信。另請參見--capath
  8. --capath
  9. 定義包含受信任的PEM編碼的CA證書的目錄的路徑。用於啓用SSL通信。
  10. 爲了--capath正常工作,證書文件必須具有“.crt”作爲文件結束,您必須在每次添加/刪除證書時運行“c_rehash <path to capath>”。另請參見--cafile
  11. --cert
  12. 如果服務器需要,定義包含此客戶端的PEM編碼證書的文件的路徑。另請參閱--key。
  13. --ciphers
  14. 在客戶端支持的TLS密碼的openssl兼容列表。有關詳細信息,請參閱密碼(1)。
  15. -C
  16. 在接收到給定的消息數後立即斷開並退出程序。例如,在需要單個狀態值的shell腳本中這可能很有用。
  17. 結合-R來僅打印第一組新消息(即,沒有設置保留標誌),或者使用 -T 來過濾哪些主題被處理。
  18. -d,--debug
  19. 啓用調試消息。
  20. - help
  21. 顯示使用信息。
  22. -h,--host
  23. 指定要連接的主機。默認爲localhost。
  24. -i,--id
  25. 該客戶端使用的id。如果沒有給出,默認爲mosquitto_sub_附加客戶端的進程ID。不能與-id-prefix參數同時使用。
  26. -I,-id-prefix
  27. 通過追加客戶端的進程標識來提供客戶端ID的前綴。這在代理使用clientid_prefixes選項時很有用。不能與-id參數同時使用。
  28. --insecure
  29. 使用基於證書的加密時,此選項將禁用對服務器證書中服務器主機名的驗證。這在測試初始服務器配置時可能很有用,但是通過DNS欺騙可以讓惡意第三方冒充您的服務器。僅在測試中使用此選項。如果您需要在生產環境中使用此選項,則您的設置會出現故障,並且無需使用加密。
  30. -k,--keepalive
  31. 發送PING命令到經紀人以通知它之前的秒數仍然是連接和運行的。默認爲60秒。
  32. - key
  33. 如果服務器需要,定義包含此客戶端的PEM編碼私鑰的文件的路徑。另請參見--cert。
  34. -N
  35. 打印時,不要在有效負載上附加行尾符號。這允許將來自多個消息的有效載荷數據直接傳輸到另一個應用程序。只有在不使用-v的時候才真正有意義。
  36. -p,--port
  37. 連接到指定的端口而不是默認端口1883。
  38. -P, - pw
  39. 提供用於與經紀人進行認證的密碼。在不指定用戶名的情況下使用此參數是無效的。這需要一個支持MQTT v3.1的代理。另請參閱--username選項。
  40. - proxy
  41. 指定要連接的SOCKS5代理。支持“無”和“用戶名”身份驗證類型。 socks-url必須是形式socks5h:// [username [:password] @] host [:port]。協議前綴socks5h表示主機名由代理解析。符號%25,%3A和%40分別被URL解碼爲%,...和@,如果存在於用戶名或密碼中。
  42. 如果沒有給出用戶名,則不會嘗試認證。如果沒有給出端口,則使用默認值爲1080。
  43. 根據需求,將來可能會有更多SOCKS版本,並且將使用不同的協議前綴,如捲曲(1)所述。
  44. --psk
  45. 提供與代理使用的十六進制(無前導0x)預共享密鑰,以使用TLS-PSK加密支持。還必須提供--psk身份以啓用TLS-PSK。
  46. --psk身份
  47. 使用TLS-PSK支持的客戶端身份。這可以用來代替用戶名

《3》發佈內容

再打開一個終端輸入:
mosquitto_pub -t test -m "hello world" 
  1. 此時第二個終端多了一行信息
  2. # mosquitto_sub -v -t test
  3. hello world
mosquitto_pub 選項介紹
  1. 下面的選項可以在命令行中給出,但是也可以放置在位於$ XDG_CONFIG_HOME / mosquitto_pub或$ HOME / .config / mosquitto_sub的配置文件中,每行一對 - 吸附值。配置文件中的值將被用作默認值,並且可以通過使用命令行來覆蓋。這個例外是消息類型選項,其中只能指定一個。還要注意,目前一些選項不能被否定,例如-S。具有#作爲第一個字符的配置文件行將被視爲註釋,不會進一步處理。
  2. -a
  3. 將輸出連接綁定到本地IP地址/主機名。如果需要將網絡通信限制在特定接口上,請使用此參數。
  4. --cafile
  5. 定義包含受信任的PEM編碼的CA證書的文件的路徑。用於啓用SSL通信。另請參見--capath
  6. --capath
  7. 定義包含受信任的PEM編碼的CA證書的目錄的路徑。用於啓用SSL通信。
  8. 爲了--capath正常工作,證書文件必須具有“.crt”作爲文件結束,您必須在每次添加/刪除證書時運行“c_rehash <path to capath>”。另請參見--cafile
  9. --cert
  10. 如果服務器需要,定義包含此客戶端的PEM編碼證書的文件的路徑。另請參閱--key。
  11. --ciphers
  12. 在客戶端支持的TLS密碼的openssl兼容列表。有關詳細信息,請參閱密碼(1)。
  13. -d,--debug
  14. 啓用調試消息。
  15. -f,--file
  16. 發送文件的內容作爲消息。
  17. - help
  18. 顯示使用信息。
  19. -h,--host
  20. 指定要連接的主機。默認爲localhost。
  21. -i,--id
  22. 該客戶端使用的id。如果沒有給出,默認爲mosquitto_pub_附加客戶端的進程ID。不能與-id-prefix參數同時使用。
  23. -I,-id-prefix
  24. 通過追加客戶端的進程標識來提供客戶端ID的前綴。這在代理使用clientid_prefixes選項時很有用。不能與-id參數同時使用。
  25. --insecure
  26. 使用基於證書的加密時,此選項將禁用對服務器證書中服務器主機名的驗證。這在測試初始服務器配置時可能很有用,但是通過DNS欺騙可以讓惡意第三方冒充您的服務器。僅在測試中使用此選項。如果您需要在生產環境中使用此選項,則您的設置會出現故障,並且無需使用加密。
  27. -k,--keepalive
  28. 發送PING命令到經紀人以通知它之前的秒數仍然是連接和運行的。默認爲60秒。
  29. -key
  30. 如果服務器需要,定義包含此客戶端的PEM編碼私鑰的文件的路徑。另請參見--cert。
  31. -l,--stdin-line
  32. 發送從stdin讀取的消息,將單獨的行分成單獨的消息。請注意,空行不會被髮送。
  33. -m, - 消息
  34. 從命令行發送一條消息。
  35. -n, - 消息
  36. 發送null(零長度)消息。
  37. -p,--port
  38. 連接到指定的端口而不是默認端口1883。
  39. -P, - pw
  40. 提供用於與經紀人進行認證的密碼。在不指定用戶名的情況下使用此參數是無效的。這需要一個支持MQTT v3.1的代理。另請參閱--username選項。
  41. -proxy
  42. 指定要連接的SOCKS5代理。支持“無”和“用戶名”身份驗證類型。 socks-url必須是形式socks5h:// [username [:password] @] host [:port]。協議前綴socks5h表示主機名由代理解析。符號%25,%3A和%40分別被URL解碼爲%,...和@,如果存在於用戶名或密碼中。
  43. 如果沒有給出用戶名,則不會嘗試認證。如果沒有給出端口,則使用默認值爲1080。
  44. 根據需求,將來可能會有更多SOCKS版本,並且將使用不同的協議前綴,如捲曲(1)所述。
  45. --psk
  46. 提供與代理使用的十六進制(無前導0x)預共享密鑰,以使用TLS-PSK加密支持。還必須提供--psk身份以啓用TLS-PSK。
  47. --psk身份
  48. 使用TLS-PSK支持的客戶端身份。如果代理配置爲這樣做,則可以使用這可以替代用戶名。
  49. -q,--qos
  50. 指定消息的使用質量,從0,1和2.默認爲0。
  51. - quiet
  52. 如果給出此參數,則不會打印運行時錯誤。這排除了在無效用戶輸入的情況下給出的任何錯誤消息(例如使用 - 沒有端口的端口)。
  53. -r, - 保存
  54. 如果保留被賦予,則該消息將被保留爲經紀人的“最後已知的良好”值。有關更多信息,請參閱mqtt(7)。
  55. -s,--stdin-file
  56. 發送從stdin讀取的消息,將整個內容作爲單個消息發送。
  57. -S
  58. 使用SRV查找來確定要連接的主機。當我們執行查詢_mqtt._tcp

不過如果直接將第一個終端關閉再打開 mosquitto 會出現一個問題
Error: Address already in use
解決方法:重啓...   別的方法暫時不知道呢

(4)取消匿名登錄

發佈了41 篇原創文章 · 獲贊 36 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章