8.10. bluetooth 模块 API 文档

8.10.1. API

创建具有指定值的 UUID 实例

该值可以是

  • 一个 16 位整数. 例如0x2908

  • 一个 32 位整数. 例如0x29081234

  • 一个 128 位的 UUID 字符串。例如'6E400001-B5A3-F393-E0A9-E50E24DCCA9E'.

8.10.1.1. class UUID():

def __init__(self,value):...
def _UUID_to_bytes(self,value):...

8.10.1.2. class BLE(_bluetooth.BLE):

def __init__(self):...
def test(self):...
def test2(self):...
def test3(self,connhandle,valuehandle):...
def test4(self,data):...
def test_call_some_name(self):...
def _check_active(self):...

可选择更改 BLE 无线电的活动状态,并返回当前状态。

Args:

  • active(bool): 为 1 则开启BLE, 否则关闭BLE; 为空则查询当前BLE状态

Returns:

  • bool:设置状态时,返回操作成功与否; 查询状态时, 返回状态, True为活跃

def active(self,active_flag=None):...

获取或设置 BLE 接口的配置值。

要获得一个值,参数名称应该被引用为一个字符串,并且一次只查询一个参数。

config("gap_name")

要设置值,请使用关键字语法,并且一次可以设置一个或多个参数。

config(gap_name="nimble")

当前支持的值是:

  • 'mac':

TODO:需要支持设置任意值嘛?有点困难

  • 'addr_mode':

  • 'gap_name':

  • 'rxbuf':

TODO:暂未支持, 没找到对应函数

  • 'mtu':

TODO:不明意义

  • 'bond':

TODO: 目前提供的接口不支持

  • 'mitm':

TODO: 目前提供的接口不支持

  • 'io':

TODO:未找到对应函数

  • 'lesure':

TODO:只支持设置

def config(self,*param_name,**kv):...

为来自 BLE 堆栈的事件注册回调。

处理程序采用两个参数,event(在下面的代码中的一个) 和 data(其是值的特定事件元组)。

def irq(self,func):...
def _callback(self,data):...

以指定的时间间隔(以微秒为单位)开始广播。

adv_data和resp_data可以是任何实现缓冲协议的类型(例如bytes, bytearray, str)。adv_data包含在所有广播中,并且resp_data被发送以响应主动扫描。

注意:如果adv_data(或resp_data)是None, 则传递给前一个调用的数据 gap_advertise将被重新使用。

要清除广告有效负载, 请传递一个空值bytes, 即b’’

Args:

  • interval_us(int):广播时间间隔, 单位us. 此间隔将向下舍入到最接近的 625us的倍数。要停止广告, 请将interval_us设置 为 None。

  • adv_data(bytes, bytearray, str): 自定义广播数据(添加到默认广播数据后),默认值为none

TODO:1.append模式只能是0XFF数据; 归零模式全部自定义输入

  • resp_data(bytes, bytearray, str): 扫描响应数据,默认值为none

  • connectable(bool): 是否可连接, True 为可连接.

  • adv_data_append: 是否是增加数据

TODO:存在问题

def gap_advertise(self,interval_us,adv_data=None,resp_data=None,connectable=None,adv_data_append=None):...

运行持续指定持续时间(以毫秒为单位)的扫描操作。

要无限期扫描, 请将duration_ms设置为0;要停止扫描,请将duration_ms设置为 None.

使用interval_us和window_us可选择配置占空比。扫描器将每interval_us微秒运行window_us 微秒,总共持续duration_ms毫秒。

默认间隔和窗口分别为 1.28 秒和 11.25 毫秒(后台扫描).

对于每个扫描结果, _IRQ_SCAN_RESULT将引发事件, 并带有事件数据。(addr_type, addr, adv_type, rssi, adv_data)

Args:

  • duration_ms(int):扫描持续时间。要无限期扫描, 请将duration_ms设置为0;要停止扫描,请将duration_ms设置为 None.

  • interval_us(int): 扫描间间隔时间。默认值为1280000

  • window_us(int): 扫描窗口时间。默认值为11250

  • active(bool): 是否接受扫描响应。默认值False(不接受)

Return:

  • 操作成功返回 0; 否则返回错误代码

events:

  • 单个扫描结果触发 _IRQ_SCAN_RESULT

  • 扫描结束触发 _IRQ_SCAN_DONE

def gap_scan(self,duration_ms,interval_us=1280000,window_us=11250,active=False):...

central 设备连接 peripherals 设备

Args:

  • peer_addr(list,bytes,bytearray): 需要连接的设备的mac地址

  • peer_addr_type(int): 连接设备的地址类型

  • 0x00 - PUBLIC - 使用控制器的公共地址。

  • 0x01 - RANDOM - 使用生成的静态地址。

  • 0x02 - RPA - 使用可解析的私有地址。

  • 0x03 - NRPA - 使用不可解析的私有地址。

Return:

  • (int): 操作成功返回 0; 否则返回错误代码

events:

  • 连接成功触发 CENTRAL设备:_IRQ_PERIPHERAL_CONNECT; PERIPHERAL设备:_IRQ_CENTRAL_CONNECT

def gap_connect(self,peer_addr,peer_addr_type,scan_duration_ms=2000):...

Args:

  • conn_handle(int): 连接句柄

Return:

  • (int): 操作成功返回 0; 否则返回错误代码

events:

  • 断连成功触发 CENTRAL设备:_IRQ_PERIPHERAL_DISCONNECT; PERIPHERAL设备:_IRQ_CENTRAL_DISCONNECT

def gap_disconnect(self,conn_handle):...

使用指定的服务配置服务器,替换任何现有服务。

Args:

  • services(嵌套多层tuple):

Return:

  • (int): 操作成功返回 0; 否则返回错误代码

def gatts_register_services(self,services):...

Args:

  • value_handle(int): 蓝牙特性句柄

Return:

  • (int): 操作成功返回 0; 否则返回错误代码

def gatts_read(self,value_handle):...

Args:

  • value_handle(int): 蓝牙特性句柄

  • data(str,int,bytes,list(元素为小于256大于0的整数)): 修改的数据

  • send_update(bool):是否通知客户端, False为不通知, 默认为False

Return:

  • (int): 操作成功返回 0; 否则返回错误代码

events:

  • send_update 为 True 时, 触发tx事件

def gatts_write(self,value_handle,data,send_update=False):...

向连接的客户端发送通知请求。

Args:

  • conn_handle(int): 连接句柄

  • value_handle(int): 蓝牙特性句柄

  • data(str,int,bytes,list(元素为小于256大于0的整数)): 发送的数据, 默认值为None

如果data不是None, 则该值将作为通知的一部分发送给客户端。本地值不会被修改。否则, 如果data是None, 则将发送当前本地值

Return:

  • (int): 操作成功返回 0; 否则返回错误代码

events:

def gatts_notify(self,conn_handle,value_handle,data=None):...

Args:

Return:

  • 操作是否成功

events:

def gatts_indicate(self,conn_handle,value_handle,data=None):...

Args:

Return:

  • 操作是否成功

events:

def gatts_set_buffer(self,value_handle,len,append=False):...

打印全部本地服务

def gatts_show_local(self):...

Args:

Return:

  • 操作是否成功

events:

def gattc_discover_services(self,conn_handle,uuid:UUID=None):...

Args:

Return:

  • 操作是否成功

events:

def gattc_discover_characteristics(self,conn_handle,start_handle,end_handle,uuid:UUID=None):...

Args:

Return:

  • 操作是否成功

events:

def gattc_discover_descriptors(self,conn_handle,start_handle,end_handle):...

Args:

Return:

  • 操作是否成功

events:

def gattc_read(self,conn_handle,value_handle):...

Args:

Return:

  • 操作是否成功

注意:单次传输最多95个byte

events:

def gattc_write(self,conn_handle,value_handle,data,mode=0):...

Args:

Return:

  • 操作是否成功

events:

def gattc_exchange_mtu(self,conn_handle):...
def gattc_subscribe(self,conn_handle,value_handle,subscribe=0):...
def _c2value(self,handle):...
def _py2value(self,handle):...
def _c2_change_value(self,handle,value):...
def _py2_change_value(self,handle,value):...
def _convert_ble_service_info(data):...
def _count_chrs(srvs_tuple):...
def _to_bytes(data,size=None):...

8.10.2. Examples