树莓派系列(十四) 树莓派4B安装 docker并配置为 MQTT服务器

树莓派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
你可转载和修改文章,但必须注明原作者和原文链接,不得用于商业用途

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值