https://blog.csdn.net/qq_29350001/article/details/76680646
MQTT再學習 -- 搭建MQTT服務器及測試
2017年08月04日 13:56:07?聚優致成?閱讀數:63793
?版權聲明:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/qq_29350001/article/details/76680646
最近在搞 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 下的安裝。
我們本篇都會來一一做講解。
參看: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 ?
# sudo tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz
# cat apollo.cmd
@REM
@REM Licensed to the Apache Software Foundation (ASF) under one or more
@REM contributor license agreements.? See the NOTICE file distributed with
@REM this work for additional information regarding copyright ownership.
@REM The ASF licenses this file to You under the Apache License, Version 2.0
@REM (the "License"); you may not use this file except in compliance with
@REM the License.? You may obtain a copy of the License at
@REM
@REM? ? ? http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing, software
@REM distributed under the License is distributed on an "AS IS" BASIS,
@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@REM See the License for the specific language governing permissions and
@REM limitations under the License.
@REM
@echo off
setlocal
if NOT "%APOLLO_HOME%"=="" goto CHECK_APOLLO_HOME
PUSHD .
CD %~dp0..
set APOLLO_HOME=%CD%
POPD
:CHECK_APOLLO_HOME
if exist "%APOLLO_HOME%\bin\apollo.cmd" goto CHECK_JAVA
:NO_HOME
echo APOLLO_HOME environment variable is set incorrectly. Please set APOLLO_HOME.
goto END
:CHECK_JAVA
set _JAVACMD=%JAVACMD%
if "%JAVA_HOME%" == "" goto NO_JAVA_HOME
if not exist "%JAVA_HOME%\bin\java.exe" goto NO_JAVA_HOME
if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe
goto RUN_JAVA
:NO_JAVA_HOME
if "%_JAVACMD%" == "" set _JAVACMD=java.exe
echo.
echo Warning: JAVA_HOME environment variable is not set.
echo.
:RUN_JAVA
set CLASSPATH=%APOLLO_HOME%\lib\apollo-boot.jar
set BOOTDIRS=%APOLLO_HOME%\lib
if NOT "x%APOLLO_BASE%" == "x" set BOOTDIRS=%APOLLO_BASE%\lib;%BOOTDIRS%
if "%JVM_FLAGS%" == "" set JVM_FLAGS=-server -Xmx1G -XX:-UseBiasedLocking
if "%APOLLO_ASSERTIONS%"=="false" goto noAPOLLO_ASSERTIONS
? set JVM_FLAGS=-ea %JVM_FLAGS%
:noAPOLLO_ASSERTIONS
if "x%APOLLO_OPTS%" == "x" goto noAPOLLO_OPTS
? set JVM_FLAGS=%JVM_FLAGS% %APOLLO_OPTS%
:noAPOLLO_OPTS
if "x%APOLLO_DEBUG%" == "x" goto noDEBUG
? set JVM_FLAGS=%JVM_FLAGS% -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
:noDEBUG
if "x%APOLLO_PROFILE%" == "x" goto noPROFILE
? set JVM_FLAGS=-agentlib:yjpagent %JVM_FLAGS%
:noPROFILE
if "%JMX_OPTS%" == "" set JMX_OPTS=-Dcom.sun.management.jmxremote
rem set JMX_OPTS=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
set JVM_FLAGS=%JVM_FLAGS% %JMX_OPTS%
set JVM_FLAGS=%JVM_FLAGS% -Dapollo.home="%APOLLO_HOME%"
if NOT "x%APOLLO_BASE%" == "x" set JVM_FLAGS=%JVM_FLAGS% -Dapollo.base="%APOLLO_BASE%"
set JVM_FLAGS=%JVM_FLAGS% -classpath "%CLASSPATH%"
"%_JAVACMD%" %JVM_FLAGS% org.apache.activemq.apollo.boot.Apollo "%BOOTDIRS%" org.apache.activemq.apollo.cli.Apollo %*
:END
endlocal
GOTO :EOF
:EOF
由于搭建 Apollo 環境變量需要有 JAVA_HOME,這個時候需要安裝 JDK
下載:Java SE Development Kit 8 Downloads
從上圖可以看到,這個Linux版本有 x86 和 x64 等版本。如果查看你的 Ubuntu 是什么版本呢?
方法一:getconf LONG_BIT
在linux終端輸入getconf LONG_BIT?命令
如果是32位機器,則結果為32
[root@localhost ~]# getconf LONG_BIT?
32
如果是64位機器,則結果為64
[root@localhost ~]# getconf LONG_BIT?
64
方法二:uname -a
如果是64位機器,會輸出x86_64
[chenzhou@testweb01 ~]$ uname -a?
Linux testweb012.6.18-308.4.1.el5 #1SMP Tue Apr1717:08:00EDT2012x86_64 x86_64 x86_64 GNU/Linux
可以看到,uname-a執行后的結果中輸出了x86_64,說明該機器是64位的,否則代表該機器是32位的
[root@localhost ~]# uname -a?
Linux localhost.localdomain2.6.18-164.el5 #1SMP Tue Aug1815:51:54EDT2009i686 i686 i386 GNU/Linux
方法三:file /sbin/init 或者 file /bin/ls
示例:32位機器
file /sbin/init
[root@localhost ~]# file /sbin/init?
/sbin/init: ELF32-bit LSB executable, Intel80386, version1(SYSV),forGNU/Linux2.6.9,dynamicallylinked(uses shared libs),forGNU/Linux 2.6.9, stripped
file /bin/ls
[root@localhost ~]# file /bin/ls?
/bin/ls: ELF32-bit LSB executable, Intel80386, version1(SYSV),forGNU/Linux2.6.9,dynamicallylinked(uses shared libs),forGNU/Linux 2.6.9, stripped
示例:64位機器
file /sbin/init
[chenzhou@testweb01 ~]$ file /sbin/init?
/sbin/init: ELF64-bit LSB executable, AMD x86-64, version1(SYSV),forGNU/Linux2.6.9,dynamicallylinked(uses shared libs),forGNU/Linux 2.6.9, stripped
file /bin/ls
[chenzhou@testweb01 ~]$ file /bin/ls?
/bin/ls: ELF64-bit LSB executable, AMD x86-64, version1(SYSV),forGNU/Linux2.6.9,dynamicallylinked(uses shared libs),forGNU/Linux 2.6.9, stripped
可以通過命令結果中的64-bit或者32-bit來判斷該機器是64位還是32位
最后如下經過測試,我的Ubuntu是32位的,下載 ?jdk-8u144-linux-i586.tar.gz
# uname -a
Linux ubuntu3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr1022:19:09UTC2012i686 i686 i386 GNU/Linux
#getconf LONG_BIT?
32
通過終端在/usr/local目錄下新建java文件夾,命令行:
sudo mkdir /usr/local/java
然后進入java目錄,命令行:
cd /usr/local/java
解壓壓縮包:
sudo tar xvf jdk-8u25-linux-x64.tar.gz
設置jdk環境變量:
# gedit /etc/profile
在最后添加下面代碼:
exportJAVA_HOME=/usr/local/java/jdk1.8.0_144
exportJRE_HOME=${JAVA_HOME}/jre
exportCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
exportPATH=${JAVA_HOME}/bin:$PATH
使用 source /etc/profile 使它立即生效
檢驗是否安裝成功:
# java -version
java version"1.8.0_144"
Java(TM)SE RuntimeEnvironment(build1.8.0_144-b01)
JavaHotSpot(TM)ClientVM(build25.144-b01, mixed mode)
進入apache-apollo-1.7.1/bin目錄
cd apache-apollo-1.7.1/bin/
輸入 ./apollo 可以查看幫助
# ./apollo
usage: apollo [--log] []
The most commonly used apollo commands are:
create? ? ? ? ? creates anewbroker instance
? ? disk-benchmark? Benchmarks your disk's speed
? ? help? ? ? ? ? ? Display help information
? ? version? ? ? ? ? Displays the broker version
See'apollo help <command>'formore information on a specific command.
創建一個Broker示例:/apollo create mybroker,MQTT服務器都是叫Broker。
# ./apollo create mybroker
Creating apollo instance at: mybroker
Generating ssl keystore...
You can now start the broker by executing:?
"/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker"run
Or you can setup the broker as system serviceandrun it in the background:
sudo ln -s"/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service"/etc/init.d/
? /etc/init.d/apollo-broker-service start
后面會有提示怎么啟動服務器,以及創建一個service。
啟動Apollo :
# ./mybroker/bin/apollo-broker run
? ? _____? ? ? ? ? ? ? ? .__? .__
? /? _? \ ______? ____ |? | |? |? ____
? /? /_\? \\____ \ /? _ \|? | |? |? /? _ \
/? ? |? ? \? |_> >? <_> )? |_|? |_(? <_> )
\____|__? /? __/ \____/|____/____/\____/
\/|__|ApacheApollo(1.7.1)
Loading configuration file '/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/etc/apollo.xml'.
INFO? | OS? ? : Linux 3.2.0-23-generic-pae(Ubuntu12.04LTS)
INFO? | JVM? ? : JavaHotSpot(TM)Server VM 1.8.0_144(Oracle Corporation)
INFO? | Apollo : 1.7.1(at: /home/tarena/project/MQTT/apache-apollo-1.7.1)
INFO? | OS is restricting the open file limit to: 100000
INFO? | Accepting connections at: tcp://0.0.0.0:61613
INFO? | Accepting connections at: tls://0.0.0.0:61614
INFO? | Starting store: leveldb store at /home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/data
INFO? | Accepting connections at: ws://0.0.0.0:61623/
INFO? | Accepting connections at: wss://0.0.0.0:61624/
INFO? | Administration interface available at: https://127.0.0.1:61681/
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?。
解壓得到如下文件。
這里需要注意了,解壓?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。
下載:Java SE Development Kit 8 Downloads
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 下安裝對上了。
在 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?
Apollo 服務器安裝已經講完,接下來簡單測試一下發布訂閱。
這里面網上有MQTT協議之Apache Apollo 安裝使用這種文章用的是 java,在Android上測試的。
這就不太適合我了,不懂 Android藍瘦香菇啊!
再有一種是用 谷歌瀏覽器上的 擴展程序?mqttlens
首先添加該插件
點擊 獲取更多擴展程序
搜索?mqttlens ,最后添加至 CHROME
安裝完成!!
下面進行測試
先運行Apollo 服務器
然后啟動mqttlens?
然后點擊 Connections+
出現下圖,并填寫好相關的信息
然后就進入了,訂閱發布界面
OK,到此結束
四、Ubuntu 下 MQTT 服務器搭建之Mosquitto
Mosquitto 是一款實現了消息推送協議MQTT v3.1的開源消息代理軟件,提供輕量級的、支持可發布/可訂閱的消息推送模式。現在我們開始搭建服務器。
參看:MQTT學習筆記——MQTT協議體驗 Mosquitto安裝和使用
下載:mosquitto-1.4.14.tar.gz (319kB) (GPG signature)
《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
解壓: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文件,因此需要添加鏈接庫路徑
修正鏈接庫
vim /etc/ld.so.conf.d/liblocal.conf
/usr/local/lib64
/usr/local/lib
再執行 ldconfig
cp mosquitto.conf /etc/mosquitto
修改mosquitto.conf文件
在 /etc/mosquitto/mosquitto.conf 的 Default Listener 一節添加如下幾行:
# =================================================================
# Default listener
# =================================================================
# IP address/hostname to bind thedefaultlistener to. Ifnot
# given, thedefaultlistener willnotbe bound to a specific
# addressandso will be accessible to all network interfaces.
# bind_address ip-address/host name
#bind_address
# Port to useforthedefaultlistener.
pid_file /var/run/mosquitto.pid
user tarena
port1883
max_connections-1
allow_anonymoustrue
listener8080
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文件時有空格,將空格刪掉就好了。
居然還有這種操作,醉醉噠... ?
?打開一個終端輸入
mosquitto -c /etc/mosquitto/mosquitto.conf
# mosquitto -c /etc/mosquitto/mosquitto.conf
1502159482: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting
1502159482: Config loaded from /etc/mosquitto/mosquitto.conf.
1502159482: Opening websockets listen socket on port 8080.
1502159482: Opening ipv4 listen socket on port 1883.
1502159482: Opening ipv6 listen socket on port 1883.
mosquitto 選項介紹:
-c,--config文件
? ? 從文件加載配置。 如果沒有給出,則使用mosquitto.conf(5)中描述的默認值。
-d,--daemon
? ? 在后臺運行蚊子作為守護進程。 所有其他行為保持不變。
-p,--port
? ? 在指定的端口上監聽,而不是默認的1883.除了配置文件中的端口設置外,還會起作用。 可以指定多次以打開在不同端口上偵聽的多個套接字。 該套接字將綁定到所有網絡接口。
-v,--verbose
? ? 使用詳細日志記錄。 這相當于在配置文件中將log_type設置為全部。 這種覆蓋和記錄選項在配置文件中給出。
打開另一個終端輸入:
mosquitto_sub -t test?
此時第一個終端多了一行信息
# mosquitto -c /etc/mosquitto/mosquitto.conf
1502159482: mosquitto version1.4.14(build date2017-08-0715:54:10+0800) starting
1502159482: Config loaded from /etc/mosquitto/mosquitto.conf.
1502159482: Opening websockets listen socket on port8080.
1502159482: Opening ipv4 listen socket on port1883.
1502159482: Opening ipv6 listen socket on port1883.
1502159601: New connection from127.0.0.1on port1883.
1502159601: New client connected from127.0.0.1as mosqsub|2431-ubuntu (c1, k60)
mosquitto_sub?選項介紹
下面的選項可以在命令行中給出,但也可以放置在位于$ XDG_CONFIG_HOME / mosquitto_sub或$ HOME / .config / mosquitto_sub的配置文件中,每行一對 - 吸附值。配置文件中的值將被用作默認值,并且可以通過使用命令行來覆蓋。這個例外是-t和-T,如果在配置文件中給出,將不會被覆蓋。還要注意,目前一些選項不能被否定,例如-S。具有#作為第一個字符的配置文件行將被視為注釋,不會進一步處理。
-a
將輸出連接綁定到本地IP地址/主機名。如果需要將網絡通信限制在特定接口上,請使用此參數。
-c,--disable-clean-session
禁用“'clean session”標志。這意味著客戶端的所有訂閱將在斷開連接后維護,以及到達的后續QoS 1和QoS 2消息。當客戶端重新連接時,它將接收所有排隊的消息。如果使用此選項,建議使用 -id 手動設置客戶機ID
--cafile
定義包含受信任的PEM編碼的CA證書的文件的路徑。用于啟用SSL通信。另請參見--capath
--capath
定義包含受信任的PEM編碼的CA證書的目錄的路徑。用于啟用SSL通信。
為了--capath正常工作,證書文件必須具有“.crt”作為文件結束,您必須在每次添加/刪除證書時運行“c_rehash”。另請參見--cafile
--cert
如果服務器需要,定義包含此客戶端的PEM編碼證書的文件的路徑。另請參閱--key。
--ciphers
在客戶端支持的TLS密碼的openssl兼容列表。有關詳細信息,請參閱密碼(1)。
-C
在接收到給定的消息數后立即斷開并退出程序。例如,在需要單個狀態值的shell腳本中這可能很有用。
結合-R來僅打印第一組新消息(即,沒有設置保留標志),或者使用 -T 來過濾哪些主題被處理。
-d,--debug
啟用調試消息。
- help
顯示使用信息。
-h,--host
指定要連接的主機。默認為localhost。
-i,--id
該客戶端使用的id。如果沒有給出,默認為mosquitto_sub_附加客戶端的進程ID。不能與-id-prefix參數同時使用。
-I,-id-prefix
通過追加客戶端的進程標識來提供客戶端ID的前綴。這在代理使用clientid_prefixes選項時很有用。不能與-id參數同時使用。
--insecure
使用基于證書的加密時,此選項將禁用對服務器證書中服務器主機名的驗證。這在測試初始服務器配置時可能很有用,但是通過DNS欺騙可以讓惡意第三方冒充您的服務器。僅在測試中使用此選項。如果您需要在生產環境中使用此選項,則您的設置會出現故障,并且無需使用加密。
-k,--keepalive
發送PING命令到經紀人以通知它之前的秒數仍然是連接和運行的。默認為60秒。
- key
如果服務器需要,定義包含此客戶端的PEM編碼私鑰的文件的路徑。另請參見--cert。
-N
打印時,不要在有效負載上附加行尾符號。這允許將來自多個消息的有效載荷數據直接傳輸到另一個應用程序。只有在不使用-v的時候才真正有意義。
-p,--port
連接到指定的端口而不是默認端口1883。
-P, - pw
提供用于與經紀人進行認證的密碼。在不指定用戶名的情況下使用此參數是無效的。這需要一個支持MQTT v3.1的代理。另請參閱--username選項。
- proxy
指定要連接的SOCKS5代理。支持“無”和“用戶名”身份驗證類型。 socks-url必須是形式socks5h:// [username [:password] @] host [:port]。協議前綴socks5h表示主機名由代理解析。符號%25,%3A和%40分別被URL解碼為%,...和@,如果存在于用戶名或密碼中。
如果沒有給出用戶名,則不會嘗試認證。如果沒有給出端口,則使用默認值為1080。
根據需求,將來可能會有更多SOCKS版本,并且將使用不同的協議前綴,如卷曲(1)所述。
--psk
提供與代理使用的十六進制(無前導0x)預共享密鑰,以使用TLS-PSK加密支持。還必須提供--psk身份以啟用TLS-PSK。
--psk身份
使用TLS-PSK支持的客戶端身份。這可以用來代替用戶名
再打開一個終端輸入:
mosquitto_pub -t test -m "hello world"?
此時第二個終端多了一行信息
# mosquitto_sub -v -t test
hello world
mosquitto_pub 選項介紹
下面的選項可以在命令行中給出,但是也可以放置在位于$ XDG_CONFIG_HOME / mosquitto_pub或$ HOME / .config / mosquitto_sub的配置文件中,每行一對 - 吸附值。配置文件中的值將被用作默認值,并且可以通過使用命令行來覆蓋。這個例外是消息類型選項,其中只能指定一個。還要注意,目前一些選項不能被否定,例如-S。具有#作為第一個字符的配置文件行將被視為注釋,不會進一步處理。
-a
將輸出連接綁定到本地IP地址/主機名。如果需要將網絡通信限制在特定接口上,請使用此參數。
--cafile
定義包含受信任的PEM編碼的CA證書的文件的路徑。用于啟用SSL通信。另請參見--capath
--capath
定義包含受信任的PEM編碼的CA證書的目錄的路徑。用于啟用SSL通信。
為了--capath正常工作,證書文件必須具有“.crt”作為文件結束,您必須在每次添加/刪除證書時運行“c_rehash”。另請參見--cafile
--cert
如果服務器需要,定義包含此客戶端的PEM編碼證書的文件的路徑。另請參閱--key。
--ciphers
在客戶端支持的TLS密碼的openssl兼容列表。有關詳細信息,請參閱密碼(1)。
-d,--debug
啟用調試消息。
-f,--file
發送文件的內容作為消息。
- help
顯示使用信息。
-h,--host
指定要連接的主機。默認為localhost。
-i,--id
該客戶端使用的id。如果沒有給出,默認為mosquitto_pub_附加客戶端的進程ID。不能與-id-prefix參數同時使用。
-I,-id-prefix
通過追加客戶端的進程標識來提供客戶端ID的前綴。這在代理使用clientid_prefixes選項時很有用。不能與-id參數同時使用。
--insecure
使用基于證書的加密時,此選項將禁用對服務器證書中服務器主機名的驗證。這在測試初始服務器配置時可能很有用,但是通過DNS欺騙可以讓惡意第三方冒充您的服務器。僅在測試中使用此選項。如果您需要在生產環境中使用此選項,則您的設置會出現故障,并且無需使用加密。
-k,--keepalive
發送PING命令到經紀人以通知它之前的秒數仍然是連接和運行的。默認為60秒。
-key
如果服務器需要,定義包含此客戶端的PEM編碼私鑰的文件的路徑。另請參見--cert。
-l,--stdin-line
發送從stdin讀取的消息,將單獨的行分成單獨的消息。請注意,空行不會被發送。
-m, - 消息
從命令行發送一條消息。
-n, - 消息
發送null(零長度)消息。
-p,--port
連接到指定的端口而不是默認端口1883。
-P, - pw
提供用于與經紀人進行認證的密碼。在不指定用戶名的情況下使用此參數是無效的。這需要一個支持MQTT v3.1的代理。另請參閱--username選項。
-proxy
指定要連接的SOCKS5代理。支持“無”和“用戶名”身份驗證類型。 socks-url必須是形式socks5h:// [username [:password] @] host [:port]。協議前綴socks5h表示主機名由代理解析。符號%25,%3A和%40分別被URL解碼為%,...和@,如果存在于用戶名或密碼中。
如果沒有給出用戶名,則不會嘗試認證。如果沒有給出端口,則使用默認值為1080。
根據需求,將來可能會有更多SOCKS版本,并且將使用不同的協議前綴,如卷曲(1)所述。
--psk
提供與代理使用的十六進制(無前導0x)預共享密鑰,以使用TLS-PSK加密支持。還必須提供--psk身份以啟用TLS-PSK。
--psk身份
使用TLS-PSK支持的客戶端身份。如果代理配置為這樣做,則可以使用這可以替代用戶名。
-q,--qos
指定消息的使用質量,從0,1和2.默認為0。
- quiet
如果給出此參數,則不會打印運行時錯誤。這排除了在無效用戶輸入的情況下給出的任何錯誤消息(例如使用 - 沒有端口的端口)。
-r, - 保存
如果保留被賦予,則該消息將被保留為經紀人的“最后已知的良好”值。有關更多信息,請參閱mqtt(7)。
-s,--stdin-file
發送從stdin讀取的消息,將整個內容作為單個消息發送。
-S
使用SRV查找來確定要連接的主機。當我們執行查詢_mqtt._tcp
不過如果直接將第一個終端關閉再打開 mosquitto 會出現一個問題
Error: Address already in use
解決方法:重啟... ? 別的方法暫時不知道呢