当前位置:   article > 正文

2021-9-25 MQTT 阿里云服务器 esp32 micropython物联 以及pythonPC端_esp32+micropython+阿里云物联网平台

esp32+micropython+阿里云物联网平台

MQTT这个并不太复杂,逻辑简单组件零碎,记录下

  1. 去官网下个对应版本的现成的服务器 https://www.emqx.io/downloads
  2. 进入bin目录,启动服务器:
/bin/emqx start
  • 1

这里有个坑,如果服务器版本是WINDOWS 2019 数据中心的云服务器镜像则会提示少.DLL 解决办法下载是 2013的C++ redist (别下高版本的2015)下载地址为

https://www.microsoft.com/zh-CN/download/details.aspx?id=40784
  • 1

启动后在浏览器中输入

http://IP地址:18083
  • 1

打开控制台,如果本机IP就是127.0.0.1,如果是云服务器则注意将服务器安全组里边的18083端口打开。

默认管理账号:admin 密码:public , 界面里还可以将界面设置成中文很友好

打开阿里云安全组的1883端口 用来订阅和发布,也就是具体干活的端口

如果使用官方网站上那个调试程序

还要在云服务器上打开8083端口才能使用。

EMQ X 默认提供 5 个 Listener,它们将占用以下端口:
端口	说明
1883	MQTT/TCP 协议端口
11883	MQTT/TCP 协议内部端口,仅用于本机客户端连接
8883	MQTT/SSL 协议端口
8083	MQTT/WS 协议端口
8084	MQTT/WSS 协议端口
下面分别是PC最简程序和ESP32最简程序的写法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

1. pc端

pip install paho-mqtt

发送端的写法

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))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set('esp32', password='esp32')  #需要验证账号密码就带上这句,准许匿名就不带这句
client.connect('ip地址', 1883, 600) # 600为keepalive的时间间隔,也就是发布周期,一般来说一次连接保证在发布周期内再次发送即可确保不掉线。
client.publish('esp32', payload='wo shi nei rong  ', qos=0)#前边是主题 后边是消息

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

接收端的写法

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))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set('esp32', password='esp32')  #这里也是:需要验证账号密码就带上这句,准许匿名就不带这句
client.connect('ip地址', 1883, 600) # 600为keepalive的时间间隔
client.subscribe('esp32', qos=0)#前边是主题
client.loop_forever() # 阻塞并保持连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

关于连接超时 loop(),这个有点像心跳包也有点像喂狗函数反正就是规定时间内要么发数据或者执行下loop()

tips:闭坑指南,这个KEEPALIVE 时间间隔,不应该设置过大,参照官方客户端的60秒比较稳妥,600秒这个设置,我在分钟级进行了测试,发现会侦听重连而且一旦重连收不到订阅。

client.connect('127.0.0.1', 1883, 5) # keeplive仅为5for i in range(100):
    client.publish('fifa', payload=f'amazing{i}', qos=0)
    # client.loop() # 或者loop()
    time.sleep(4) # 不能超过5
  • 1
  • 2
  • 3
  • 4
  • 5

对于订阅客户端,一种方法是使用loop_start()保持连接,然后写个死循环阻塞程序,保持监听。

client.connect('127.0.0.1', 1883, 5)
client.subscribe('fifa', qos=0)
client.loop_start()
while True:
    pass
  • 1
  • 2
  • 3
  • 4
  • 5

当然像之前的写法直接阻塞也是可以的.

tips闭坑指南:在云服务器上运行订阅端不能在死循环里写个PASS就完事,他会耗尽CPU的,要适当的睡眠让服务器调度资源降低CPU占用率。

2.ESP32上的写法

首先要让ESP32联网

import time
import network
wl=network.WLAN(network.STA_IF)
wl.active(True)
def lan_on_off():
  if wl.isconnected()==0:
    while wl.isconnected()==0 :
      wl.connect('300king','13704677369')
      time.sleep(10)
lan_on_off()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后配置MQTT

将下面的库存为mqtt1.py然后主函数安装程序底部方式调用,唯一要注意的是:如果仅仅是发送数据那就调用库就行,但是如果要接收消息,那么要在这个类的处理函数位置填充业务逻辑代码的,(作为一个传感器,应该没啥复杂逻辑,也就几行知道在哪填就行)

from umqtt.simple import MQTTClient
import time 
class Mqtt_run():
    def __init__(self,CLIENT_ID,ip,name_id,password,list_sub):# 设备名 , 服务器地址,端口 , 账号, 密码,订阅列表
    	
        self.mqtt_mast=MQTTClient(CLIENT_ID,ip,1883,name_id,password)
        while 1:
            try:
                self.mqtt_mast.connect()
            except:
                continue
            break
        self.mqtt_mast.set_callback(self.recdate1)# 绑定回调函数,名字别错
        for i in list_sub:
            self.mqtt_mast.subscribe(i)#设置订阅的主体,这里是123
    def recdate1(self,t,m):#这是回调函数,有信息并触发后都在这里执行
      ###############我就是填充业务逻辑的地方###############
      print("我在这里运行",t,m)
      ##################################################
if __name__=='__main__':
    #from mqtt1 import Mqtt_run
    a=Mqtt_run('cam','xx.xx.x.x','esp32','esp32',['123','456']) #设备名 , 服务器地址,端口 , 账号, 密码,订阅列表
    while 1:
        a.mqtt_mast.check_msg() #轮询消息,主函数中周期越快越好,没这个就听不叫了
        a.mqtt_mast.publish('456','fffad') # *****前边是发往哪个主题,后面是内容 发送数据*****************************
        time.sleep(5) #延时,别刷屏
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这里贴个连接,是关于micropython的MQTT库的一些说明:

https://www.cnpython.com/pypi/micropython-umqttsimple

模块端完毕然后是下一步的补充。~

3、在服务端启动验证

首先在后台管理端选插件选项,然后启动

emqx_auth_mnesia

使其运行。
然后在器目录下寻找

emqx\etc\emqx.conf

后缀为。conf 的文件并打开
在文件内部查找

allow_anonymous = false   #  False  # 这是关闭准许匿名 注意false是全小写
acl_nomatch = deny  #这个改成这样
  • 1
  • 2

tips:闭坑指南 这里更改尽量使用专业的编辑器,记事本之类的打开修改可能造成编码问题无法解析第一行第一列的提示,使用WINDOWS云服务器一般远程都没有好的编辑器那就弄回来改再传上去。

重启MQTT服务器

然后在BIN 目录下
查询用户,没有则空

emqx_ctl user list
  • 1

下面是添加用户

emqx_ctl user add 用户名 密码
  • 1

修改用户密码

emqx_ctl user update 用户名 密码 #将用户名的密码更新为新密码
  • 1

删除用户

emqx_ctl user del 用户名
  • 1

写在最后,别忘记重启服务器。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/188535
推荐阅读
相关标签
  

闽ICP备14008679号