资讯详情

ESP32-C3上运行MicroPython使用MQTT通讯

参考: https://blog.csdn.net/freemote/article/details/105348959 环境: micropython ESP32-C3 腾讯云物联网IOT 说明: esp32-c3的固件中 没有umqtt因此,需要手动引入模块simple.py(参考https://github.com/micropython/micropython-lib/blob/master/micropython/umqtt.simple/umqtt/simple.py) 可以使用 help(‘modules’) 查看 剩下的直接代码 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\0\0\0\0\0")         msg = bytearray(b"\x04MQTT\x04\x02\0\0")          sz = 10   2   len(self.client_id)         msg[6] = clean_session << 1         if self.user is not None:             sz  = 2   len(self.user)   2   len(self.pswd)             msg[6] |= 0xC0         if self.keepalive:             assert self.keepalive < 65536             msg[7] |= self.keepalive >> 8             msg[8] |= self.keepalive & 0x00FF         if self.lw_topic:             sz  = 2   len(self.lw_topic)   2   len(self.lw_msg)             msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3             msg[6] |= self.lw_retain << 5          i = 1         while sz > 0x7F:             premsg[i] = (sz & 0x7F) | 0x80             sz >>= 7             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)                     rcvpid = 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()

main.py

# main.py
import time
from umqttsimple import MQTTClient
from gc import mem_free
import network



def connect_wifi(ssid, passwd):
    global wlan
    wlan = network.WLAN(network.STA_IF)  # create a wlan object
    wlan.active(True)  # Activate the network interface
    wlan.disconnect()  # Disconnect the last connected WiFi
    wlan.connect(ssid, passwd)  # connect wifi
    while (wlan.ifconfig()[0] == '0.0.0.0'):
        time.sleep(1)
    wlan_info = wlan.ifconfig()
    print("Wifi is connected with the following information:")
    print(" IP address : " + wlan_info[0])
    print("Subnet mask : " + wlan_info[1])
    print("    Gateway : " + wlan_info[2])
    print("        DNS : " + wlan_info[3])


mqtt_client = None


def sub_cb(topic, msg):
    print("接收到数据", (topic, msg))
    mymessage = '{"AAAA": %d }' % (time.time())
    print("mqtt_client 1: %s" % mqtt_client.client_id)
    mqtt_client.publish(topic=publish_topic, msg=mymessage, retain=True, qos=1)
    mqtt_client.publish(topic=publish_topic, msg='13244654', retain=True, qos=1)
    print("发送消息", mymessage)




broker_address = 'product_id.iotcloud.tencentdevices.com'  #  MQTT服务器地址
broker_port = '1883'   #  MQTT服务器端口
client_id = 'XXXXXX'   #  MQTT设备id
user_name = 'XXXXXXXXXXXXXX'  # mqtt 设备用户名
password = 'XXXXXXXXXXXXXXXXXXXXXXX' # mqtt 设备密码
publish_topic = 'LGSODS81VJ/ESP32Devcice1/data'   # 推送主题
subscribe_topic = 'LGSODS81VJ/ESP32Devcice1/data'  # 订阅主题
SSID = 'WLAN_NAME'  # 无线网名称
PASSWORD = 'WLAN_PASSWORD'  #无线网密码

if __name__ == '__main__':
    try:
        print("\n可用内存1: %s Byte" % str(mem_free()))
        connect_wifi(SSID, PASSWORD)
        print("\n可用内存2: %s Byte" % str(mem_free()))
        mqtt_client = MQTTClient(client_id=client_id, server=broker_address, port=broker_port, user=user_name,
                                 password=password, keepalive=60)
        mqtt_client.set_callback(sub_cb)
        mqtt_client.connect()
        mqtt_client.subscribe(subscribe_topic)
        mqtt_client.publish(topic=publish_topic, msg="12345678900000", retain=False, qos=1)
        print("mqtt_client 1: %s" % mqtt_client.client_id)
        while True:
            mqtt_client.wait_msg()  # wait message
    except Exception as ex_results:
        print('exception1', ex_results)
    finally:
        if (mqtt_client is not None):
            mqtt_client.disconnect()
        wlan.disconnect()
        wlan.active(False)

我这边使用的是腾讯云物联网通讯(使用设备发送消息 最好使用格式 字符串可能无法接收) 在这里插入图片描述

标签: opb620传感器opb615传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台