This is an old revision of the document!
Table of Contents
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 the result message from the ESP32 module and display the running status.
#! /bin/bash while : do mosquitto_sub -h 192.168.0.13 -t result sleep 5 done
Shell output
Running status for result.
0 1
pubtest
script
publish two messages to the foo_topic which the ESP32 devices is sunbscribed 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
Running status on the ESP32 with incoming subscription messages.
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