esp8266 NodeMCU v3 实现wifi远程 mqtt 通信

esp8266 NodeMCU v3 实现wifi远程 mqtt 通信,第1张

esp8266 NodeMCU v3物联网开发
  • 一.移植MicroPython
  • 二. 连接wifi 案例
  • 三.进行mqtt 双向通信
    • 1. 使用免费公告mqtt服务器
    • 2.使用esp8266 发布订阅信息
    • 3.使用python 发布订阅消息
  • 需要嵌入式软件定制开发进群


》》》》》》》》》》
这块板子的淘宝链接》
》》》》》》》》》》

一.移植MicroPython

1.用microusb 数据线连接到电脑上,找到对应的串口号 这里是52,找不到端口的下载并安装串口驱动

  1. 使用flash_download_tools烧录microPython 固件 文件下载

  2. 使用thonny IDE进行开发 下载安装包

    选择esp8266的端口

    测试microPython

    打开文件系统

    到此环境准备完毕
二. 连接wifi 案例

新建一个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

然后上传到开发板里面

然后直接运行脚本

3.使用python 发布订阅消息

安装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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/793963.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-06
下一篇2022-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存