原创 ROS 环境下MQTT搭建

2022-12-14 14:03 1259 4 4 分类: 软件与OS
MQTT搭建

直接使用mosquitto完成服务器搭建

mosquitto官网

一、安装

安装服务器端

sudo apt-get install mosquitto

安装客户端

sudo apt-get install mosquitto-clients 二、配置
  1. 添加配置文件
sudo vim /etc/mosquitto/conf.d/myconfig.conf

添加以下内容

#添加监听端口(很重要,否则只能本机访问) port 1883 listener 1884 listener 1885 protocol mqtt #默认值为mqtt 即使不写protocol极其参数也是mqtt listener 1886 protocol mqtt # 关闭匿名访问,客户端必须使用用户名 allow_anonymous false #指定 用户名-密码 文件 password_file /etc/mosquitto/pwfile

PS:主配置文件mosquitto.conf的内容一般为

pid_file /var/run/mosquitto.pid # 消息持久存储 persistence true persistence_location /var/lib/mosquitto/ # 日志文件 log_dest file /var/log/mosquitto/mosquitto.log # 其他配置 include_dir /etc/mosquitto/conf.d # 禁止匿名访问 allow_anonymous false # 认证配置 password_file /etc/mosquitto/pwfile # 权限配置 acl_file /etc/mosquitto/aclfile

PS:可使用命令指定配置文件路径
mosquitto -c /etc/mosquitto/mosquitto.conf -d

-c 指定配置文件

-d 表示后台启动

  1. 添加用户&密码
sudo mosquitto_passwd -c /etc/mosquitto/pwfile username
  1. 用户权限配置aclfile
sudo vim /etc/mosquitto/aclfile

编辑内容

# user1只能发布以test为前缀的主题,订阅以$SYS开头的主题即系统主题 user user1 topic write test/# topic read $SYS/# # user2只能订阅以test为前缀的主题 user user2 topic read test/#

查看相关参数说明(附文末)
mosquitto_sub --help
mosquitto_pub --help

三、启动与测试
  1. 启动
#启动 sudo service mosquitto start #查看mosquitto运行状态 sudo service mosquitto status #终止 sudo service mosquitto stop
  1. 测试
  • 测试1
    订阅主题(terminal 1)
mosquitto_sub -h localhost -t "test/#" -u 用户名 -P 密码 -i “client1”

发布主题(terminal 2)

mosquitto_pub -h localhost -t "test/testTopic" -u 用户名 -P 密码 -m "Hello MQTT from mosquitto-clients"
  • 测试2
    订阅
mosquitto_sub -h localhost -t "test/#" -u hanmeimei -P 123456 -i "client1"

订阅系统主题

# 订阅客户端存活连接数 mosquitto_sub -h localhost –t '$SYS/broker/clients/active' -u lilei -P 123456 -i "client2"

发布

mosquitto_pub -h localhost -t "test/abc" -u lilei -P 123456 -i "client3" -m "How are you?" 卸载与重新安装MQTT
  1. 首先检索相关文件位置 mosquitto mosquitto_sub mosquitto_pub mosquitto_passwd
whereis mosquitto
  1. 然后使用rm命令删除相关文件
sudo rm -rf /etc/mosquitto sudo rm /usr/sbin/mosquitto /usr/share/man/man8/mosquitto.8.gz

另外三个文件同理

  1. 重新安装
sudo apt-get remove --purge mosquitto sudo apt-get remove --purge mosquitto-clients 四、部署mqtt_bridge1. 创建Catkin工作空间(若无Catkin工作空间)

详情见此教程

mkdir -p ~/catkin_ws/src # 创建了第二层级的文件夹src,这是放ROS软件包的地方 cd ~/catkin_ws/src # 进入工作空间,catkin_make必须在工作空间这个路径上执行 catkin_init_workspace # 初始化src目录,生成的CMakeLists.txt为功能包编译配置 2. 编译工作空间,设置环境变量cd ~/catkin_ws # 回到工作空间,catkin_make必须在工作空间下执行; catkin_make # 开始编译,调用系统自动完成编译和链接过程,构建生成目标文件 source devel/setup.bash # 刷新坏境 3. clone mqtt_bridge repositoriescd ~/catkin_ws/src git clone git@github.com:groove-x/mqtt_bridge.git #需要配置ssh,若无就直接使用https://github.com/groove-x/mqtt_bridge.git 4. 配置该repository所需环境

详情见此教程

配置环境

sudo apt install python3-pip sudo apt install ros-noetic-rosbridge-library #注意版本是noetic还是melodic sudo apt install mosquitto mosquitto-clients

安装相关依赖

sudo pip3 install -r dev-requirements.txt

PS:因为ros默认使用python2,而mqtt_bridge包使用的是python3编写的,所以此处可能会出现报错,因为需要用python3进行安装。
首先在主目录中打开显示隐藏文件选项(Crtl+H),找到.bashrc文件,在末尾加入一行代码

alias python=python3

此时你还不一定能用,因为你的pip3不一定是最新版本,所以可能无法找到比较新的依赖,而mqtt_bridge包却又使用比较新的依赖。因此要更新pip3:

sudo python3 -m pip install --upgrade pip

若出现报错则删除dev-requirements.txt里面的git+那一行。这时候,安装就没问题了,如果还有什么问题的话,翻墙即可。

sudo pip3 install -r dev-requirements.txt 5. 重新编译并配置环境变量

编译

catkin_make

配置环境变量后即可使用

source devel/setup.bash

启动自带的demo

roslaunch mqtt_bridge demo.launch 参数说明
  • conf文件的参数说明
# ================================================================= # General configuration # ================================================================= # 客户端心跳的间隔时间 #retry_interval 20 # 系统状态的刷新时间 #sys_interval 10 # 系统资源的回收时间,0表示尽快处理 #store_clean_interval 10 # 服务进程的PID #pid_file /var/run/mosquitto.pid # 服务进程的系统用户 #user mosquitto # 客户端心跳消息的最大并发数 #max_inflight_messages 10 # 客户端心跳消息缓存队列 #max_queued_messages 100 # 用于设置客户端长连接的过期时间,默认永不过期 #persistent_client_expiration # ================================================================= # Default listener # ================================================================= # 服务绑定的IP地址 #bind_address # 服务绑定的端口号 #port 1883 # 允许的最大连接数,-1表示没有限制 #max_connections -1 # cafile:CA证书文件 # capath:CA证书目录 # certfile:PEM证书文件 # keyfile:PEM密钥文件 #cafile #capath #certfile #keyfile # 必须提供证书以保证数据安全性 #require_certificate false # 若require_certificate值为true,use_identity_as_username也必须为true #use_identity_as_username false # 启用PSK(Pre-shared-key)支持 #psk_hint # SSL/TSL加密算法,可以使用“openssl ciphers”命令获取 # as the output of that command. #ciphers # ================================================================= # Persistence # ================================================================= # 消息自动保存的间隔时间 #autosave_interval 1800 # 消息自动保存功能的开关 #autosave_on_changes false # 持久化功能的开关 persistence true # 持久化DB文件 #persistence_file mosquitto.db # 持久化DB文件目录 #persistence_location /var/lib/mosquitto/ # ================================================================= # Logging # ================================================================= # 4种日志模式:stdout、stderr、syslog、topic # none 则表示不记日志,此配置可以提升些许性能 log_dest none # 选择日志的级别(可设置多项) #log_type error #log_type warning #log_type notice #log_type information # 是否记录客户端连接信息 #connection_messages true # 是否记录日志时间 #log_timestamp true # ================================================================= # Security # ================================================================= # 客户端ID的前缀限制,可用于保证安全性 #clientid_prefixes # 允许匿名用户 #allow_anonymous true # 用户/密码文件,默认格式:username:password #password_file # PSK格式密码文件,默认格式:identity:key #psk_file # pattern write sensor/%u/data # ACL权限配置,常用语法如下: # 用户限制:user # 话题限制:topic [read|write] # 正则限制:pattern write sensor/%u/data #acl_file # ================================================================= # Bridges # ================================================================= # 允许服务之间使用“桥接”模式(可用于分布式部署) #connection #address [:] #topic [[[out | in | both] qos-level] local-prefix remote-prefix] # 设置桥接的客户端ID #clientid # 桥接断开时,是否清除远程服务器中的消息 #cleansession false # 是否发布桥接的状态信息 #notifications true # 设置桥接模式下,消息将会发布到的话题地址 # $SYS/broker/connection//state #notification_topic # 设置桥接的keepalive数值 #keepalive_interval 60 # 桥接模式,目前有三种:automatic、lazy、once #start_type automatic # 桥接模式automatic的超时时间 #restart_timeout 30 # 桥接模式lazy的超时时间 #idle_timeout 60 # 桥接客户端的用户名 #username # 桥接客户端的密码 #password # bridge_cafile:桥接客户端的CA证书文件 # bridge_capath:桥接客户端的CA证书目录 # bridge_certfile:桥接客户端的PEM证书文件 # bridge_keyfile:桥接客户端的PEM密钥文件 #bridge_cafile #bridge_capath #bridge_certfile #bridge_keyfile
  • 订阅操作
mosquitto_sub 是一个简单的 mqtt 客户端,它将订阅一组主题并打印它收到的所有消息。在 libmosquitto 1.6.9 上运行的 mosquitto_sub 版本 1.6.9。 Usage: mosquitto_sub {[-h host] [-p port] [-u username] [-P password] -t topic | -L URL [-t topic]} [-c] [-k keepalive] [-q qos] [-C msg_count] [-E] [-R] [--retained-only] [--remove-retained] [-T filter_out] [-U topic ...] [-F format] [-W timeout_secs] [-A bind_address] [-i id] [-I id_prefix] [-d] [-N] [--quiet] [-v] [--will-topic [--will-payload payload] [--will-qos qos] [--will-retain]] [{--cafile file | --capath dir} [--cert file] [--key file] [--ciphers ciphers] [--insecure] [--tls-alpn protocol] [--tls-engine engine] [--keyform keyform] [--tls-engine-kpass-sha1]] [--psk hex-key --psk-identity identity [--ciphers ciphers]] [--proxy socks-url] [-D command identifier value] mosquitto_sub --help -A :将传出套接字绑定到此主机/IP 地址。用于控制客户端通过哪个接口进行通信。 -c :禁用“干净会话”(在客户端断开连接时存储订阅和未决消息)。 -C :收到“msg_count”消息后断开连接并退出。 -d :启用调试消息。 -D:定义 MQTT v5 属性。有关更多详细信息,请参阅文档。 -E :一旦经纪人确认所有订阅后退出。 -F :输出格式。 -h : 要连接的 mqtt 主机。默认为本地主机。 -i :用于此客户端的 ID。默认为 mosquitto_sub_ 附加进程 ID。 -I :将客户端 ID 定义为附加进程 ID 的 id_prefix。当代理使用 clientid_prefixes 选项时很有用。 -k :在几秒钟内为该客户端保持活动状态。默认为 60。 -L :将用户、密码、主机名、端口和主题指定为 URL,格式为:mqtt(s)://[username[:password]@]host[:port]/topic -N :打印有效负载时不添加行尾字符。 -p :要连接的网络端口。普通 MQTT 默认为 1883,基于 TLS 的 MQTT 默认为 8883。 -P:提供密码 -q :用于订阅的服务质量级别。默认为 0。 -R :不打印过时的消息(带有保留集的消息)。 -t : 要订阅的 mqtt 主题。可以重复多次。 -T :过滤掉结果的主题字符串。可能会重复。 -u :提供用户名 -U :取消订阅主题。可能会重复。 -v :详细打印发布的消息。 -V :指定连接时使用的 MQTT 协议的版本。可以是 mqttv5、mqttv311 或 mqttv31。默认为 mqttv311。 -W :以秒为单位指定处理传入 MQTT 消息的超时时间。 --help :显示此消息。 --quiet :不打印错误信息。 --retained-only :仅处理设置了保留标志的消息,并在收到第一个非保留消息时退出。 --remove-retained :向服务器发送一条消息以清除任何收到的保留消息 使用 -T 过滤掉您不想被清除的消息。 --will-payload :客户端 Will 的有效负载,由代理发送,以防意外断开连接。如果未给出并且设置了 will-topic,则将发送零长度消息。 --will-qos :客户端 Will 的 QoS 级别。 --will-retain :如果给定,使客户端将保留。 --will-topic : 发布客户端 Will 的主题。 --cafile :包含可信 CA 证书的文件的路径,以启用基于加密证书的通信。 --capath :包含可信 CA 证书以启用加密通信的目录的路径。 --cert :用于身份验证的客户端证书,如果服务器需要。 --key :如果服务器需要,用于身份验证的客户端私钥。 --keyform :密钥文件类型,可以是“pem”或“engine”。 --ciphers :要支持的 TLS 密码的 openssl 兼容列表。 --tls-version :TLS 协议版本,可以是 tlsv1.3 tlsv1.2 或 tlsv1.1 之一。如果可用,默认为 tlsv1.2。 --insecure :不检查服务器证书主机名是否与远程主机名匹配。使用此选项意味着您无法确定远程主机是您希望连接的服务器,因此不安全。不要在生产环境中使用此选项。 --tls-engine :如果设置,则启用 SSL 引擎设备。 --tls-engine-kpass-sha1 :与所选 SSL 引擎一起使用的密钥密码的 SHA1。 --psk :十六进制的预共享密钥(无前导 0x)以启用 TLS-PSK 模式。 --psk-identity :TLS-PSK 模式的客户端身份字符串。 --proxy : SOCKS5 代理 URL 的形式: socks5h://[username[:password]@]hostname[:port] 仅支持“none”和“username”身份验证。
  • 发布操作
mosquitto_pub 是一个简单的 mqtt 客户端,它将在单个主题上发布消息并退出。mosquitto_pub 版本 1.6.9 在 libmosquitto 1.6.9 上运行。 Usage: mosquitto_pub {[-h host] [-p port] [-u username] [-P password] -t topic | -L URL} {-f file | -l | -n | -m message} [-c] [-k keepalive] [-q qos] [-r] [--repeat N] [--repeat-delay time] [-A bind_address] [-i id] [-I id_prefix] [-d] [--quiet] [-M max_inflight] [-u username [-P password]] [--will-topic [--will-payload payload] [--will-qos qos] [--will-retain]] [{--cafile file | --capath dir} [--cert file] [--key file] [--ciphers ciphers] [--insecure] [--tls-alpn protocol] [--tls-engine engine] [--keyform keyform] [--tls-engine-kpass-sha1]] [--psk hex-key --psk-identity identity [--ciphers ciphers]] [--proxy socks-url] [--property command identifier value] [-D command identifier value] mosquitto_pub --help -A :将传出套接字绑定到此主机/IP 地址。用于控制客户端通过哪个接口进行通信。 -d :启用调试消息。 -D:定义 MQTT v5 属性。有关更多详细信息,请参阅文档。 -f :将文件的内容作为消息发送。 -h : 要连接的 mqtt 主机。默认为本地主机。 -i :用于此客户端的 ID。默认为 mosquitto_pub_ 附加进程 ID。 -I :将客户端 ID 定义为附加进程 ID 的 id_prefix。当代理使用 clientid_prefixes 选项时很有用。 -k :在几秒钟内为该客户端保持活动状态。默认为 60。 -L :将用户、密码、主机名、端口和主题指定为 URL,格式为:mqtt(s)://[username[:password]@]host[:port]/topic -l :从标准输入读取消息,为每一行发送单独的消息。 -m :要发送的消息有效负载。 -M : QoS 1/2 的最大飞行消息数.. -n :发送一个空(零长度)消息。 -p :要连接的网络端口。普通 MQTT 默认为 1883,基于 TLS 的 MQTT 默认为 8883。 -P:提供密码 -q :用于所有消息的服务质量级别。默认为 0。 -r :应该保留消息。 -s :从标准输入读取消息,将整个输入作为消息发送。 -t :要发布到的 mqtt 主题。 -u :提供用户名 -V :指定连接时使用的 MQTT 协议的版本。可以是 mqttv5、mqttv311 或 mqttv31。默认为 mqttv311。 --help :显示此消息。 --repeat : 如果发布模式为 -f、-m 或 -s,则重复发布 N 次。 --repeat-delay :如果使用 --repeat,则在发布之间等待时间秒数。默认为 0。 --quiet :不打印错误信息。 --will-payload :客户端 Will 的有效负载,由代理发送,以防意外断开连接。如果未给出并且设置了 will-topic,则将发送零长度消息。 --will-qos :客户端 Will 的 QoS 级别。 --will-retain :如果给定,使客户端将保留。 --will-topic : 发布客户端 Will 的主题。 --cafile :包含可信 CA 证书以启用加密通信的文件的路径。 --capath :包含可信 CA 证书以启用加密通信的目录的路径。 --cert :用于身份验证的客户端证书,如果服务器需要。 --key :如果服务器需要,用于身份验证的客户端私钥。 --keyform :密钥文件类型,可以是“pem”或“engine”。 --ciphers :要支持的 TLS 密码的 openssl 兼容列表。 --tls-version :TLS 协议版本,可以是 tlsv1.3 tlsv1.2 或 tlsv1.1 之一。如果可用,默认为 tlsv1.2。 --insecure :不检查服务器证书主机名是否与远程主机名匹配。使用此选项意味着您无法确定远程主机是您希望连接的服务器,因此不安全。不要在生产环境中使用此选项。 --tls-engine :如果设置,则启用 TLS 引擎设备。 --tls-engine-kpass-sha1 :与所选 SSL 引擎一起使用的密钥密码的 SHA1。 --psk :十六进制的预共享密钥(无前导 0x)以启用 TLS-PSK 模式。 --psk-identity :TLS-PSK 模式的客户端身份字符串。 --proxy : SOCKS5 代理 URL 的形式: socks5h://[username[:password]@]hostname[:port] 仅支持“none”和“username”身份验证。

作者: msg, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3853633.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条