MicroPython[ESP32]物联网开发-Bluetooth蓝牙通信-002

NO.1
Bluetooth

ESP32低功耗蓝牙

MicroPython文档地址:

https://docs.micropython.org/en/latest/library/bluetooth.html

支持中央、外围、广播和观察者角色中的低功耗蓝牙 (BLE),以及 GATT 服务器和客户端以及 L2CAP 面向连接的通道。

一个设备可以同时扮演多个角色。某些端口支持配对(和绑定)

NO.2
蓝牙广播

引入依赖

import ubluetooth

初始化蓝牙

# 实例化蓝牙
class BLE():
    def __init__(self, name):   
        # 蓝牙名称
        self.name = name
        # 创建蓝牙实例
        self.ble = ubluetooth.BLE()
        # 开启蓝牙
        self.ble.active(True)
        # 蓝牙事件回调
        # 参考文档
        # https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq
        self.ble.irq(self.ble_irq)
        # 配置蓝牙UUID
        self.register()
        # 特征和描述符的默认最大大小为 20 个字节,修改允许为100个字节(蓝牙数据的发送和接收字节大小限制)
        self.ble.gatts_write(self.rx, bytes(100))
        # 蓝牙广播
        self.advertiser()

ble_irq蓝牙事件监听和回调函数

# 蓝牙事件回调函数
def ble_irq(self, event, data):
    #蓝牙已连接
    if event == 1:
        print("蓝牙已连接")
        # 连接后的执行函数
        self.connected()
    #蓝牙已断开连接
    elif event == 2:
        print("蓝牙已断开连接")
        # 断开连接后的执行函数
        self.advertiser()
        self.disconnected()
    #蓝牙已发送数据
    elif event == 3 :
        print("蓝牙已接收到数据")        
        # 读取二进制数据
        buffer = self.ble.gatts_read(self.rx)
        # 使用UTF-8格式把二进制数据转为字符串
        message = buffer.decode('UTF-8').strip()
        # 打印收到的字符数据
        print("message",message)    
        # 对指定的数据做处理并蓝牙返回数据        
        if message == 'test':
            print('test')
            ble.send('test')
        if message == 'str':
            print('str')
            ble.send('str')

蓝牙UUID配置

# 注册蓝牙UUID
def register(self):        
    # 自定义UUID
    # 蓝牙服务UUID service_uuid(后续蓝牙建议连接会用到)
    NUS_UUID = 'AE25A5C1-4601-143C-12BB-8BC45A18749C'
    # 蓝牙接收特征UUId receive_uuid
    RX_UUID = 'AE25A5C2-4601-143C-12BB-8BC45A18749C'
    # 蓝牙发送特征UUId transmit_uuid
    TX_UUID = 'AE25A5C3-4601-143C-12BB-8BC45A18749C'
    # UUID组合(一个包含UUID和特征列表的二元元组)
    BLE_NUS = ubluetooth.UUID(NUS_UUID)
    BLE_RX = (ubluetooth.UUID(RX_UUID), ubluetooth.FLAG_WRITE)
    BLE_TX = (ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY)
    BLE_UART = (BLE_NUS, (BLE_TX, BLE_RX,))
    SERVICES = (BLE_UART, )
    # 使用指定的服务配置外围设备
    # 文档地址:
    # https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#peripheral-role
    ((self.tx, self.rx,), ) = self.ble.gatts_register_services(SERVICES)

蓝牙广播配置

# 蓝牙广播配置
def advertiser(self):
    name = bytes(self.name, 'UTF-8')
    # 以指定的时间间隔(以微秒为单位)开始广播
    # 文档地址
    # https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#broadcaster-role-advertiser
    self.ble.gap_advertise(100, bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + name)

向客户端发送数据

# 发送数据
def send(self, data):
    # 向连接的客户端发送通知请求
    # 文档地址:
    # https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#gatt-client
    self.ble.gatts_notify(0, self.tx, data + '\n')
NO.3
Tips

使用ESP32开发,很多功能需要进行联网操作

在开发过程中可以把wifi名称和密码固定写在代码中执行初始化连接操作

但是完善功能后,能够通过简单交互的方式配网才是关键,包括数据通信,配置设置等

建立蓝牙通信后,可以通过蓝牙发送wifi和密码方式,动态写入和修改配置,进行蓝牙配网操作

下期预告

通过chrome网页和ESP32蓝牙通信

通信微信小程序和ESP32蓝牙通信

小程序体验地址

此图片的alt属性为空;文件名为image-104.png

END.