文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**