树莓派安装mqtt broker并使用python从外部访问
说明
记录一下树莓派linux的学习。 树莓派通过eth0有线连接到光猫LAN口,用超级用户访问光猫后台把树莓派设为DMZ主机,理论上可以实现公网访问,但是移动宽带貌似是大型局域网,甚至同一省级移动4G都不能访问,有点小伤心。 由于树莓派直连光猫LAN口,其他设备通过小米路由器二级路由接在另一个LAN口,所以连了小米Wi-Fi / LAN 口的设备都能访问到树莓派的MQTT服务器,实现互联。以后打算用廉价的Wi-Fi芯片把带电的东西都通过MQTT控制。
环境配置
1.PC
Windows 10 教育版 Python 3.9.5 (只要是python3 应该都能用)
安装paho-mqtt
pip install paho-mqtt
Python脚本mqtt.py
import paho.mqtt.client as mqtt
MQTTHOST = "树莓派ip"
MQTTPORT = 1883
mqttClient = mqtt.Client("服务端唯一客户标识")
mqttClient.username_pw_set("账号", "密码")
def on_mqtt_connect():
mqttClient.connect(MQTTHOST, MQTTPORT, 60)
mqttClient.loop_start()
def on_publish(topic, payload, qos):
mqttClient.publish(topic, payload, qos)
def on_message_come(lient, userdata, msg):
print('recv from ' + msg.topic + ':')
print(msg.payload.decode())
print('')
def on_subscribe():
mqttClient.subscribe("主题", 1)
mqttClient.on_message = on_message_come
def main():
on_mqtt_connect()
on_publish("主题", "Hello Python!", 1)
on_subscribe()
while True:
pass
if __name__ == '__main__':
main()
2.树莓派linux
树莓派Linux系统安装,换源请绕路
python 3.7.3
树莓派默认自带的python是pyhton2,安装python3:
sudo apt install python3
并修改软链:
cd /usr/bin
rm python
ln -s /usr/python/bin/python3 /usr/bin/python
后运行python 查看版本
python -V
输出为 Python 3.x.x 则安装成功
mosquitto-2.0.9
下载、编译
下载mosquitto需要的依赖
sudo apt-get install libssl-dev
sudo apt-get install uuid-dev
sudo apt-get install cmake
在/home 新建mqtt 路径,下载mosquitto并解压,至截稿日mosquitto官方最新的版本是2.0.9 查看所有版本
sudo mkdir ~/mqtt
cd ~/mqtt
wget http://mosquitto.org/files/source/mosquitto-2.0.9.tar.gz
解压,进入目录,编译,安装
tar zxfv mosquitto-1.5.4.tar.gz
cd mosquitto-1.5.4
sudo make
sudo make install
可能的错误 参考 使用过程中找不到libmosquitto.so.1
error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
解决办法 方法一:修改配置文件。 在文件后面追加一行/usr/local/lib
sudo vi /etc/ld.so.conf
修改后文件如下:
include /etc/ld.so.conf.d/*.conf
/usr/local/lib
方法二:建立软链
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
修改配置
mosquitto.conf.example 为提供的样板配置文件,内容全部注释,根据我们具体需求更改,参考配置详细信息。pwfile.example 文件为登录账号密码本,保存加密后的账号信息。后面设置allow_anonymous 为false 后只能通过本地建立的账号登录。
cd /etc/mosquitto/
sudo cp mosquitto.conf.example mosquitto.conf
sudo cp pwfile.example passwd.conf
sudo vi mosquitto.conf
取消以下内容的注释并修改值
user mosquitto
max_queued_messages 200
message_size_limit 0
allow_zero_length_clientid true
allow_duplicate_messages false
listener 1883
autosave_interval 900
autosave_on_changes false
persistence true
persistence_file mosquitto.db
allow_anonymous false
Password_file /etc/mosquitto/passwd.conf
添加mqtt账号
方法一:密文创建账户
sudo Mosquitto_passwd -c /etc/mosquitto/passwd.conf 用户名
输入两遍密码
例如 用户名为test01
sudo mosquitto_passwd -c /etc/mosquitto/passwd.conf test01
方法二:明文创建账户
sudo Mosquitto_passwd -b /etc/mosquitto/passwd.conf 用户名 密码
添加Linux用户
sudo adduser mosquitto
详细信息随便填
内部测试
一共需要打开3个终端
终端1: 启动mosquitto服务
mosquitto -c /etc/mosquitto/mosquitto.conf -v
终端2: 建立监听客户端,订阅主题
mosquitto_sub -p 1883 -u 用户名 -P 密码 -t 主题
终端3: 向主题发布信息
mosquitto_pub -p 1883 -u 用户名 -P 密码 -t 主题 -m 消息
-m 后参数默认为二进制流,可以用双引号包装文本,此时监听客户端应回显接收到的的信息
外部测试
终端1: 启动mosquitto服务
mosquitto -c /etc/mosquitto/mosquitto.conf -v
终端2: 建立监听客户端,订阅主题
mosquitto_sub -p 1883 -u 用户名 -P 密码 -t 主题
运行PC端mqtt.py 脚本,此时可以看到终端2输出来自py脚本的信息 或者使用测试工具登录mqtt服务器 通信猫调试助手软件下载地址:(单文件绿色版2MB)
MD5:323142df6472afd9c16dc41d1817aeb8 COMNET.exe
详见 参考
mosquitto服务开机自启
新版本删去了mosquito.service 功能,我们要自己写service文件: 在/usr/lib/systemd/system 下建立文件mosquitto.service
cd /usr/lib/systemd/system
sudo nano mosquitto.service
内容如下
[Unit]
Description=Mosquitto MQTT v3.1/v3.1.1 Broker
Documentation=man:mosquitto.conf(5) man:mosquitto(8)
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
User=mosquitto
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
启动服务,并将服务添加到开机启动
sudo systemctl start mosquitto
sudo systemctl enable mosquitto
相关参考资料 https://zhuanlan.zhihu.com/p/359395794 https://www.cnblogs.com/lnn123/p/10837754.html https://blog.csdn.net/chenchen2360060/article/details/84845047 https://shaocheng.li/posts/2015/08/11/ https://www.cnblogs.com/yuzhoumeigui/p/13695262.html
|