cb — 连接到蓝牙LE外围设备
cb(“核心蓝牙”)模块使你可以连接到蓝牙LE(“低能量”)外设,如TI SensorTag(包含像红外温度计,加速计等多种传感器小型和负担得起的BTLE设备)。
本文档中的示例假定你具有标准的Bluetooth LE心率监视器或TI SensorTag,但是该模块还可以与其他类型的Bluetooth LE外设配合使用。请注意,不支持“经典”蓝牙(耳机,键盘等)。
该模块基于CoreBluetooth框架,但未公开其所有功能-例如,它仅实现核心角色,即,你可以连接到外围设备,而不能让设备充当外围设备本身。
快速入门
连接到Bluetooth LE设备并从中读取数据的基本过程包括以下步骤:
- 定义一个代理对象,该对象负责处理有关发现的设备(外围设备),服务和服务特征的通知/回调。稍后将介绍你可以实现的回调方法。
- 调用
scan_for_peripherals()
开始扫描。在许多情况下,你还需要使设备可被发现。对于TI SensorTag,你可以按侧面按钮。 - 当你的代理收到
did_discover_peripheral
回调时,检查其名称或uuid,如果找到了要连接的外围设备,调用connect_peripheral()
。你还应该保留对发现的外围设备的引用,因为如果该对象是垃圾回收的,那么你还将失去连接。 - 如果一切顺利,则将调用
did_connect_peripheral
回调。此时,你可以通过调用Peripheral.discover_services()
开始发现外围设备的服务。 - 发现外围设备的服务后,你将收到
did_discover_services
回调。现在,你可以访问外围设备的services
属性,并-对于你感兴趣的服务-调用Peripheral.discover_characteristics()
。 - 你可能已经猜到了,这将导致
did_discover_characteristics
回调。现在,你可以通过调用Peripheral.read_characteristic_value()
读取特征的值(成功读取值后将导致另一个回调),或通过调用Peripheral.set_notify_value()
启用该特征的通知。 - 以下代码显示了如何连接到Bluetooth LE心率监测器。这个特定的示例假设你拥有Polar设备,但是应该很容易将其适应其他品牌(只需相应地更改
did_discover_peripheral
方法):
1 | import cb |
下面的示例演示如何使用TI SensorTag执行类似的操作。它将记录温度传感器的值(大约每秒一次,与上面的心率监视器示例非常相似),并在按下SensorTag的两个按钮中的任何一个时播放声音:
1 | import cb |
函数
cb.set_central_delegate(delegate)
1 | class MyDelegate (object): |
cb.set_verbose(flag)
设置为True
时,所有回调事件都会记录到控制台,无论代理(请参阅set_central_delegate()
)是否实现了这些事件–这对于调试很有用。
cb.scan_for_peripherals()
开始扫描广播服务的外围设备。
cb.stop_scan()
停止扫描外围设备。
cb.connect_peripheral(peripheral)
建立与外围设备的连接。通常,这将从您的did_discover_peripheral
回调实现中调用。
cb.cancel_peripheral_connection(peripheral)
取消与外围设备的活动或本地连接。
cb.get_state()
返回中央管理器的当前状态(有关可能的值,请参见常量)
cb.reset()
断开所有外围设备的连接。这还将中央代理设置为None
,因此您将不再收到任何回调。
类
注意: 此模块中的类不能直接实例化。相反,你将获得不同类的实例作为代理实现的回调函数的参数(请参阅参考资料
set_central_delegate()
)。
外设类
class cb.Peripheral
Peripheral
类表示已经通过scan_for_peripherals()
被发现的外围设备。外围设备由通用唯一标识符(UUID)标识。外围设备可能包含一个或多个服务(由Service
对象表示)。
外设类的方法
Peripheral.discover_services()
发现外围设备的服务。发现完成后,中央代理将收到did_discover_services
回调。
Peripheral.discover_characteristics(service)
发现给定Service
的特征。通常,这将从did_discover_services
回调中调用。发现特征后,代理将收到did_discover_characteristics
回调。
Peripheral.set_notify_value(characteristic, flag=True)
启用或禁用给定Characteristic
的通知(注意:并非所有特征都支持通知)。启用通知后,您可能会did_update_value在中央代理中收到did_update_value
回调(请参阅参考资料set_central_delegate()
)。
Peripheral.write_characteristic_value(characteristic, data, with_response)
写下Characteristic
的值。数据应为字节字符串。with_response
确定写入完成(或失败)后是否将调用did_write_value
回调。请注意,并非所有特征都支持无响应的书写值。
Peripheral.read_characteristic_value(characteristic)
检索给定Characteristic
的值。读取值后,代理将收到一个did_update_value
回调,此时您可以使用特征的value
属性访问该值。并非所有特性都保证具有可读值。
外设类的属性
Peripheral.manufacturer_data
制造商特定的数据,是外围设备广告数据的一部分。您可以在不连接外围设备的情况下(通常在did_discover_peripheral
回调中)阅读此内容。
Peripheral.name
外设的名称(字符串或None
)
Peripheral.uuid
外设的唯一标识符(十六进制字符串)
Peripheral.state
外围设备的连接状态(0 =断开连接,1 =连接,2 =连接)
Peripheral.services
外设的发现服务(Service
对象列表)。请注意,在您成功调用Peripheral.discover_services()
(并收到did_discover_services
回调)之前,该字段通常为空。
服务类
class cb.Service
Service
对象代表一种Peripheral
服务-用于完成设备(或设备的某些部分)功能或特性的数据和相关行为的集合。服务是主要的或辅助的,并且可能包含许多:Characteristic
类。
服务类的属性
Service.characteristics
服务的特征(如果尚未发现特征,则为空的Characteristic
对象列表)
Service.primary
指示服务是主服务还是辅助服务的布尔标志
Service.uuid
服务的唯一标识符(十六进制字符串)
特征类
class cb.Characteristic
Characteristic
对象代表有关外围设备服务的更多信息。特征包含单个值。特性的属性决定了如何使用特性的值。
特征类的属性
Characteristic.uuid
特征的唯一标识符(十六进制字符串)。
Characteristic.value
特征的当前值(字节字符串,如果尚未读取或没有值,则为None
)
Characteristic.notifying
一个标志,用于确定是否为此特性启用了通知(只读,通过设置Peripheral.set_notify_value()
)
Characteristic.properties
特征属性的位掩码(请参见下面的CH_PROP_*
常量)
常量
get_state()
可能的返回值:
cb.CM_STATE_UNKNOWN
cb.CM_STATE_RESETTING
cb.CM_STATE_UNSUPPORTED
cb.CM_STATE_UNAUTHORIZED
cb.CM_STATE_POWERED_OFF
cb.CM_STATE_POWERED_ON
特征属性 (注意: 这些值可以被组合为一个位掩码):
cb.CH_PROP_BROADCAST
cb.CH_PROP_READ
cb.CH_PROP_WRITE_WITHOUT_RESPONSE
cb.CH_PROP_WRITE
cb.CH_PROP_NOTIFY
cb.CH_PROP_INDICATE
cb.CH_PROP_AUTHENTICATED_SIGNED_WRITES
cb.CH_PROP_EXTENDED_PROPERTIES
cb.CH_PROP_NOTIFY_ENCRYPTION_REQUIRED
cb.CH_PROP_INDICATE_ENCRYPTION_REQUIRED