ios - 蓝牙数据更新通知未被触发

标签 ios objective-c bluetooth core-bluetooth bluegiga

我在从蓝牙外围设备读取数据时遇到了一些问题。我们有一个带有以下 gatt 详细信息的蓝牙设备。

<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>

我在做的是

  • 搜索有“service id”的外设
  • 一旦找到就连接到外围设备并保持对它的强引用。
  • 连接设置委托(delegate)并搜索所有服务后 它提供
  • 循环所有服务并在我们发现后扫描特征 服务
  • 在我找到所需的特征后,我启用了通知
  • 点击按钮我正在将数据写入特征

我可以连接到设备。我也可以向外围设备发送命令(数据)。一旦我们向设备发送任何命令,它就会发送一些数据作为响应。我可以在设备上看到日志,一旦收到任何命令,它就会发回一些数据。但是在我的 iOS 设备中,我无法使用通知或正常读取功能来读取数据。我在这里缺少什么?

最佳答案

通知和指示是两个不同的东西:如果您启用指示,您将不会收到通知,如果您启用指示,则发送指示的应用程序期望对每个发送的指示(来自应用层)做出响应。

此外,您的权限似乎不太正确:xgatt_data 特性不一定需要“写入”权限,除非您打算让客户端更改它的。如果您想从通知中读取数据,则需要“读取”权限,而不是简单地通知它已收到。

要启用通知,xgatt_data 特性中需要一个客户端特性配置描述符 (UUID 00002901-..)。此 CCCD 需要“读+写”权限才能启用通知/指示(有些工作没有读取权限,有些则没有)。

最后确保您的设备永远不会同意小于通知大小的属性 MTU,如果它不适合单个包,外围设备将不会接收它。如果使用数据长度扩展,请在协商 DLE 之前不要启用通知,或者将通知值大小保持在设备的原始最小属性 MTU 以下。

关于ios - 蓝牙数据更新通知未被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44702529/

相关文章:

objective-c - awakeFromNib 到底是什么?

ios - 是否可以开发具有蓝牙功能的 iOS 应用程序?

ios - 检查用户是否登录 ios swift

ios - 更新 UITableViewCell subview

ios - 如何在 UIAlertController 中使用 UITextView

android - 如果 'x' 时间已经过去,则创建一个取消 InputStream.read() 调用的线程

java - 无法从 BLE 设备读取,写入工作正常 (Android)

iphone - 在 iPhone 上制作条形图

长时间不活动后的 iOS 应用程序生命周期

ios - 如何强制 iPad 横向加载?