==== MicroPython Asynchronous MQTT ==== MQTT library for MicroPython on the ESP8266 and ESP32 ===Files=== ==ESP32== boot.py is the MicroPython startup. The others are the MQTT demo. boot.py config.py mqtt_as.py test.py ==Shell== These scripts to interact with the mosquitto MQTT broker. pubtest subtest ===boot.py=== The ESP32 startup file which run our test after a short boot delay. # This file is executed on every boot (including wake-boot from deepsleep) #import esp #esp.osdebug(None) #import webrepl #webrepl.start() import utime utime.sleep(4) import test ===test.py=== Main executable called from startup. This demo is pulled from the README documentation with local changes. Configure SERVER here. from mqtt_as import MQTTClient from config import config import uasyncio as asyncio SERVER = '192.168.0.13' # Change to suit e.g. 'iot.eclipse.org' def callback(topic, msg, retained): print((topic, msg, retained)) async def conn_han(client): await client.subscribe('foo_topic', 1) async def main(client): await client.connect() n = 0 while True: await asyncio.sleep(5) print('publish', n) # If WiFi is down the following will pause for the duration. await client.publish('result', '{}'.format(n), qos = 1) n += 1 config['subs_cb'] = callback config['connect_coro'] = conn_han config['server'] = SERVER MQTTClient.DEBUG = True # Optional: print diagnostic messages client = MQTTClient(config) loop = asyncio.get_event_loop() try: loop.run_until_complete(main(client)) finally: client.close() # Prevent LmacRxBlk:1 errors ===config.py=== mqtt_as configuration as found in distribution directory with mosquitto MQTT broker and wifi changes. Configure MQTT broker, ssid and password. # config.py Local configuration for mqtt_as demo programs. from sys import platform from mqtt_as import config config['server'] = '192.168.0.13' # Change to suit # config['server'] = 'iot.eclipse.org' # Not needed if you're only using ESP8266 config['ssid'] = 'kewl-v8' config['wifi_pw'] = 'PASSWORD' # For demos ensure the same calling convention for LED's on all platforms. # ESP8266 Feather Huzzah reference board has active low LED's on pins 0 and 2. # ESP32 is assumed to have user supplied active low LED's on same pins. # Call with blue_led(True) to light if platform == 'esp8266' or platform == 'esp32' or platform == 'esp32_LoBo': from machine import Pin def ledfunc(pin): pin = pin def func(v): pin(not v) # Active low on ESP8266 return func wifi_led = ledfunc(Pin(0, Pin.OUT, value = 0)) # Red LED for WiFi fail/not ready yet blue_led = ledfunc(Pin(2, Pin.OUT, value = 1)) # Message received elif platform == 'pyboard': from pyb import LED def ledfunc(led, init): led = led led.on() if init else led.off() def func(v): led.on() if v else led.off() return func wifi_led = ledfunc(LED(1), 1) blue_led = ledfunc(LED(3), 0) ===mqtt_as.py=== mqtt_as excecutable. This is the main logic which maintains a Wifi connection and publishes and subscribes to topics. wget https://raw.githubusercontent.com/peterhinch/micropython-mqtt/master/mqtt_as/mqtt_as.py ===Run=== ==ESP32== >>> import machine >>> machine.reset() ets Jun 8 2016 00:22:57 rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:5008 ho 0 tail 12 room 4 load:0x40078000,len:10600 ho 0 tail 12 room 4 load:0x40080400,len:5684 entry 0x400806bc I (548) cpu_start: Pro cpu up. I (548) cpu_start: Application information: I (548) cpu_start: Compile time: Aug 16 2020 00:54:20 I (551) cpu_start: ELF file SHA256: 0000000000000000... I (557) cpu_start: ESP-IDF: v3.3.2 I (562) cpu_start: Starting app cpu, entry point is 0x40082f30 I (552) cpu_start: App cpu up. I (573) heap_init: Initializing. RAM available for dynamic allocation: I (579) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM I (585) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM I (591) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM I (598) heap_init: At 3FFBDB5C len 00000004 (0 KiB): DRAM I (604) heap_init: At 3FFCA9E8 len 00015618 (85 KiB): DRAM I (610) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM I (616) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM I (623) heap_init: At 4009DE28 len 000021D8 (8 KiB): IRAM I (629) cpu_start: Pro cpu start user code I (312) cpu_start: Starting scheduler on PRO CPU. I (0) cpu_start: Starting scheduler on APP CPU. I (4890) modsocket: Initializing I (5020) wifi:wifi driver task: 3ffd1120, prio:23, stack:3584, core=0 I (10354) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE I (10354) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE I (10404) wifi:wifi firmware version: 44aa95c I (10404) wifi:config NVS flash: enabled I (10404) wifi:config nano formating: disabled I (10404) wifi:Init dynamic tx buffer num: 32 I (10404) wifi:Init data frame dynamic rx buffer num: 32 I (10414) wifi:Init management frame dynamic rx buffer num: 32 I (10414) wifi:Init management short buffer num: 32 I (10424) wifi:Init static rx buffer size: 1600 I (10424) wifi:Init static rx buffer num: 10 I (10424) wifi:Init dynamic rx buffer num: 32 I (10534) phy: phy_version: 4180, cb3948e, Sep 12 2019, 16:39:13, 0, 0 I (10534) wifi:mode : sta (30:ae:a4:fe:03:80) I (10534) wifi: STA_START I (10914) wifi:new:<3,0>, old:<1,0>, ap:<255,255>, sta:<3,0>, prof:1 I (11764) wifi:state: init -> auth (b0) I (11764) wifi:state: auth -> assoc (0) I (11774) wifi:state: assoc -> run (10) I (11784) wifi:connected with kewl-v8, aid = 10, channel 3, BW20, bssid = c2:4a:00:be:c7:a6 I (11794) wifi:security type: 3, phy: bgn, rssi: -57 I (11794) wifi:pm start, type: 1 I (11794) network: CONNECTED I (11844) wifi:AP's beacon interval = 102400 us, DTIM period = 2 I (19724) event: sta ip: 192.168.0.237, mask: 255.255.255.0, gw: 192.168.0.1 I (19724) network: GOT_IP Checking WiFi integrity. Got reliable connection Connecting to broker. Connected to broker. publish 0 publish 1 ===subtest=== ==script== Subscribe to the topic named 'result' published by the ESP32 module and display it. #! /bin/bash mosquitto_sub -h 192.168.0.13 -t result ==Shell output== Running status for the result topic. 0 1 ===pubtest=== ==script== Publish two messages to the topic named 'foo_topic' which the ESP32 device is subscribed to, #! /bin/bash # mosquitto_sub -h 192.168.0.10 -t result while : do mosquitto_pub -h 192.168.0.13 -t foo_topic -m "gordon bennett" -q 1 sleep 5 mosquitto_pub -h 192.168.0.13 -t foo_topic -m "pete was here" -q 1 sleep 5 done ==ESP32 output== Show running status on the ESP32 and incoming subscription topics. publish 103 (b'foo_topic', b'gordon bennett', False) RAM free 94032 alloc 17136 publish 104 (b'foo_topic', b'pete was here', False) publish 105 === Resources === [[https://github.com/peterhinch/micropython-mqtt|Project page]] [[https://github.com/peterhinch/micropython-mqtt/blob/master/mqtt_as/README.md|Documentation]]