树莓派安装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

# encoding: utf-8
import paho.mqtt.client as mqtt

# Client对象构造
MQTTHOST = "树莓派ip"
MQTTPORT = 1883
mqttClient = mqtt.Client("服务端唯一客户标识")
mqttClient.username_pw_set("账号", "密码")


# 连接MQTT服务器
def on_mqtt_connect():
    mqttClient.connect(MQTTHOST, MQTTPORT, 60)
    mqttClient.loop_start()

# publish 消息
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('')

# subscribe 消息
def on_subscribe():
    # 订阅监听自定义Topic
    mqttClient.subscribe("主题", 1)
    mqttClient.on_message = on_message_come # 消息到来处理函数


def main():
    on_mqtt_connect()
    # 自定义Topic消息上行
    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_anonymousfalse后只能通过本地建立的账号登录。

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

  • 12
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值