物联网开发笔记(55)- 使用Micropython开发ESP32开发板之MQTT(消息队列遥测传输)实战_micropython mqtt

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

        i += 1
    premsg[i] = sz

    self.sock.write(premsg, i + 2)
    self.sock.write(msg)
    # print(hex(len(msg)), hexlify(msg, ":"))
    self._send_str(self.client_id)
    if self.lw_topic:
        self._send_str(self.lw_topic)
        self._send_str(self.lw_msg)
    if self.user is not None:
        self._send_str(self.user)
        self._send_str(self.pswd)
    resp = self.sock.read(4)
    assert resp[0] == 0x20 and resp[1] == 0x02
    if resp[3] != 0:
        raise MQTTException(resp[3])
    return resp[2] & 1

def disconnect(self):
    self.sock.write(b"\xe0\0")
    self.sock.close()

def ping(self):
    self.sock.write(b"\xc0\0")

def publish(self, topic, msg, retain=False, qos=0):
    pkt = bytearray(b"\x30\0\0\0")
    pkt[0] |= qos << 1 | retain
    sz = 2 + len(topic) + len(msg)
    if qos > 0:
        sz += 2
    assert sz < 2097152
    i = 1
    while sz > 0x7F:
        pkt[i] = (sz & 0x7F) | 0x80
        sz >>= 7
        i += 1
    pkt[i] = sz
    # print(hex(len(pkt)), hexlify(pkt, ":"))
    self.sock.write(pkt, i + 1)
    self._send_str(topic)
    if qos > 0:
        self.pid += 1
        pid = self.pid
        struct.pack_into("!H", pkt, 0, pid)
        self.sock.write(pkt, 2)
    self.sock.write(msg)
    if qos == 1:
        while 1:
            op = self.wait_msg()
            if op == 0x40:
                sz = self.sock.read(1)
                assert sz == b"\x02"
                rcv_pid = self.sock.read(2)
                rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
                if pid == rcv_pid:
                    return
    elif qos == 2:
        assert 0

def subscribe(self, topic, qos=0):
    assert self.cb is not None, "Subscribe callback is not set"
    pkt = bytearray(b"\x82\0\0\0")
    self.pid += 1
    struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
    # print(hex(len(pkt)), hexlify(pkt, ":"))
    self.sock.write(pkt)
    self._send_str(topic)
    self.sock.write(qos.to_bytes(1, "little"))
    while 1:
        op = self.wait_msg()
        if op == 0x90:
            resp = self.sock.read(4)
            # print(resp)
            assert resp[1] == pkt[2] and resp[2] == pkt[3]
            if resp[3] == 0x80:
                raise MQTTException(resp[3])
            return

# Wait for a single incoming MQTT message and process it.
# Subscribed messages are delivered to a callback previously
# set by .set_callback() method. Other (internal) MQTT
# messages processed internally.
def wait_msg(self):
    res = self.sock.read(1)
    self.sock.setblocking(True)
    if res is None:
        return None
    if res == b"":
        raise OSError(-1)
    if res == b"\xd0":  # PINGRESP
        sz = self.sock.read(1)[0]
        assert sz == 0
        return None
    op = res[0]
    if op & 0xF0 != 0x30:
        return op
    sz = self._recv_len()
    topic_len = self.sock.read(2)
    topic_len = (topic_len[0] << 8) | topic_len[1]
    topic = self.sock.read(topic_len)
    sz -= topic_len + 2
    if op & 6:
        pid = self.sock.read(2)
        pid = pid[0] << 8 | pid[1]
        sz -= 2
    msg = self.sock.read(sz)
    self.cb(topic, msg)
    if op & 6 == 2:
        pkt = bytearray(b"\x40\x02\0\0")
        struct.pack_into("!H", pkt, 2, pid)
        self.sock.write(pkt)
    elif op & 6 == 4:
        assert 0

# Checks whether a pending message from server is available.
# If not, returns immediately with None. Otherwise, does
# the same processing as wait_msg.
def check_msg(self):
    self.sock.setblocking(False)
    return self.wait_msg()

第1和第3步要编写的自己的代码,文件名字`MQTT_Test.py`,内容如下



import time
import network
from umqttsimple import MQTTClient

ESP32连接无线网

def do_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print(‘connecting to network…’)
wlan.connect(‘TP-LINK_33E4’, ‘2019AP3029’) # WIFI名字和密码
i = 1
while not wlan.isconnected():
print(“正在链接中…{}”.format(i))
i += 1
time.sleep(1)
print(‘network config:’, wlan.ifconfig())

def sub_cb(topic, msg): # 回调函数,收到服务器消息后会调用这个函数
print(topic, msg)

1. 联网

do_connect()

2. 创建mqtt

c = MQTTClient(“umqtt_client”, “192.168.0.102”) # 建立一个MQTT客户端,这个IP是电脑的IP地址
c.set_callback(sub_cb) # 设置回调函数
c.connect() # 建立连接
c.subscribe(b"ledctl") # 监控ledctl这个通道,接收控制命令

while True:
c.check_msg()
time.sleep(1)


运行程序:


![](https://img-blog.csdnimg.cn/e5828f2ce75143729b7de7788b76081d.png)


这里我们完成了ESP32充当MQTT客户端,自己的电脑充当MQTT服务器。


**五、电脑上安装MQTT客户端**


        MQTT是C/S架构模式,我们已经在电脑上安装了MQTT服务器,在ESP32编写了MQTT客户端程序。下面,我们将要在另外一台设备(电脑)上也运行MQTT客户端,最终实现让这个新的客户端发送控制命令给ESP32,最终实现控制ESP32上的LED的亮灭。


![](https://img-blog.csdnimg.cn/402125a289224b7fb0ab0b4c5e95f97f.png)


 我们需要在另外一台电脑上安装MQTT客户端,下载链接如下:


[MQTT X:跨平台 MQTT 5.0 桌面客户端工具](https://bbs.csdn.net/topics/618317507)


![](https://img-blog.csdnimg.cn/98ab5acf56ef4d478e3fad325707bdbe.png)


 然后按照默认安装即可。


我这里为了方便,把客户端和服务端直接安装在同一台电脑上哈。。。


安装完成后,我们打开MQTT客户端:


![](https://img-blog.csdnimg.cn/8c673aee15fc4a2793fc6c72c19d54ae.png)


 然后我们连接MQTT服务器。注意:


首先要确保MQTT服务器是运行的,如果电脑重启,那么上次运行的MQTT服务器就不会自动运行,需要用上面相同的方式将MQTT服务器运行起来,所以先用浏览器方式`http://localhost:18083/`看看能否打开,如果打开就说明MQTT服务器运行正常,否则需要手动开启MQTT服务器。


我们选择 New Connection:


,填写如下信息,注意这个IP地址是MQTT服务器的地址:


![](https://img-blog.csdnimg.cn/73a6092a83754851980e373c6541923d.png)


然后会提示连接成功:


![](https://img-blog.csdnimg.cn/9ca46d996e6c4000b0979771cde22304.png)


 然后我们在MQTT服务端,可以看到连接成功:


![](https://img-blog.csdnimg.cn/44cf727fbd2f40f896675aee9ce1d01d.png)


 我们这里只运行了一个客户端,所以只有一个,ESP32客户端没有运行。


**六、ESP32上运行新的客户端程序**


将前面的ESP32 MQTT客户端的代码,加上控制LED的代码:



import time
from machine import Pin
import network
from umqttsimple import MQTTClient

创建WIFI连接函数

def do_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print(‘connecting to network…’)
wlan.connect(‘名字’, ‘密码’) # WIFI名字和密码
i = 1
while not wlan.isconnected():
print(“正在链接中…{}”.format(i))
i += 1
time.sleep(1)
print(‘network config:’, wlan.ifconfig())

def sub_cb(topic, msg): # 回调函数,收到服务器消息后会调用这个函数
print(topic, msg)
if topic.decode(“utf-8”) == “BlueLED” and msg.decode(“utf-8”) == “on”:
led_pin.value(1)
elif topic.decode(“utf-8”) == “BlueLED” and msg.decode(“utf-8”) == “off”:
led_pin.value(0)

1. 联网

do_connect()

2. 创建mqt

c = MQTTClient(“umqtt_client”, “192.168.0.102”) # 建立一个MQTT客户端。IP为MQTT服务器的IP
c.set_callback(sub_cb) # 设置回调函数
c.connect() # 建立连接
c.subscribe(b"BlueLED") # 监控ledctl这个通道,接收控制命令

3. 创建LED对应Pin对象

led_pin = Pin(2, Pin.OUT) # 通过GPIO口2控制ESP32板载的蓝色LED灯

while True:
c.check_msg()
time.sleep(1)


我们运行上面代码,在MQTT服务端,会看到连接成功:


![](https://img-blog.csdnimg.cn/19aac1dbe74e4a80b06fde172f7acc72.png)


 此时ESP32 板载蓝色LED灯还是不亮的哦~


**七、在电脑的MQTT客户端上发送消息**


当前发送的主题是`BlueLED`(与上述代码中的ESP32订阅的消息一样),发送的内容是`on。`


![](https://img-blog.csdnimg.cn/17eccb3c9ea54a14bd8c009ff711dbae.png)


 然后我们就会看到ESP32板载LED灯亮了。


![](https://img-blog.csdnimg.cn/ee7a955fc92944b8834c85ed673f9578.png)


然后我们再发送off,会看在灯灭了


![](https://img-blog.csdnimg.cn/d6af22a984544d66b4328382e6d01a30.png)


 ![](https://img-blog.csdnimg.cn/939011e0e2994edd85a491c91fc50f59.png)


 **七、在手机上的MQTT客户端上发送消息**


         以上我们实现了再电脑的MQTT客户端发送消息,控制ESP32客户端的蓝色LED灯。那么下面我们讲解怎么在手机上运行MQTT服务端来控制ESP32客户端的蓝色LED灯。


        此处我使用安卓系统的小米10手机为大家演示,大家现在手机自带的应用商店中搜索"MQTT调试器"并安装,安装成功后打开。我安装时版本是1.0.8。


        在开始之前,我们检查下我们的MQTT服务器应该开启,没开启的请查看本文上方的章节。


我们MQTT服务器会成功连接3个客户端,一个是电脑客户端,一个是手机客户端,一个是ESP32客户端。如下图MQTT服务器显示:


![](https://img-blog.csdnimg.cn/dd592d9fc1584e0583c41f124b212830.png)


 好啦,我们在手机上打开MQTT调试器,按照下面步骤操作:




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值