zoukankan      html  css  js  c++  java
  • 野路子学习esp32(十六) MQTT与ESP32-MicroPython @a.宏万

    MQTT与ESP32-MicroPython

    在ESP32上安装MQTT库

    首先,我们需要在ESP32上面安装mqtt的库。(MQTT客户端在ESP32上面的实现)

    首先确认ESP32-MicroPython已经连接上了热点!!!, 通过REPL控制ESP32。

    引入upip包管理器

    >>> import upip
    >>> upip.install('micropython-umqtt.simple')
    Installing to: /lib/
    Installing micropython-umqtt.simple 1.3.4 from https://files.pythonhosted.org/packages/bd/cf/697e3418b2f44222b3e848078b1e33ee76aedca9b6c2430ca1b1aec1ce1d/micropython-umqtt.simple-1.3.4.tar.gz
    

    这样umqtt.simple这个包就安装好了。

    使用umqtt实现接收者

    esp32/subscriber.py
    from umqtt.simple import MQTTClient
    import time
    
    SERVER = '192.168.43.16'
    CLIENT_ID = 'PYESPCAR_A0'
    TOPIC = b'pyespcar_basic_control'
    
    def mqtt_callback(topic, msg):
        print('topic: {}'.format(topic))
        print('msg: {}'.format(msg))
    
    
    client = MQTTClient(CLIENT_ID, SERVER)
    client.set_callback(mqtt_callback)
    client.connect()
    
    client.subscribe(TOPIC)
    
    
    while True:
        # 查看是否有数据传入
        # 有的话就执行 mqtt_callback
        client.check_msg()
        time.sleep(1)
    

    使用umqtt实现发送者

    esp32/publisher.py
    from umqtt.simple import MQTTClient
    import time
    
    SERVER = '192.168.43.16'
    CLIENT_ID = 'PYESPCAR_A0' # 客户端的ID
    TOPIC = b'pyespcar_basic_control' # TOPIC的ID
    
    client = MQTTClient(CLIENT_ID, SERVER)
    client.connect()
    
    
    while True:
        client.publish(TOPIC, 'helloworld')
        time.sleep(1)
    

    注意在Esp32里面TOPIC需要是bytes类型。

    现在我们修改 boot.py

    原来的 

    from emp_wifi import Wifi
    from emp_webrepl import WebREPL
    from emp_utils import webrepl_pass
    from emp_utils import post_ip
    
    
    if __name__ == '__main__':
        Wifi.connect()
        try:
            post_ip(Wifi.ifconfig()[0][0])
        except ImportError:
            pass
        WebREPL.start(password=webrepl_pass())
        from emp_ide import *

    新的

    from emp_wifi import Wifi
    from emp_webrepl import WebREPL
    from emp_utils import webrepl_pass
    from emp_utils import post_ip
    import ubinascii
    import machine
     
    #mqtt 服务器相应的信息
    mqtt_server = '*.*.*.*'
    client_id = b'Q1'+ubinascii.hexlify(machine.unique_id()).upper()
    mqtt_user = b'Q1'
    mqtt_pwd = b''
    topic_sub = client_id
    topic_pub = b'Hongwans_EMQ'
    
    if __name__ == '__main__':
        Wifi.connect()
        try:
            post_ip(Wifi.ifconfig()[0][0])
        except ImportError:
            pass
        WebREPL.start(password=webrepl_pass())
        from emp_ide import *

     main.py 可以这样写 

    def connect_and_subscribe():
        global client_id, mqtt_server, topic_sub,mqtt_user,mqtt_pwd
        client = MQTTClient(client_id, mqtt_server,user=mqtt_user, password=mqtt_pwd, keepalive=60)
        client.set_callback(sub_cb)
        client.connect()
        client.subscribe(topic_sub)
        led.on()
        print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_server, topic_sub))
        return client
      
    def restart_and_reconnect():
        print('Failed to connect to MQTT broker. Reconnecting...')
        time.sleep(10)
        machine.reset()

    #接收MQTT消息
    def sub_cb(topic, msg):
        global iswhile
        msg = bytes.decode(msg)    
        print((topic, msg))  
    try:
        #5小时重启一次
        last_reset = time.time()
        reset_interval = 60 * 60 * 5
        #通知服务器我在
        last_message = 0
        message_interval = 1
        client = connect_and_subscribe()
        print('HwClient_SN:'+client_id.decode())
    except OSError as e:
        restart_and_reconnect()
    
    while True:
        try:
            client.check_msg()
            if (time.time() - last_reset) > reset_interval:
                restart_and_reconnect()
            if (time.time() - last_message) > message_interval:
                jsonData = '{"TheSender":"'+client_id.decode()+'","Receiver":"'+topic_pub.decode()+'","MessTpye":"string","Content":"ian"}';
                client.publish(topic_pub, jsonData)
                last_message = time.time()
        except OSError as e:
            restart_and_reconnect()

    MQTT  服务器必须发送信息给一个主题。如果一直读取没有发送,MQTT会中断。

  • 相关阅读:
    性能测试_LR11_数据向导
    python django部署linux服务器
    pip升级问题
    解决win10命令提示行下cnpm无反应
    adb常用命令连接设备/查看包名/查看activity
    android虚拟机sdcard操作出现mkdir failed for , Read-only file system的解决办法
    Django项目和应用创建
    mac下配置python虚拟环境
    这个是我的标题_2020_01_01_18_49_21
    这个是我的标题_2020_01_01_18_47_58
  • 原文地址:https://www.cnblogs.com/hongwans/p/12784681.html
Copyright © 2011-2022 走看看