esp32 micropython 蓝牙通信测试程序

查了很多资料,基本上没人用micropython
python的蓝牙服务,早期的库的确不支持,新的部分库已经做了加强支持,我自己摸索踩坑了,终于搞出了能用的了
代码如下

蓝牙收发例程
# This example demonstrates a peripheral implementing the Nordic UART Service (NUS).

import bluetooth
from ble_advertising import advertising_payload

from micropython import const

_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)

_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_NOTIFY,
)
_UART_RX = (
    bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E"),
    _FLAG_WRITE,
)
_UART_SERVICE = (
    _UART_UUID,
    (_UART_TX, _UART_RX),
)

# org.bluetooth.characteristic.gap.appearance.xml
_ADV_APPEARANCE_GENERIC_COMPUTER = const(128)


class BLEUART:
    def __init__(self, ble, name="mpy-uart", rxbuf=100):
        self._ble = ble
        self._ble.active(True)
        self._ble.irq(self._irq)
        ((self._tx_handle, self._rx_handle),) = self._ble.gatts_register_services((_UART_SERVICE,))
        # Increase the size of the rx buffer and enable append mode.
        self._ble.gatts_set_buffer(self._rx_handle, rxbuf, True)
        self._connections = set()
        self._rx_buffer = bytearray()
        self._handler = None
        # Optionally add services=[_UART_UUID], but this is likely to make the payload too large.
        self._payload = advertising_payload(name=name, appearance=_ADV_APPEARANCE_GENERIC_COMPUTER)
        self._advertise()

    def irq(self, handler):
        self._handler = handler

    def _irq(self, event, data):
        # Track connections so we can send notifications.
        if event == _IRQ_CENTRAL_CONNECT:
            conn_handle, _, _ = data
            self._connections.add(conn_handle)
        elif event == _IRQ_CENTRAL_DISCONNECT:
            conn_handle, _, _ = data
            if conn_handle in self._connections:
                self._connections.remove(conn_handle)
            # Start advertising again to allow a new connection.
            self._advertise()
        elif event == _IRQ_GATTS_WRITE:
            conn_handle, value_handle = data
            if conn_handle in self._connections and value_handle == self._rx_handle:
                self._rx_buffer += self._ble.gatts_read(self._rx_handle)
                if self._handler:
                    self._handler()

    def any(self):
        return len(self._rx_buffer)

    def read(self, sz=None):
        if not sz:
            sz = len(self._rx_buffer)
        result = self._rx_buffer[0:sz]
        self._rx_buffer = self._rx_buffer[sz:]
        return result

    def write(self, data):
        for conn_handle in self._connections:
            self._ble.gatts_notify(conn_handle, self._tx_handle, data)

    def close(self):
        for conn_handle in self._connections:
            self._ble.gap_disconnect(conn_handle)
        self._connections.clear()

    def _advertise(self, interval_us=500000):
        self._ble.gap_advertise(interval_us, adv_data=self._payload)


def demo():
    import time

    ble = bluetooth.BLE()
    uart = BLEUART(ble)

    def on_rx():
        print("rx: ", uart.read().decode().strip())

    uart.irq(handler=on_rx)
    nums = [4, 8, 15, 16, 23, 42]
    i = 0

    try:
        while True:
            uart.write(str(nums[i]) + "\n")
            i = (i + 1) % len(nums)
            time.sleep_ms(1000)
    except KeyboardInterrupt:
        pass

    uart.close()


if __name__ == "__main__":
    demo()


蓝牙广播函数

# Helpers for generating BLE advertising payloads.

from micropython import const
import struct
import bluetooth

# Advertising payloads are repeated packets of the following form:
#   1 byte data length (N + 1)
#   1 byte type (see constants below)
#   N bytes type-specific data

_ADV_TYPE_FLAGS = const(0x01)
_ADV_TYPE_NAME = const(0x09)
_ADV_TYPE_UUID16_COMPLETE = const(0x3)
_ADV_TYPE_UUID32_COMPLETE = const(0x5)
_ADV_TYPE_UUID128_COMPLETE = const(0x7)
_ADV_TYPE_UUID16_MORE = const(0x2)
_ADV_TYPE_UUID32_MORE = const(0x4)
_ADV_TYPE_UUID128_MORE = const(0x6)
_ADV_TYPE_APPEARANCE = const(0x19)


# Generate a payload to be passed to gap_advertise(adv_data=...).
def advertising_payload(limited_disc=False, br_edr=False, name=None, services=None, appearance=0):
    payload = bytearray()

    def _append(adv_type, value):
        nonlocal payload
        payload += struct.pack("BB", len(value) + 1, adv_type) + value

    _append(
        _ADV_TYPE_FLAGS,
        struct.pack("B", (0x01 if limited_disc else 0x02) + (0x18 if br_edr else 0x04)),
    )

    if name:
        _append(_ADV_TYPE_NAME, name)

    if services:
        for uuid in services:
            b = bytes(uuid)
            if len(b) == 2:
                _append(_ADV_TYPE_UUID16_COMPLETE, b)
            elif len(b) == 4:
                _append(_ADV_TYPE_UUID32_COMPLETE, b)
            elif len(b) == 16:
                _append(_ADV_TYPE_UUID128_COMPLETE, b)

    # See org.bluetooth.characteristic.gap.appearance.xml
    if appearance:
        _append(_ADV_TYPE_APPEARANCE, struct.pack("<h", appearance))

    return payload


def decode_field(payload, adv_type):
    i = 0
    result = []
    while i + 1 < len(payload):
        if payload[i + 1] == adv_type:
            result.append(payload[i + 2 : i + payload[i] + 1])
        i += 1 + payload[i]
    return result


def decode_name(payload):
    n = decode_field(payload, _ADV_TYPE_NAME)
    return str(n[0], "utf-8") if n else ""


def decode_services(payload):
    services = []
    for u in decode_field(payload, _ADV_TYPE_UUID16_COMPLETE):
        services.append(bluetooth.UUID(struct.unpack("<h", u)[0]))
    for u in decode_field(payload, _ADV_TYPE_UUID32_COMPLETE):
        services.append(bluetooth.UUID(struct.unpack("<d", u)[0]))
    for u in decode_field(payload, _ADV_TYPE_UUID128_COMPLETE):
        services.append(bluetooth.UUID(u))
    return services


def demo():
    payload = advertising_payload(
        name="micropython",
        services=[bluetooth.UUID(0x181A), bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")],
    )
    print(payload)
    print(decode_name(payload))
    print(decode_services(payload))


if __name__ == "__main__":
    demo()


  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: ESP32 Micropython支持蓝牙功能,可以通过蓝牙模块与其他设备进行通信,例如手机、电脑等。在Micropython中,可以使用Bluetooth模块来实现蓝牙功能,包括扫描、连接、发送和接收数据等操作。同时,ESP32 Micropython还支持BLE(低功耗蓝牙)功能,可以用于连接低功耗设备,例如传感器、智能家居设备等。 ### 回答2: ESP32是一款流行的微控制器,可以使用Micropython进行编程。该控制器集成了蓝牙功能,这使得它非常适合用于开发与蓝牙相关的应用。在使用Micropython编写蓝牙代码时,用户可以使用Pybluez模块来进行蓝牙通信Micropython中的Pybluez模块提供了与蓝牙相关的函数和类,可以使用它来创建蓝牙设备和服务,扫描蓝牙设备,连接到其他设备,发送和接收数据等。用户还可以使用该模块来制作厂商特定的蓝牙协议,以实现特定的蓝牙功能。 使用ESP32Micropython编写蓝牙代码的一个例子是将ESP32连接到一个蓝牙音箱。此时,用户需要使用Pybluez模块自动连接到蓝牙音箱,然后使用ESP32将音频数据发送到蓝牙音箱。用户还可以编写代码,使ESP32蓝牙音箱上播放特定的音频文件。 此外,使用ESP32Micropython编写蓝牙代码的另一个例子是通过蓝牙与手机进行通信。此时,用户可以使用ESP32作为蓝牙传输介质,以实现与智能手机的通信。通过Micropython编写的蓝牙代码,可以让ESP32与手机交换数据,例如读取传感器数据、控制LED等。 总之,ESP32是一款可用于蓝牙应用的微控制器,而Micropython则是一种方便且适合快速开发的编程语言。使用Micropython编写蓝牙代码,可以让用户轻松地创建各种类型的蓝牙应用程序。 ### 回答3: ESP32是一款广受欢迎的微控制器,它的热度得益于其高性能和低功耗,同时还拥有丰富的外设和传感器接口。ESP32采用的是双核处理器,其主频可以达到240MHz,同时还拥有Wi-Fi和蓝牙通信模块,因此它是一款非常适合物联网应用开发的微控制器。 而Micropython则是一种面向物联网的Python语言,它可以在嵌入式系统上运行,包括ESP32这样的微控制器。Micropython通过提供易于阅读和编写的Python语法,降低了嵌入式开发的门槛,而且还可以通过REPL交互式命令行进行实时调试和测试。 在ESP32上使用Micropython,我们可以充分利用它所包含的丰富的外设和传感器接口,例如使用蓝牙进行通信ESP32内置有蓝牙通信模块,因此可以通过Micropython轻松地实现蓝牙通信。 使用Micropython编写ESP32蓝牙程序通常需要进行以下几个步骤: 1. 导入必要的库:要使用蓝牙模块,需要导入esp32和bluetooth库。 2. 确认蓝牙是否开启:使用esp32库的ble启动函数确认蓝牙是否开启。 3. 设置蓝牙名称:使用bluetooth库的set_advertisement函数设置蓝牙名字和服务UUID。 4. 设计通信协议:根据需求设计通信协议,例如使用串口将数据发送至蓝牙模块或是使用socket套接字进行通信。 5. 进行数据传输:根据设计好的通信协议进行数据传输。 MicropythonESP32上的蓝牙开发,可以应用于诸如控制智能家居、物联网传感器数据采集、机器人等应用。同时,由于Micropython的易学、易用、易读等特点,也使得开发和测试更加方便。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值