
- 一.移植MicroPython
- 二. 连接wifi 案例
- 三.进行mqtt 双向通信
- 1. 使用免费公告mqtt服务器
- 2.使用esp8266 发布订阅信息
- 3.使用python 发布订阅消息
- 需要嵌入式软件定制开发进群
》》》》》》》》》》
这块板子的淘宝链接》
》》》》》》》》》》
1.用microusb 数据线连接到电脑上,找到对应的串口号 这里是52,找不到端口的下载并安装串口驱动
- 使用flash_download_tools烧录microPython 固件 文件下载
- 使用thonny IDE进行开发 下载安装包
选择esp8266的端口
测试microPython
打开文件系统
到此环境准备完毕
新建一个main.py 的文件
import network,time
from machine import I2C,Pin
#初始化相关模块
i2c = I2C(sda=Pin(13), scl=Pin(14))
#WIFI连接函数
def WIFI_Connect():
WIFI_LED=Pin(2, Pin.OUT, value=1) #初始化WIFI指示灯
wlan = network.WLAN(network.STA_IF) #STA模式
wlan.active(True) #激活接口
start_time=time.time() #记录时间做超时判断
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('Xiaomi_3D6D', '!!!!tl820808') #输入WIFI账号密码
while not wlan.isconnected():
#LED闪烁提示
WIFI_LED.value(0)
time.sleep_ms(300)
WIFI_LED.value(1)
time.sleep_ms(300)
#超时判断,15秒没连接成功判定为超时
if time.time()-start_time > 15 :
print('WIFI Connected Timeout!')
break
if wlan.isconnected():
#LED点亮
WIFI_LED.value(0)
#串口打印信息
print('network information:', wlan.ifconfig())
#执行WIFI连接函数
WIFI_Connect()
显示成功连接到wifi,灯光从闪烁变为常亮,ip为192.168.31.70。
三.进行mqtt 双向通信 1. 使用免费公告mqtt服务器broker-cn.emqx.io
关于不同端口
tcp:1883
tls: 8883
WebSocket: 8083,8084
我们esp8266用的tcp 所以一定要1883端口
2.使用esp8266 发布订阅信息需要新建两个文件
main.py
import network,time
from simple import MQTTClient #导入MQTT板块
from machine import I2C,Pin,Timer
#初始化相关模块
i2c = I2C(sda=Pin(13), scl=Pin(14))
#WIFI连接函数
def WIFI_Connect():
WIFI_LED=Pin(2, Pin.OUT, value=1) #初始化WIFI指示灯
wlan = network.WLAN(network.STA_IF) #STA模式
wlan.active(True) #激活接口
start_time=time.time() #记录时间做超时判断
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('Xiaomi_3D6D', '!!!!tl820808') #输入WIFI账号密码
while not wlan.isconnected():
#LED闪烁提示
WIFI_LED.value(0)
time.sleep_ms(300)
WIFI_LED.value(1)
time.sleep_ms(300)
#超时判断,15秒没连接成功判定为超时
if time.time()-start_time > 60 :
print('WIFI Connected Timeout!')
break
if wlan.isconnected():
#LED点亮
WIFI_LED.value(0)
#串口打印信息
print('network information:', wlan.ifconfig())
return True
else:
return False
#接收数据任务
def MQTT_Rev():
client.check_msg()
#发布数据任务
def MQTT_Send():
client.publish(TOPICSEND, 'Hello esp8266')
#设置MQTT回调函数,有信息时候执行
def MQTT_callback(topic, msg):
print('topic: {}'.format(topic))
print('msg: {}'.format(msg))
# 定时任务
def task(tim):
MQTT_Rev()
MQTT_Send()
#执行WIFI连接函数并判断是否已经连接成功
if WIFI_Connect():
SERVER = 'broker-cn.emqx.io'
PORT = 1883
CLIENT_ID = 'xxxx' # 客户端ID
TOPICREV = 'testtopic/1' # 发送节点
TOPICSEND = 'testtopic/2' # 接收节点
client = MQTTClient(CLIENT_ID, SERVER, PORT)
client.set_callback(MQTT_callback) #配置回调函数
client.connect()
client.subscribe(TOPICREV) #订阅主题
#开启RTOS定时器,编号为-1,周期1000ms,执行socket通信接收任务
tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC,callback=task)
以下代码保存为 simple.py
import usocket as socket
import ustruct as struct
from ubinascii import hexlify
class MQTTException(Exception):
pass
class MQTTClient:
def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,
ssl=False, ssl_params={}):
if port == 0:
port = 8883 if ssl else 1883
self.client_id = client_id
self.sock = None
self.server = server
self.port = port
self.ssl = ssl
self.ssl_params = ssl_params
self.pid = 0
self.cb = None
self.user = user
self.pswd = password
self.keepalive = keepalive
self.lw_topic = None
self.lw_msg = None
self.lw_qos = 0
self.lw_retain = False
def _send_str(self, s):
self.sock.write(struct.pack("!H", len(s)))
self.sock.write(s)
def _recv_len(self):
n = 0
sh = 0
while 1:
b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh
if not b & 0x80:
return n
sh += 7
def set_callback(self, f):
self.cb = f
def set_last_will(self, topic, msg, retain=False, qos=0):
assert 0 <= qos <= 2
assert topic
self.lw_topic = topic
self.lw_msg = msg
self.lw_qos = qos
self.lw_retain = retain
def connect(self, clean_session=True):
self.sock = socket.socket()
addr = socket.getaddrinfo(self.server, self.port)[0][-1]
self.sock.connect(addr)
if self.ssl:
import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
premsg = bytearray(b"\x10)=bytearray(b"\x04MQTT\x04\x02)=""10
msg + 2+len(
sz . ) [ 6 ] =<<self1client_idif
msg.isnot None clean_session : +=
2 self+user len ( .)
sz + 2 + len(self.user) [ 6 ] |=self0xC0pswdif
msg.:assert .< 65536
[ self7keepalive]
| self=keepalive . 8
msg[8] |= self.keepalive >> &
msg0x00FFif. :+= self2keepalive + len
( self.lw_topic)
sz + 2 + len(self.lw_topic) [ 6 ] |=self0x4lw_msg|
msg(.& 0x1) << 3 |self(lw_qos . &0x2 ) << 3 [self6lw_qos ] |= . <<
msg5=1 while0x7f self:lw_retain [ ]
i = (
& sz > 0x7f)
premsg|i0x80 = 7sz += 1[ ] =
sz >>. .
i ( ,
premsg+i2 ) sz
self.sock.write(premsg) i #print(hex(len(msg)), hexlify(msg, ":")) .(
self.sock)writeifmsg.
:
self._send_str(self.client_id)
. self(lw_topic.
self)_send_strifself.lw_topicis
selfnot_send_strNoneself:lw_msg.
( self.user ) . (.
self)_send_str=self.user.
self(_send_str4self)pswdassert
resp [ self0sock]read==0x20and
[ resp1]== 0x02 if [ resp3]!= 0 :
raise resp([3 ] )return
[ MQTTException2resp]&1def
disconnect resp(): . .
( b"\xe0)".self.(
self)sockdefwriteping()
self:sock.close.(
b"\xc0)" defpublishself(,
self,sock,write=False,
= 0)self: topic= msgbytearray retain(b"\x30)[0"] qos|=<<1
pkt | =2+len
pkt()+ len( qos ) if 0 retain
sz : += 2 assert<topic2097152 = 1whilemsg0x7f
: qos > []
sz = (
& sz 0x7f )
i | 0x80
= sz > 7+=
pkt1i[ ] =sz #print(hex(len(pkt)), hexlify(pkt, ":")) .. ( ,
sz >>+ 1
i ) .
pkt(i) if sz
0
self:sock.write+=pkt1 i = ..
self(_send_str"!H"topic,
, qos > 0,
self)pid . .
pid ( self,pid
struct2pack_into).. pkt( )if pid==
self1sock:writewhilepkt1 :=
self.sock(write)msgif
== qos 0x40 :=
. .(
op 1 self)wait_msgassert==
b"\x02" op = ..
sz ( self2sock)read=[0
] sz << 8
rcv_pid | self[sock1read]if==
rcv_pid : rcv_pidreturnelif== 2 : assert rcv_pid0defsubscribe
( pid , rcv_pid,
=
0 qos ) :assert
. is
not None,self"Subscribe callback is not set" topic= qosbytearray(b"\x82).+="1
. self(cb "!BH" , ,1 ,
pkt 2 +2+len
self(pid ) +
struct1pack_into,.) pkt#print(hex(len(pkt)), hexlify(pkt, ":")) .. ( ) . ( ).topic. ( .( self1pid,
"little"
self)sock)writewhilepkt1
self:_send_str=topic.
self(sock)writeifqos==to_bytes0x90:= ..(
4 )#print(resp)
op assert self[wait_msg1]
== op [ 2]
resp and self[sock2read]==[
3
] respif[3 ] pkt==0x80: raise resp([3 ] pkt)return# Wait for a single incoming MQTT message and process it.
# Subscribed messages are delivered to a callback previously resp# set by .set_callback() method. Other (internal) MQTT# messages processed internally.def wait_msg ()
: MQTTException=resp..(1
)
.
.
(
True
) ifisselfNone:
res return selfNonesockifread==b"":
selfraisesock(setblocking-1)
if res == b"\xd0":
# PINGRESP =
. res . (1
) OSError[0]assert
== res 0 returnNone =
sz [ self0sock]readif&0xf0!=0x30:
return sz = .
( )
op = res..(
2 op ) = ( [0
] op
sz << self8_recv_len)|
topic_len [ self1sock]read=..
topic_len ( )topic_len-=+2 if &6 : topic_len=..
topic ( self2sock)read=topic_len[
sz 0 topic_len ] <<
8 op | [1
pid ] self-=sock2read=..
pid ( pid).( , ) if pid&6==
sz 2 :
msg = selfbytearraysock(readb"\x40\x02)."sz(
self"!H"cb,topic, msg2
, op ) . . ()
pkt elif &6==4
struct:pack_intoassert0# Checks whether a pending message from server is available. pkt# If not, returns immediately with None. Otherwise, does # the same processing as wait_msg.def pidcheck_msg
self(sock)write:pkt.
. op ( False ) return.
( )
-
#!/usr/bin/ python
# -*- encoding: utf-8 -*-
'''
@文件 :mqtt.py
@说明 :
@时间 :2022/05/02 19:12:54
@作者 :刘子沫
@邮箱 :spiritai@qq.com
@版本 :1.0
''' import.self.as
selffromsockimportsetblockingimportimport=
"broker-cn.emqx.io" self=wait_msg1883=
将 main.py 里面的wifi换成自己的
修改mqtt id, topic 可以自己设置一个 类似 test/1
然后上传到开发板里面
然后直接运行脚本
安装mqtt
pip install paho"mqttx_d13434c"mqtt
新建文件mqtt.py
# 客户端ID
def
on_connect
( paho,mqtt,client , mqtt
) threading : Thread
print json
( time
HOST "Connected with result code " +
PORT str (
client_id ) ) .
( "testtopic/2")client# 订阅消息 userdatadef flagson_message rc(,
,):print("主题:"rc+.
client+subscribe" 消息:"+str (
. .(client'utf-8' userdata) msg))
defon_subscribe(,msg,topic,):print(msg"On Subscribed: qos = %d"payload%decode)defon_disconnect(,
, ):clientif userdata!= mid0 granted_qos:print
("Unexpected disconnection %s"% ) granted_qosdef
send_message ()client: userdatafor rcinrange
( rc 10000 ):
.("testtopic/1" , rc"Hello, World!"
) .(1)
= i . ().("xxxxxx"
client,publish"xxxxxx"). =.
time=sleep.=.
client = mqtt.Client(client_id,
client,username_pw_set60)( =)
client.on_connect ( on_connect
client)on_message . on_message
client(on_subscribe ) on_subscribe
clienton_disconnect on_disconnect
clientconnectHOST PORT
Threadtargetsend_messagestart
clientloop_forever
修改里面的id
运行
python 收到esp8266 发过来的信息
esp8266 收到python 主机发过来 的信息
686070107
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)