树莓派4B安装 docker并配置为 MQTT服务器
流程简单,新手10分钟可以配置完🏆
1.安装docker
安装docker
下载安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
由于我买了树莓派4B,安装了Buster系统,于是我看了一下这个链接的shell脚本,已经支持了buster安装(可以在脚本中搜索buster)
执行脚本,使用阿里镜像
sudo sh get-docker.sh --mirror Aliyun
启动docker
sudo systemctl enable docker
sudo systemctl start docker
带sudo,docker需要root权限
sudo docker version #查看版本
配置国内镜像
mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' #第二步到此处
> {
> "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
> }
> EOF
重启docker生效
sudo systemctl daemon-reload
sudo systemctl restart docker
注: 树莓派是arm架构,arm平台不能使用x86镜像,查看 Raspbian 可使用镜像请访问 arm32v7 。
配置docker图形化界面
#下载 Docker 图形化界面 portainer
sudo docker pull portainer/portainer
#创建 portainer 容器
sudo docker volume create portainer_data
#运行 portainer
sudo docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
运行之后在浏览器中输入树莓派IP:9000 进入界面。首次访问需要设定登录密码。
2.配置EMQ X
EMQ X (Erlang/Enterprise/Elastic MQTT Broker)
是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。
下载网址:https://www.emqx.com/zh/downloads?product=enterprise
以下命令在树莓派的命令行中运行
拉取docker镜像
docker pull emqx/emqx:4.3-rc.5
启动docker容器
docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:4.3-rc.5
用 树莓派IP:1883 进入EMQ X服务器后台
默认账号:admin
默认密码:public
3.测试的代码
发布消息
# -*- coding:utf-8 -*-
"""
作者:mosu
日期:2021年09月22日
"""
# -*- coding: utf-8 -*-# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import time
# 链接回调
def on_connect(client, userdata, flags, rc):
print ("链接")
print("Connected with result code: " + str(rc))
# 消息内容回调
def on_message(client, userdata, msg):
print("消息内容")
print(msg.topic + " " + str(msg.payload))
# 订阅回调
def on_subscribe(client, userdata, mid, granted_qos):
print("订阅")
print("On Subscribed: qos = %d" % granted_qos)
pass
# 取消订阅回调
def on_unsubscribe(client, userdata, mid, granted_qos):
print("取消订阅")
print("On unSubscribed: qos = %d" % granted_qos)
pass
# 发布消息回调
def on_publish(client, userdata, mid):
print("发布消息")
print("On onPublish: qos = %d" % mid)
pass
# 断开链接回调
def on_disconnect(client, userdata, rc):
print("断开链接")
print("Unexpected disconnection rc = " + str(rc))
pass
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.on_disconnect = on_disconnect
client.on_unsubscribe = on_unsubscribe
client.on_subscribe = on_subscribe
# keepalive 心跳间隔,单位是秒,如果 broker 和 client 在这段时间内没有任何通讯,client 会给 broker 发送一个 ping 消息
# retain 如果设为 Ture ,这条消息会被设为保留消息
client.connect('树莓派IP', 1883, 60) # 60为keepalive的时间间隔
while True:
client.publish(topic='mqtt11', payload='amazing', qos=0, retain=False)
time.sleep(5)
接收消息
# -*- coding:utf-8 -*-
"""
作者:mosu
日期:2021年09月22日
"""
import paho.mqtt.client as mqtt
# 链接回调
def on_connect(client, userdata, flags, rc):
print("Connected with result code: " + str(rc))
# 消息信息回调
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
# 订阅回调
def on_subscribe(client, userdata, mid, granted_qos):
print("On Subscribed: qos = %d" % granted_qos)
pass
# 取消订阅回调
def on_unsubscribe(client, userdata, mid):
print("取消订阅")
print("On unSubscribed: qos = %d" % mid)
pass
# 发布消息回调
def on_publish(client, userdata, mid):
print("发布消息")
print("On onPublish: qos = %d" % mid)
pass
# 断开链接回调
def on_disconnect(client, userdata, rc):
print("断开链接")
print("Unexpected disconnection rc = " + str(rc))
pass
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.on_disconnect = on_disconnect
client.on_unsubscribe = on_unsubscribe
client.on_subscribe = on_subscribe
client.connect('树莓派IP', 1883, 60) # 60为keepalive的时间间隔
#当 qos>0 时,发送消息队列的最大值,默认是 0 ,表示无限制。当队列满时,旧消息会丢弃。
client.subscribe('mqtt11', qos=0)
#loop_forever() => 该函数是保持永久连接, 阻塞式,可结合多线程或多进程的方式使用
client.loop_forever() # 保持连接
看以下树莓派上部署的服务器的情况
这时候说明我们的部署是没有问题的!
有问题欢迎在评论区留言。
文章版权声明:自由转载-非商用-保持署名|Creative Commons BY-NC 3.0
你可转载和修改文章,但必须注明原作者和原文链接,不得用于商业用途