ubluepy --- Bluetooth LE peripheral và central¶
Mô-đun ubluepy là API Bluetooth LE cũ đi kèm với nRF port của MicroPython. Nó được mô hình hóa một cách lỏng lẻo dựa trên thư viện Python bluepy trên Linux và nằm trực tiếp trên Nordic SoftDevice --- không có back-end di động, vì vậy mô-đun này chỉ khả dụng trên các mục tiêu Nordic (Arduino Nano 33 BLE Sense trong dòng sản phẩm của OpenMV). Các API bluetooth / aioble mới hơn không được bật trong bản dựng này, vì vậy ubluepy là cách duy nhất để điều khiển radio tích hợp.
Tập hợp tính năng có sẵn phụ thuộc vào SoftDevice được flash bởi firmware:
s140 (Nano 33 BLE Sense) --- cả hai vai trò peripheral và central (scanner). Đây là phiên bản firmware OpenMV cung cấp.
s132 --- cả peripheral và central.
s110 --- chỉ peripheral; các phương thức scanner / connect được biên dịch ra ngoài.
Ví dụ Peripheral¶
Quảng bá như một Bluetooth LE peripheral với một dịch vụ cảm biến môi trường duy nhất và thông báo một đặc tính nhiệt độ trên mỗi lần ghi vào Client Characteristic Configuration Descriptor (CCCD) của nó:
from ubluepy import Service, Characteristic, UUID, Peripheral, constants
from machine import LED
notif_enabled = False
def event_handler(event_id, handle, data):
global notif_enabled
if event_id == constants.EVT_GAP_CONNECTED:
LED("LED_GREEN").on()
elif event_id == constants.EVT_GAP_DISCONNECTED:
LED("LED_GREEN").off()
periph.advertise(device_name="Nano 33", services=[svc])
elif event_id == constants.EVT_GATTS_WRITE:
notif_enabled = bool(data[0])
svc = Service(UUID("181A")) # Environmental Sensing
char = Characteristic(UUID("2A6E"),
props=Characteristic.PROP_NOTIFY | Characteristic.PROP_READ,
attrs=Characteristic.ATTR_CCCD)
svc.addCharacteristic(char)
periph = Peripheral()
periph.addService(svc)
periph.setConnectionHandler(event_handler)
periph.advertise(device_name="Nano 33", services=[svc])
Ví dụ Central¶
Quét các thiết bị quảng bá gần đó trong 100 ms và giải mã dữ liệu quảng bá của mỗi ScanEntry
from ubluepy import Scanner, constants
s = Scanner()
for entry in s.scan(100):
print(entry.addr(), entry.rssi(), "dBm")
for ad_type, name, value in entry.getScanData():
print(" ", ad_type, name, bytes(value))
Nội dung mô-đun¶
Các lớp¶
- class ubluepy.UUID(value)¶
Tạo một Bluetooth UUID 16-bit hoặc 128-bit.
valueMột trong số:
int--- một UUID số 16-bit (UUID(0x180A)).Chuỗi
"0xXXXX"6 ký tự --- một UUID 16-bit, ví dụUUID("0x181A").Chuỗi
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"36 ký tự --- một UUID 128-bit đầy đủ. Phần dành riêng cho nhà cung cấp được đăng ký với SoftDevice khi khởi tạo.Một thực thể
UUIDkhác --- thực hiện sao chép.
Bất kỳ độ dài nào khác đều gây ra
ValueError("Invalid UUID string length").
- class ubluepy.Service(uuid: UUID, type: int = Service.PRIMARY)¶
Định nghĩa một dịch vụ GATT sẽ được đăng ký với SoftDevice khi được thêm vào
Peripheral.uuidMột thực thể
UUID. Truyền một đối tượng không phải UUID sẽ gây raValueError.typeLà
Service.PRIMARY(mặc định) hoặcService.SECONDARY. Các giá trị khác gây raValueError.
- addCharacteristic(characteristic: Characteristic) None¶
Đăng ký một
Characteristicvới dịch vụ. Handle GATT của đặc tính được gán trong lần gọi này.
- getCharacteristic(uuid: UUID) Characteristic | None¶
Tra cứu một
Characteristicđã được thêm trước đó theo UUID. Trả về thực thể đặc tính, hoặcNonenếu không tìm thấy.
- class ubluepy.Characteristic(uuid: UUID, *, props: int = PROP_READ | PROP_WRITE, attrs: int = 0)¶
Định nghĩa một đặc tính GATT. Thêm nó vào một
ServicevớiService.addCharacteristic()trước khiPeripheralcha bắt đầu quảng bá.uuidMột thực thể
UUID.props(keyword-only)Bitmask của một hoặc nhiều giá trị
Characteristic.PROP_*mô tả các thao tác mà đặc tính hỗ trợ.attrs(keyword-only)Bitmask của các thuộc tính GATT bổ sung. Sử dụng
Characteristic.ATTR_CCCDđể đính kèm Client Characteristic Configuration Descriptor --- cần thiết để làm cho các đặc tínhPROP_NOTIFY/PROP_INDICATEhoạt động.
- read() bytearray¶
Chỉ vai trò central. Đọc giá trị của đặc tính từ peer đã kết nối. Trả về
bytearrayvới giá trị mới nhất. Trên peripheral, đây là no-op và trả vềNone.
- write(data, *, with_response: bool = False) None¶
Ghi vào đặc tính.
Trên peripheral, nếu
PROP_NOTIFYđược đặt trong thuộc tính của đặc tính, giá trị được gửi dưới dạng thông báo GATT đến central đã kết nối; nếu không, giá trị thuộc tính cục bộ được cập nhật.Trên central, giá trị được ghi vào peer từ xa. Đặt
with_response=Trueđể gửi yêu cầu ghi và chờ xác nhận từ peer thay vì lệnh ghi.
datalà bất kỳ đối tượng nào hỗ trợ giao thức buffer (bytes,bytearray,memoryview).
- class ubluepy.Descriptor(uuid: UUID)¶
Lớp stub để biểu diễn các GATT descriptor. Cài đặt hiện tại chỉ lưu trữ UUID và không hiển thị các phương thức --- nó được cung cấp để tương thích với các phiên bản mô-đun trong tương lai.
- class ubluepy.Peripheral¶
Thiết bị Bluetooth LE cục bộ. Cùng một lớp được sử dụng cho cả vai trò peripheral và central; vai trò được chọn bởi các phương thức bạn gọi (
advertise()chọn peripheral,connect()chọn central).- addService(service: Service) None¶
Đăng ký một
Service(và tất cả các đặc tính đã được thêm trước đó) với máy chủ GATT cục bộ.
- getServices() list¶
Trả về danh sách các dịch vụ hiện đang được đăng ký với
Peripheralnày.
- advertise(*, device_name: str | None = None, services: list | None = None, data: bytes | None = None, connectable: bool = True) None¶
Bắt đầu quảng bá ở vai trò peripheral.
device_nameTên cục bộ đầy đủ được quảng bá trong tải trọng GAP.
servicesDanh sách các thực thể
Serviceđể quảng bá. UUID của mỗi dịch vụ được bao gồm trong quảng cáo.dataTải trọng quảng cáo thô tùy chọn (
bytes/bytearray) được thêm vào tiêu đề được tạo tự động. Sử dụng tham số này cho tải trọng dành riêng cho nhà cung cấp hoặc beacon như Eddystone.connectableKhi
True(mặc định), quảng bá như một thiết bị có thể kết nối và đăng ký bộ xử lý sự kiện GAP / GATTS để hàm gọi lạisetConnectionHandler()đã cấu hình kích hoạt khi kết nối, ngắt kết nối và ghi CCCD. KhiFalse, quảng bá như một beacon --- không có bộ xử lý nào được đính kèm và thiết bị không thể được kết nối.
- setConnectionHandler(func) None¶
Đăng ký một hàm gọi lại được gọi trên các sự kiện GAP và GATTS. Hàm gọi lại được gọi là
func(event_id, conn_handle, data)trong đóevent_idlà một trong các giá trịconstants.EVT_GAP_CONNECTED,constants.EVT_GAP_DISCONNECTED, hoặcconstants.EVT_GATTS_WRITE,conn_handlelà handle kết nối SoftDevice (hoặc handle thuộc tính cho ghi GATTS), vàdatalà tải trọng sự kiện thô dưới dạngbytearray(hoặcNonecho kết nối / ngắt kết nối).
- setNotificationHandler(func) None¶
Đăng ký một hàm gọi lại cho các sự kiện thông báo nhận được ở vai trò central.
- withDelegate(delegate: DefaultDelegate) None¶
Đính kèm một thực thể
DefaultDelegateđể nhận các sự kiện GATT đã giải mã.
- connect(addr, *, addr_type: int = constants.ADDR_TYPE_PUBLIC) None¶
Chỉ vai trò central. Kết nối với peer tại địa chỉ đã cho và đồng bộ khám phá các dịch vụ và đặc tính chính của nó. Chặn cho đến khi kết nối được thiết lập và khám phá hoàn tất; các dịch vụ đã khám phá sau đó có thể truy cập qua
getServices().addrĐịa chỉ peer dưới dạng chuỗi 17 ký tự
"xx:xx:xx:xx:xx:xx"(ví dụ lấy từScanEntry.addr()).addr_type(keyword-only)Là
constants.ADDR_TYPE_PUBLIC(mặc định) hoặcconstants.ADDR_TYPE_RANDOM_STATIC.
- class ubluepy.Scanner¶
GAP observer để khám phá các thiết bị quảng bá gần đó. Chỉ khả dụng khi firmware được xây dựng với SoftDevice hỗ trợ central (s132 / s140).
- class ubluepy.ScanEntry¶
Một báo cáo quảng cáo đơn lẻ được chụp bởi
Scanner.scan(). Các thực thể được trả về từ scanner --- không có constructor công khai.- addr_type() int¶
Trả về loại địa chỉ peer (
constants.ADDR_TYPE_PUBLIChoặcconstants.ADDR_TYPE_RANDOM_STATIC).
- getScanData() list¶
Giải mã tải trọng quảng cáo thành danh sách các tuple
(ad_type, description, value).ad_typelà byte loại AD số (xemconstants.ad_types),descriptionlà tên hằng số khớp dưới dạng chuỗi (hoặcNonenếu loại không xác định), vàvaluelà nội dung bản ghi AD dưới dạngbytearray.
- class ubluepy.DefaultDelegate¶
Lớp cơ sở cho các đối tượng được truyền vào
Peripheral.withDelegate(). Tạo lớp con và ghi đèhandleConnection()/handleNotification()để phản ứng với các sự kiện GATT.
Hằng số¶
Thuộc tính constants của mô-đun là một không gian tên chứa các định danh sự kiện GAP/GATT, giá trị loại địa chỉ, và không gian tên ad_types lồng nhau.
- constants.EVT_GAP_CONNECTED: int¶
Giá trị
event_idcủa bộ xử lý kết nốiPeripheralcho GAP connect (16).
- constants.EVT_GAP_DISCONNECTED: int¶
Giá trị
event_idcủa bộ xử lý kết nốiPeripheralcho GAP disconnect (17).
- constants.EVT_GATTS_WRITE: int¶
Giá trị
event_idcủa bộ xử lý kết nốiPeripheralcho lần ghi vào thuộc tính GATT cục bộ, bao gồm ghi vào CCCD để bật/tắt thông báo (80).
- constants.UUID_CCCD: int¶
UUID Bluetooth chuẩn cho Client Characteristic Configuration Descriptor (
0x2902).
- constants.ad_types: type¶
Không gian tên của các hằng số loại AD quảng bá từ Bluetooth Core Specification Supplement. Mỗi tên ánh xạ đến loại AD 1 byte tương ứng:
Tên
Giá trị
AD_TYPE_FLAGS0x01AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE0x02AD_TYPE_16BIT_SERVICE_UUID_COMPLETE0x03AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE0x04AD_TYPE_32BIT_SERVICE_UUID_COMPLETE0x05AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE0x06AD_TYPE_128BIT_SERVICE_UUID_COMPLETE0x07AD_TYPE_SHORT_LOCAL_NAME0x08AD_TYPE_COMPLETE_LOCAL_NAME0x09AD_TYPE_TX_POWER_LEVEL0x0AAD_TYPE_CLASS_OF_DEVICE0x0DAD_TYPE_SIMPLE_PAIRING_HASH_C0x0EAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R0x0FAD_TYPE_SECURITY_MANAGER_TK_VALUE0x10AD_TYPE_SECURITY_MANAGER_OOB_FLAGS0x11AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE0x12AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT0x14AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT0x15AD_TYPE_SERVICE_DATA0x16AD_TYPE_PUBLIC_TARGET_ADDRESS0x17AD_TYPE_RANDOM_TARGET_ADDRESS0x18AD_TYPE_APPEARANCE0x19AD_TYPE_ADVERTISING_INTERVAL0x1AAD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS0x1BAD_TYPE_LE_ROLE0x1CAD_TYPE_SIMPLE_PAIRING_HASH_C2560x1DAD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R2560x1EAD_TYPE_SERVICE_DATA_32BIT_UUID0x20AD_TYPE_SERVICE_DATA_128BIT_UUID0x21AD_TYPE_URI0x24AD_TYPE_3D_INFORMATION_DATA0x3DAD_TYPE_MANUFACTURER_SPECIFIC_DATA0xFF