我在从蓝牙外围设备读取数据时遇到一些问题。我们有一个蓝牙设备,其中包含以下关贸总协定详细信息。
<service uuid="service id" advertise="true">
<description>XXXX service</description>
<characteristic uuid="characteristic id" id="xgatt_data">
<description>Data</description>
<properties write="true" indicate="true" />
<value variable_length="true" length="20" type="user" />
</characteristic>
</service>
我正在做的是
- 搜索具有"服务 ID"的外围设备
- 一旦找到外设,就连接到外围设备,并保持对它的强引用。
- 连接设置委托并搜索所有服务后 它提供
- 循环所有服务并在发现后扫描特征 服务
- 找到所需的特征后,我正在启用通知
- 单击按钮时,我正在将数据写入特征
我能够连接到设备。 我也可以向外围设备发送命令(数据)。一旦我们将任何命令发送到设备,它就会发送一些数据作为响应。我可以看到设备上的日志,一旦收到任何命令,它就会发回一些数据。但是在我的iOS设备中,我无法使用通知或正常读取功能读取数据。我在这里错过了什么?
通知和标记是两个不同的东西:如果启用指示,则不会收到通知,如果启用指示,则发送指示的应用程序期望对每个发送的标记(从应用程序层)做出响应。
此外,您的权限似乎不太正确:xgatt_data特征不一定需要"写入"权限,除非您打算让客户端更改其值。如果要从通知中读取数据,则需要"读取"权限,而不仅仅是收到已收到数据的通知。
要启用通知,需要在xgatt_data特征中使用客户端特征配置描述符(UUID 00002901-..)。此 CCCD 需要"读+写"权限才能启用通知/指示(有些在没有读取权限的情况下工作,有些则没有)。
最后,确保您的设备永远不会同意小于通知大小的属性 MTU,如果它不适合单个包,外围设备将不会收到它。如果使用数据长度扩展,请不要在协商 DLE 之前启用通知,或者将通知值大小保持在设备的原始最小属性 MTU以下。
我发现了这个问题。实际上问题出在模拟器上。现在我可以获取数据更新指示,并且能够仅使用"读取"和"指示"属性将数据写入 BLE。