蓝牙作为一种短距通信系统,无疑是十分优秀,也是十分成功的,特别是随着近年物联网的发展,各种智能设备广泛应用,蓝牙BLE以其鲁棒性、低功耗、低成本等特点,逐渐成为各种智能设备的标准配置。如今,借助于ESP32平台,MicroPython中也能够使用蓝牙BLE协议进行通信。这对MicroPython平台而言,自然丰富了其生态,增强了其技能,反过来讲,蓝牙BLE能够在MicroPython中得以集成,借助Python语言的易用性,亦将大大降低其入门门槛。
MicroPython中目前只实现了蓝牙BLE的低阶接口。所谓低阶接口,是指其只实现了蓝牙BLE架构链路层中所涉及的广播者/扫描者/中心设备和外设设备的功能接口,也实现了属性协议层中的客户端和服务器的功能接口,但更上层的各种具体的应用配置规范(Profile),则没有实现,甚至广播时的广播包的内容,都需要自己进行组织。这对于一个蓝牙系统,当然不够直接与直观,但考虑到MicroPython作为一个通用平台,且运行于资源有限的微控制器/单片机上,其只负责最底层功能接口的构建,用户可以基于此进行具体场景,具体应用的实现,又是可以理解的。如果过多的涉及具体设备的业务场景,对于不需要蓝牙功能的用户来说,反而是一种负担,消耗了不必要的资源。
下面,我们以一个实例来看看在MicoPython中具体怎样操作蓝牙BLE的各个低阶接口。此实例运行于ESP32平台,其作为一个蓝牙BLE外设设备,可首先进行广播以供中心设备,比如手机,进行连接。一旦建立起连接,其可以周期性的向中心设备上报消息,反过来,中心设备也可以向其发送消息,其会将接收到的消息简单打印出来。这里,手机上运行Nodic的nRF Connect软件进行操作。
完整代码如下:
import bluetoothimport randomimport structimport timefrom ble_advertising import advertising_payloadfrom micropython import const_IRQ_CENTRAL_CONNECT = const(1)_IRQ_CENTRAL_DISCONNECT = const(2)_IRQ_GATTS_WRITE = const(3)_FLAG_READ = const(0x0002)_FLAG_WRITE_NO_RESPONSE = const(0x0004)_FLAG_WRITE = const(0x0008)_FLAG_NOTIFY = const(0x0010)_UART_UUID = bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")_UART_TX = ( bluetooth.UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E"), _FLAG_READ | _FLAG_NOTIFY,)_UART_RX = ( bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E"), _FLAG_WRITE | _FLAG_WRITE_NO_RESPONSE,)_UART_SERVICE = ( _UART_UUID, (_UART_TX, _UART_RX),)class BLESimplePeripheral: def __init__(self, ble, name="mpy-uart"):