2021-9-25 MQTT 阿里云服务器 esp32 micropython物联 以及pythonPC端

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

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

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

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

启动后在浏览器中输入

http://IP地址:18083

打开控制台,如果本机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. 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)#前边是主题 后边是消息

接收端的写法

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() # 阻塞并保持连接

关于连接超时 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

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

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

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

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

然后配置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) #延时,别刷屏

这里贴个连接,是关于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  #这个改成这样

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

重启MQTT服务器

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

emqx_ctl user list

下面是添加用户

emqx_ctl user add 用户名 密码

修改用户密码

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

删除用户

emqx_ctl user del 用户名

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

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32S3连接阿里云服务器可以使用ESP-IDF自带的MQTT客户端库,需要进行以下配置: 1. 在阿里云控制台创建一个MQTT实例,并获取到实例的Endpoint、Client ID、Username和Password。 2. 在ESP-IDF工程中,打开menuconfig界面,选择“Component Config” -> “ESP-MQTT” -> “MQTT Client Configuration”,进行如下配置: - MQTT Broker URI: 在此处输入阿里云MQTT实例的Endpoint,格式为“ssl://[Endpoint]:[Port]”,Port为1883或8883,如果使用SSL加密,需要选择8883端口。 - MQTT Client ID: 在此处输入阿里云MQTT实例的Client ID。 - MQTT Username: 在此处输入阿里云MQTT实例的Username。 - MQTT Password: 在此处输入阿里云MQTT实例的Password。 - MQTT Transport Type: 选择“MQTT_TRANSPORT_OVER_SSL”或“MQTT_TRANSPORT_OVER_TCP”,根据阿里云MQTT实例的协议类型选择。 3. 在代码中,使用esp_mqtt_client_init函数初始化MQTT客户端,并设置esp_mqtt_client_config_t结构体的相关参数,示例代码如下: ``` esp_mqtt_client_config_t mqtt_cfg = { .uri = "ssl://[Endpoint]:8883", .client_id = "[Client ID]", .username = "[Username]", .password = "[Password]", .transport = MQTT_TRANSPORT_OVER_SSL, //或MQTT_TRANSPORT_OVER_TCP }; esp_mqtt_client_handle_t mqtt_client = esp_mqtt_client_init(&mqtt_cfg); ``` 4. 在代码中,使用esp_mqtt_client_start函数启动MQTT客户端,示例代码如下: ``` esp_err_t err = esp_mqtt_client_start(mqtt_client); if (err != ESP_OK) { printf("MQTT client start failed: %s\n", esp_err_to_name(err)); } ``` 5. 在代码中,使用esp_mqtt_client_subscribe函数订阅MQTT主题,并使用esp_mqtt_client_publish函数发布MQTT消息,示例代码如下: ``` esp_mqtt_client_subscribe(mqtt_client, "/test/topic", 0); esp_mqtt_client_publish(mqtt_client, "/test/topic", "Hello, MQTT!", 0, 0, 0); ``` 以上就是ESP32S3连接阿里云服务器MQTT客户端配置方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值