Mosquitto 是一款实现了消息推送协议MQTT v3.1的开源消息代理软件,提供轻量级的、支持可发布/可订阅的消息推送模式
1、安装编译
(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 ..
make
make install
这里需要注意,cmake .. 提示 程序“cmake”尚未安装
安装 sudo apt-get install cmake
2、安装 mosquitto
解压: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
3
这里会出现两处错误:
error: openssl/opensslv.h: No such file or directory
解决方法:
sudo apt-get install libssl-dev
3、修正链接库路径
由于操作系统版本及架构原因,很容易出现安装之后的链接库无法被找到,如启动mosquitto客户端可能出现找不到
libmosquitto.so.1或libwebsockets.so,因此需要添加链接库路径
修正链接库
vim /etc/ld.so.conf.d/libc.conf
添加:
/usr/local/lib64
/usr/local/lib
再执行 ldconfig
4、修改mosquitto.conf文件
cd /etc/mosquitto/
cp mosquitto.conf.example mosquitto.conf
在 /etc/mosquitto/mosquitto.conf 的 Default Listener 一节添加如下几行:
# =================================================================
# Default listener
# =================================================================
# IP address/hostname to bind the default listener to. If not
# given, the default listener will not be bound to a specific
# address and so will be accessible to all network interfaces.
# bind_address ip-address/host name
#bind_address
# Port to use for the default listener.
pid_file /var/run/mosquitto.pid
user hugo
port 1883
max_connections -1
allow_anonymous true
listener 8080
protocol websockets
注意:上述添加的内容最后不要加空格,否则报错
这里有出现两个问题:
Error: Invalid user 'mosquitto'.
解决方法:修改配置文件 mosquitto.conf ,增加登录的用户,例如当前登录用户为root
因此在上面添加 user hugo
但是运行 mosquitto 时会出现警告
1502156001: Warning: Mosquitto should not be run as root/administrator.
所以改为普通用户 user hugo (改成你自己的)
5、测试
(1)打开mosquitto
打开一个终端输入
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 选项介绍:
参看:mosquitto Options
-c,--config文件
从文件加载配置。 如果没有给出,则使用mosquitto.conf(5)中描述的默认值。
-d,--daemon
在后台运行蚊子作为守护进程。 所有其他行为保持不变。
-p,--port
在指定的端口上监听,而不是默认的1883.除了配置文件中的端口设置外,还会起作用。 可以指定多次以打开在不同端口上侦听的多个套接字。 该套接字将绑定到所有网络接口。
-v,--verbose
使用详细日志记录。 这相当于在配置文件中将log_type设置为全部。 这种覆盖和记录选项在配置文件中给出。
(2)订阅主题
打开另一个终端输入:
mosquitto_sub -t test
此时第一个终端多了一行信息
# 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.
1502159601: New connection from 127.0.0.1 on port 1883.
1502159601: New client connected from 127.0.0.1 as mosqsub|2431-ubuntu (c1, k60)
mosquitto_sub 选项介绍
参看:mosquitto_sub Options
下面的选项可以在命令行中给出,但也可以放置在位于$ 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
--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支持的客户端身份。这可以用来代替用户名
(3)发布内容
再打开一个终端输入:
mosquitto_pub -t test -m "hello world"
此时第二个终端多了一行信息
# mosquitto_sub -v -t test
hello world
mosquitto_pub 选项介绍
参看:mosquitto_pub Options
下面的选项可以在命令行中给出,但是也可以放置在位于$ 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
--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
解决方法:重启... 别的方法暂时不知道呢