ESP32 + MicroPython + WIFI-蓝牙配网 + MQTT连接和推送订阅

功能:
  1. WIFI-蓝牙配网 
  2. MQTT连接和推送订阅
  3. 设备管理(LED, 电机)
    1. 设备状态:在线 - 离线
    2. 产品状态:打开 - 关闭
  4. 注:wifi,蓝牙,mqtt连接代码,线路连接和硬件自行处理
主程序:
from machine import Pin
from machine import Timer
from time import sleep_ms
import time
import ntptime
import bluetooth
import ujson

## wifi 连接
import wifi
## 设备信息管理
import device
## 蓝牙连接
from ble import ESP32_BLE, BLE_EVENT 
## MQTT 连接
from mqtt import MQTTClient, mqtt_connect
## 连接配置
from configtxt import ConfigTxt, get_data

    
def ble_back(BLE_MSG):
    # type::data 1: led 2:wifi
    print(BLE_MSG)
    ble_type = ""
    ble_data = ""
    bs = BLE_MSG.split("::")
    if bs[0] == '1':
        ble_type = BLE_MSG
    elif bs[0] == '2':
        ble_type = '2'
        ble_data = bs[1]

    get_data()['ble_type'] = ble_type
    get_data()['ble_data'] = ble_data

def ble_listen(led):
    ble_type = get_data()['ble_type']
    ble_data = get_data()['ble_data']
    if ble_type != "":
        print(ble_type, ble_data)
    
    if ble_type == '1::1':
        led.value(1)
        #_ble.send('LED is ON.' if led.value() else 'LED is OFF')
    elif ble_type == '1::0':
        led.value(0)
        # _ble.send('LED is ON.' if led.value() else 'LED is OFF')
    elif ble_type == '2':
        wifiSsid = get_data()['wifiSsid']
        # ssid|||password
        wifidata = ble_data.split("|||")
        print(ble_type, wifiSsid, wifidata)

        if wifiSsid == None or wifiSsid != wifidata[0] :
            get_data()['wifiSsid'] = wifidata[0]
            get_data()['wifiKey'] = wifidata[1]
    get_data()['ble_type'] = ""
    
    
def mqtt_back(topic, msg): # 回调函数,收到服务器消息后会调用这个函数
    try:
        topic = topic.decode('utf-8')
        msg = msg.decode('utf-8')
        did = config.get_deviceid()
        print("mqtt_back : ", topic, msg)
        if topic == 'device/'+did:
            print(msg)
        if topic == 'device/product/'+did:
            mqtt_back_product(msg)
                    
    except Exception as e :
        print(e)    

def mqtt_back_product(msg):
    print('product', msg)
    pd = ujson.loads(msg)
    if 'name' in pd:
        if pd['name'] == 'led26':
            led26.value(pd['status'])
            device.set_product_data(26, "led", pd['status'])
        if pd['name'] == 'motor25':
            if pd['status'] > 0 :
                motor25.off()
            else:
                motor25.on()
            device.set_product_data(25, "motor", pd['status'])

def mqtt_init(mqttc):
    mqerror = get_data()['mqerror']
    if mqttc == None and mqerror > 0:
        did = config.get_deviceid()
        mqttHost, mqttPort, mqttUser, mqttPassword = config.get_mqtt()
        print("mqtt connect: ", did, mqttHost, mqttPort, mqttUser)
        mqttc = mqtt_connect(did, mqttHost, mqttPort, mqttUser, mqttPassword, mqtt_back)

        if mqttc != None:
            print("mqtt ok ")
            mqttc.subscribe(b"device/"+did)  # 监控ledctl这个通道,接收控制命令
            mqttc.subscribe(b"device/product/"+did)
#             mqttc.publish(b"device/"+did, "ping")
            device.set_data("mqttConnect", 1)
            
            ntptime.settime()
        else : 
            print("mqtt error : ", mqerror, did, mqttHost)
            mqerror = mqerror - 1
            get_data()['mqerror'] = mqerror
            
    return mqttc

def wifi_listen(wlan):
    wifiSsid = get_data()['wifiSsid']
    wifiKey = get_data()['wifiKey']
    if wifiSsid != None and wifiSsid != "":
        print("wifi connect : ", wifiSsid, wifiKey)
        
        wlan = wifi.wifi_connect(wifiSsid, wifiKey)
        if wlan != None and wlan.isconnected():
            print("wifi ok")
            
            get_data()['wifiSsid'] = None
            config.set_wifi(wifiSsid, wifiKey)
            
#             time.sleep(10)
#             wlan = wifi.wifi_disconnect(wlan)
            device.set_data("wifiConnect", 1)
            
        else:
            print("wifi error : ", wifiSsid) 
            get_data()['wifiSsid'] = None
    return wlan

def mqtt_listen(wlan, mqttc):
    if mqttc == None and wlan != None and wlan.isconnected():
        mqttc = mqtt_init(mqttc)
        if mqttc != None:
            mqttc.check_msg()
    elif mqttc != None:
        mqttc.check_msg()
    return mqttc

def device_listen(mqttc, did):
    info = device.get_device_info()
    if info != None and mqttc != None:
#         print("device_listen", info)
        mqttc.publish(b"device/config/"+did, info, qos=2) 

def init_product(led26, motor25):
    led26.value(0)
    device.set_product_data(26, "led", 0)
    motor25.on()
    device.set_product_data(25, "motor", 0)
    
def run_main(wlan, mqttc):
    try:
        ble_listen(led)
        wlan = wifi_listen(wlan)
        mqttc = mqtt_listen(wlan, mqttc)
        device_listen(mqttc, did) 
        sleep_ms(1000)
    except Exception as e :
        print(e)   
    return wlan, mqttc
    
def run_main_init():
    print("ble-wifi run ")
    
    get_data()['config'] = config

    name = "ESP32BLE"
    _event = BLE_EVENT(2, ble_back)
    _ble = ESP32_BLE(_event, name)
    
    get_data()['ble_type'] = ""
    get_data()['ble_data'] = ""

    #     but = Pin(0, Pin.IN)
    #     but.irq(trigger=Pin.IRQ_FALLING, handler=buttons_irq)
    
    get_data()['mqerror'] = 1
    wifiSsid, wifiKey = config.get_wifi()
    get_data()['wifiSsid'] = wifiSsid
    get_data()['wifiKey'] = wifiKey

    
    init_product(led26, motor25)

led26 = Pin(26, Pin.OUT)
motor25 = Pin(25, Pin.OUT)
led = Pin(2, Pin.OUT)

config = ConfigTxt("config.txt")
did = config.get_deviceid()

if __name__ == "__main__":
    run_main_init()
    wlan = None
    mqttc = None
    while True:
        wlan, mqttc = run_main(wlan, mqttc)


运行日志
ble-wifi run 
bytearray(b'\x02\x01\x02\t\tESP32BLE')


wifi connect :  123 123456789
wifi_disconnect
'192.168.191.2', '255.255.255.0', '192.168.191.1', '192.168.191.1')
wifi ok
mqtt connect:  64b70861cb2c 127.0.0.1 1883 test
mqtt ok 
b'device/64b70861cb2c'
b'device/product/64b70861cb2c'

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32和ESP8266(ESP-12F)可以结合使用来创建一个物联网温度计,并通过移植Paho MQTT协议来连接到一个私有MQTT服务器。 首先,我们需要准备好硬件。在STM32上,我们可以使用一个温度传感器来测量温度,并使用ESP8266作为WiFi模块,用于与MQTT服务器进行通信。ESP-12F模块已经集成了WiFi功能,并且非常适合用于此应用。 接下来,我们需要准备好软件。Paho MQTT是一个开源的MQTT客户端库,可用于连接MQTT服务器。我们需要将Paho MQTT库移植到STM32的开发环境中,并编写代码来配置和连接MQTT服务器。 在使用Paho MQTT之前,我们还需要了解私有MQTT服务器的连接参数,例如服务器的IP地址、端口号、用户名和密码。这些参数将用于在代码中配置MQTT连接。 在代码中,我们需要使用STM32的串口(UART)和SPI接口来与ESP8266进行通信。通过UART,我们可以发送AT指令给ESP8266并接收其响应。通过SPI,我们可以将温度数据传输给ESP8266。 首先,我们需要初始化ESP8266并配置它的WiFi连接。然后,我们可以使用Paho MQTT库的API来创建一个MQTT客户端,并配置其连接参数。一旦连接建立,我们可以使用MQTT客户端来发布和订阅主题,并发送和接收数据。 在温度计的应用中,我们可以在固定时间间隔内测量温度,并通过MQTT发布到服务器。其他设备可以订阅这个主题,并接收到最新的温度数据。 总结起来,通过移植Paho MQTT协议,我们可以将STM32和ESP8266结合起来创建一个物联网温度计,并将其连接到一个私有MQTT服务器。通过配置和管理MQTT连接,我们可以实现设备之间的实时数据交换,从而实现更智能化和高效的物联网应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值