micropython esp32 ble.gap_scan 写一段示例代码
时间: 2023-09-13 20:02:53 浏览: 115
好的,以下是示例代码:
```python
from machine import Pin
from time import ticks_ms
from ubluetooth import BLE, UUID, FLAG_NOTIFY, FLAG_READ, FLAG_WRITE, FLAG_WRITE_NO_RESPONSE, BLEException
# 设定UUID
MY_SERVICE_UUID = UUID(0x1811)
MY_CHARACTERISTIC_UUID = UUID(0x2A46)
MY_DESCRIPTOR_UUID = UUID(0x2901)
# 初始化BLE
ble = BLE()
# 设定广告数据
adv_data = bytearray(b'\x02\x01\x06\x03\x02\x11\x15') + ble.config('mac')[::-1] + bytearray(b'\x0f\x09Micropython ESP32')
adv_data += bytearray(b'\x03\x03\x11\x15\xE0\xFF')
# 设定扫描响应数据
scan_resp_data = bytearray(b'\x04\x09ESP32\x02\x0a\x00\x02\x0a\x06\xDE\xAD\xBE\xEF')
# 设定GATT服务、特征值和描述符
my_service = ble.gatts_service(
uuid=MY_SERVICE_UUID,
isprimary=True
)
my_characteristic = my_service.add_characteristic(
uuid=MY_CHARACTERISTIC_UUID,
properties=FLAG_READ | FLAG_WRITE,
value=b'Initial value',
permissions=0x0A,
)
my_descriptor = my_characteristic.add_descriptor(
uuid=MY_DESCRIPTOR_UUID,
value=b'ESP32',
)
# 扫描结果处理函数
def scan_result(adt, addrType, addr):
print('Scanned device:', addr, 'type:', addrType, 'advertising data:', adt)
# 广告事件处理函数
def adv_event(adv):
print('Advertising:', adv)
# 设定扫描回调函数
ble.gap_scan(2000, 30000, interval_us=128000, window_us=112500, callback=scan_result)
# 设定广告事件回调函数
ble.irq(ble.IRQ_ADVERTISING_START, adv_event)
# 循环处理BLE事件
while True:
try:
events = ble.events()
for event, data in events:
if event == BLE.EVENT_SCAN_TIMEOUT:
print('Scan timeout')
elif event == BLE.EVENT_SCAN_RESULT:
# 处理扫描结果
addr, addrType, advtype, rssi, advdata = data
if addrType == 0:
# 仅处理公共地址设备
print('Scanned device with public address:', addr)
if b'Micropython ESP32' in advdata:
print('Device', addr, 'is an ESP32')
# 连接设备
try:
dev = ble.gap_connect(addr)
print('Connected to device:', addr)
# 发现服务
services = dev.list_services()
for service in services:
if service.uuid() == MY_SERVICE_UUID:
# 发现特征值
characteristics = service.list_characteristics()
for characteristic in characteristics:
if characteristic.uuid() == MY_CHARACTERISTIC_UUID:
print('Found characteristic:', characteristic.uuid())
# 读取特征值
value = characteristic.read()
print('Current value:', value)
# 写入特征值
characteristic.write(b'New value')
print('Value written')
break
# 断开连接
dev.disconnect()
print('Disconnected from device:', addr)
except BLEException as e:
print('Could not connect to device:', addr)
print(str(e))
elif event == BLE.EVENT_GATTS_WRITE:
# 处理特征值写入事件
conn_handle, attr_handle = data
value = my_characteristic.read()
print('Characteristic value written:', value)
except Exception as e:
print(str(e))
# 等待100ms
wait_ms = ticks_ms() + 100
while ticks_ms() < wait_ms:
pass
```
希望我的回答对你有所帮助,如有其他问题,不要犹豫地继续提问哦!