问题标签 [cbperipheral]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
537 浏览

ios - 外设传输队列问题

我正在围绕 CoreBluetooth 开发一个简单的包装器,以将任何数据发送到任何设备。在开发过程中,我遇到了很多框架中的错误,它们非常烦人,为了使我的包装器稳定,我不得不缩短一些功能以提高可靠性。

现在我正在从外围设备发送数据。

好的,所以我有以下案例:

  • 客户要求动态特性的值
  • 我在服务器端收到回调 - peripheral:didReceiveReadRequest:。

注意:我需要在这个方法中响应这个 CBATTRequest - 我不能将它存储在其他地方并异步响应它。(我只是把一些 @“PrepareToReceiveValue” 块放在中央将被忽略。所有发送都在队列中完成。)

  • 为了为各种设备提供数据,我构建了一个包含 BTMessage 的队列。(所以对于 readRequest 我创建消息并将其添加到发送队列。如果块发送失败 - 我将从外围管理器获得有关 readyToUpdateSubscribers 的回调,并要求队列重新发送失败的块)
  • 因此,当我立即请求大量动态特征值并同时从外围设备向中央发送数据时,有时它只会冻结发送进度并导致断开连接。

经过几次测试,我发现这都是关于传输队列的:如果传输队列已满,您将收到读取请求 - 它只是不会响应它。

所以我有潜在的不稳定系统状态:

  1. 外围设备正在向某个中心发送数据。
  2. 在我的发送方法中,updateValue:forCharac... 返回 NO,因为传输队列已满。
  3. 此时,中心请求特性和外围设备的动态值:didReceiveReadRequest:调用将添加到当前运行循环。
  4. 从发送方法返回后,它将使 peripheral:didReceiveReadRequest: 方法出列并且响应此请求将无效(传输队列已满)。
  5. 所以在这种情况下,respondToRequest: 被忽略,就像我根本没有调用它一样。
  6. 在我响应请求之前,CoreBluetooth 将无法发送/接收任何数据。这就是冻结任何发送/接收进度并伴随断开连接的原因。
  7. 正如我之前提到的 - 我必须以适当的方法响应请求 - 否则它也将无效。(我这么说是因为如果队列已满,我试图将这些请求放入数组中,并在它有一些空间但没有运气时响应它们)。

我正在等待您的建议/建议如何解决这个问题,任何帮助将不胜感激。

0 投票
1 回答
664 浏览

encoding - CBP 外设名称。编码问题

我希望更改的是在 iOS 蓝牙设置和我的应用程序中显示的外围设备名称,以便用户可以识别设备。

我要做的是:

  1. 用户在 UITextField 中写了一个名字,我得到了 NSString。
  2. 我将 NSString 转换为 NSData。
  3. 使用新的外设名称写入特征。
  4. 外设更改 GATT 设备名称。

如果我使用 UTF8 编码来获取 NSData,一切正常,但在波浪线、书面重音和西里尔字母方面存在问题,因为应用程序支持多种语言。不确定问题出在 iOS 设备还是外围设备上。

我的问题:

  1. 我应该使用什么编码?
  2. 是否可以使用此字符作为名称?
  3. 调用 peripheral.name 时返回的字符串使用什么编码?
  4. 是否有另一种解决方案来更改显示的外围设备名称?
0 投票
1 回答
674 浏览

ios - CoreBluetooth 读/写数据

我正在使用 iOS 中心与 BLE 外围设备进行通信。

使用 LGBluetooth 框架https://github.com/DavidSahakyan/LGBluetooth

该方法得到

它输出“1234567890”

我需要将 (char *) [data bytes] 转换为 NSInteger。当我得到它

我得到 2013527536,但外围端的值为 1234567890

0 投票
1 回答
383 浏览

ios - iOS CoreBluetooth 和阻止其他设备连接到您的外围设备

我正在创建一个核心蓝牙应用程序并连接到外围设备,有没有办法让外围设备拒绝哪些中央设备可以连接到它?如果一个随机的人扫描并发现我的外围设备广播了 UUID,然后广播了该 UUID 并尝试连接它,我将如何防止这种情况发生?

0 投票
0 回答
1214 浏览

ios - 核心蓝牙状态保存 willRestoreState

此应用程序实现中央管理器状态保存和恢复。(IOS 7.1)

当应用程序被系统终止(ei memory low)时,核心蓝牙继续代表应用程序监视外围设备的事件,因此外围设备继续连接。

现在,如果外围设备断开连接(ei our of range ),应用程序重新启动到后台并调用willRestoreState但从不调用didDisconnectPeripheral,但如果用户将应用程序带回前台,则调用didDisconnectPeripheral

此应用程序必须在状态恢复后在后台处理didDisconnectPeripheral事件。

我怎样才能实现这种行为?

0 投票
1 回答
218 浏览

ios - 在 iOS 中更改 UIViewController 时保持蓝牙连接

我将外围委托的方法放在我的 2 UIViewController 中,但是当我进入第二个时,我失去了连接并再次连接。我想要的很简单,就是保持与 CBPeripheralManager 和 CBMUtableCharacteristic 相同的连接。有什么解决办法吗?

谢谢

0 投票
2 回答
1997 浏览

ios - iOS 未检测到新的外围设备名称

我们使用 CC2540 BLE 芯片作为外围设备,而 iOS 7.0.4 iPhone 正在发挥核心作用。

我们更改了外围设备名称,但仅当我们从 iOS 设备断开连接并重新连接时才会显示此更改。

它在 Android 中运行良好,使用此代码更改响应数据中的外围设备名称:

我们正在使用此代码来更改 iOS 中 GAP 层的外围设备名称:

有什么方法可以更改外围设备名称以便不需要重新连接?

0 投票
1 回答
1119 浏览

ios - IOS。discoverCharacteristics 方法调用 SIGABRT 信号

我正在研究 CoreBluetooth,但discoverCharacteristics方法有问题。

我初始化了我的服务和特性:

ServiceUUID的是@"ffe0"

应用程序在这个地方崩溃:[peripheral discoverCharacteristics:m_characteristics forService:service];

使用这样的日志(这里我使用了 1802 服务,但结果相同):

我做错了什么?

0 投票
2 回答
4744 浏览

ios - 如何从具有相同服务 UUID 的两个设备中找到特定的 BLE 4.0 外设

对于 BLE 4.0,它提供 API 来发现具有服务 UUID 数组的外围设备。

我只想找到具体的。如何做到这一点?

如果需要将标识符分配给特定设备,该怎么做?

(我认为我的问题需要一些iOS核心蓝牙的背景。)

0 投票
1 回答
1297 浏览

ios - CoreBluetooth:检索多个断开连接的外围设备的正确方法是什么?

在我目前正在从事的项目中,我正在使用单例类来处理所有与蓝牙相关的任务。它的CBCentralManager对象处理与多个外围设备的连接。当CBPeripherals被发现时,我让用户选择外围设备并连接到它。建立连接后,他/她可以选择另一个可用的设备,因此连接是按顺序完成的。

但是在检索连接时,我得到了一组检索到的外围设备。检索多个外围设备的最佳做法是什么?一次创建到外围设备的多个连接请求是否可以,还是应该按顺序完成?

现在我正在遍历检索到的外围设备并尝试与它们连接而无需等待。它可以工作,但需要一些时间,尽管我连接的 ble 硬件可能有问题。

更重要的是,当我触发方法时retrievePeripheralsWithIdentifiers:,它没有给我委托回调,所以我正在检索centralManager:didDisconnectPeripheral:error:方法,我在哪里

NSArray *retrieved = [self.centralMgr retrievePeripheralsWithIdentifiers:identifiers];

然后遍历检索到的对象。

它有效,但它是正确的方法吗?