问题标签 [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.
ios - 外设传输队列问题
我正在围绕 CoreBluetooth 开发一个简单的包装器,以将任何数据发送到任何设备。在开发过程中,我遇到了很多框架中的错误,它们非常烦人,为了使我的包装器稳定,我不得不缩短一些功能以提高可靠性。
现在我正在从外围设备发送数据。
好的,所以我有以下案例:
- 客户要求动态特性的值
- 我在服务器端收到回调 - peripheral:didReceiveReadRequest:。
注意:我需要在这个方法中响应这个 CBATTRequest - 我不能将它存储在其他地方并异步响应它。(我只是把一些 @“PrepareToReceiveValue” 块放在中央将被忽略。所有发送都在队列中完成。)
- 为了为各种设备提供数据,我构建了一个包含 BTMessage 的队列。(所以对于 readRequest 我创建消息并将其添加到发送队列。如果块发送失败 - 我将从外围管理器获得有关 readyToUpdateSubscribers 的回调,并要求队列重新发送失败的块)
- 因此,当我立即请求大量动态特征值并同时从外围设备向中央发送数据时,有时它只会冻结发送进度并导致断开连接。
经过几次测试,我发现这都是关于传输队列的:如果传输队列已满,您将收到读取请求 - 它只是不会响应它。
所以我有潜在的不稳定系统状态:
- 外围设备正在向某个中心发送数据。
- 在我的发送方法中,updateValue:forCharac... 返回 NO,因为传输队列已满。
- 此时,中心请求特性和外围设备的动态值:didReceiveReadRequest:调用将添加到当前运行循环。
- 从发送方法返回后,它将使 peripheral:didReceiveReadRequest: 方法出列并且响应此请求将无效(传输队列已满)。
- 所以在这种情况下,respondToRequest: 被忽略,就像我根本没有调用它一样。
- 在我响应请求之前,CoreBluetooth 将无法发送/接收任何数据。这就是冻结任何发送/接收进度并伴随断开连接的原因。
- 正如我之前提到的 - 我必须以适当的方法响应请求 - 否则它也将无效。(我这么说是因为如果队列已满,我试图将这些请求放入数组中,并在它有一些空间但没有运气时响应它们)。
我正在等待您的建议/建议如何解决这个问题,任何帮助将不胜感激。
encoding - CBP 外设名称。编码问题
我希望更改的是在 iOS 蓝牙设置和我的应用程序中显示的外围设备名称,以便用户可以识别设备。
我要做的是:
- 用户在 UITextField 中写了一个名字,我得到了 NSString。
- 我将 NSString 转换为 NSData。
- 使用新的外设名称写入特征。
- 外设更改 GATT 设备名称。
如果我使用 UTF8 编码来获取 NSData,一切正常,但在波浪线、书面重音和西里尔字母方面存在问题,因为应用程序支持多种语言。不确定问题出在 iOS 设备还是外围设备上。
我的问题:
- 我应该使用什么编码?
- 是否可以使用此字符作为名称?
- 调用 peripheral.name 时返回的字符串使用什么编码?
- 是否有另一种解决方案来更改显示的外围设备名称?
ios - CoreBluetooth 读/写数据
我正在使用 iOS 中心与 BLE 外围设备进行通信。
使用 LGBluetooth 框架https://github.com/DavidSahakyan/LGBluetooth
该方法得到
它输出“1234567890”
我需要将 (char *) [data bytes] 转换为 NSInteger。当我得到它
我得到 2013527536,但外围端的值为 1234567890
ios - iOS CoreBluetooth 和阻止其他设备连接到您的外围设备
我正在创建一个核心蓝牙应用程序并连接到外围设备,有没有办法让外围设备拒绝哪些中央设备可以连接到它?如果一个随机的人扫描并发现我的外围设备广播了 UUID,然后广播了该 UUID 并尝试连接它,我将如何防止这种情况发生?
ios - 核心蓝牙状态保存 willRestoreState
此应用程序实现中央管理器状态保存和恢复。(IOS 7.1)
当应用程序被系统终止(ei memory low)时,核心蓝牙继续代表应用程序监视外围设备的事件,因此外围设备继续连接。
现在,如果外围设备断开连接(ei our of range ),应用程序重新启动到后台并调用willRestoreState但从不调用didDisconnectPeripheral,但如果用户将应用程序带回前台,则调用didDisconnectPeripheral。
此应用程序必须在状态恢复后在后台处理didDisconnectPeripheral事件。
我怎样才能实现这种行为?
ios - 在 iOS 中更改 UIViewController 时保持蓝牙连接
我将外围委托的方法放在我的 2 UIViewController 中,但是当我进入第二个时,我失去了连接并再次连接。我想要的很简单,就是保持与 CBPeripheralManager 和 CBMUtableCharacteristic 相同的连接。有什么解决办法吗?
谢谢
ios - iOS 未检测到新的外围设备名称
我们使用 CC2540 BLE 芯片作为外围设备,而 iOS 7.0.4 iPhone 正在发挥核心作用。
我们更改了外围设备名称,但仅当我们从 iOS 设备断开连接并重新连接时才会显示此更改。
它在 Android 中运行良好,使用此代码更改响应数据中的外围设备名称:
我们正在使用此代码来更改 iOS 中 GAP 层的外围设备名称:
有什么方法可以更改外围设备名称以便不需要重新连接?
ios - IOS。discoverCharacteristics 方法调用 SIGABRT 信号
我正在研究 CoreBluetooth,但discoverCharacteristics
方法有问题。
我初始化了我的服务和特性:
我ServiceUUID
的是@"ffe0"
应用程序在这个地方崩溃:[peripheral discoverCharacteristics:m_characteristics forService:service];
使用这样的日志(这里我使用了 1802 服务,但结果相同):
我做错了什么?
ios - 如何从具有相同服务 UUID 的两个设备中找到特定的 BLE 4.0 外设
对于 BLE 4.0,它提供 API 来发现具有服务 UUID 数组的外围设备。
我只想找到具体的。如何做到这一点?
如果需要将标识符分配给特定设备,该怎么做?
(我认为我的问题需要一些iOS核心蓝牙的背景。)
ios - CoreBluetooth:检索多个断开连接的外围设备的正确方法是什么?
在我目前正在从事的项目中,我正在使用单例类来处理所有与蓝牙相关的任务。它的CBCentralManager
对象处理与多个外围设备的连接。当CBPeripherals
被发现时,我让用户选择外围设备并连接到它。建立连接后,他/她可以选择另一个可用的设备,因此连接是按顺序完成的。
但是在检索连接时,我得到了一组检索到的外围设备。检索多个外围设备的最佳做法是什么?一次创建到外围设备的多个连接请求是否可以,还是应该按顺序完成?
现在我正在遍历检索到的外围设备并尝试与它们连接而无需等待。它可以工作,但需要一些时间,尽管我连接的 ble 硬件可能有问题。
更重要的是,当我触发方法时retrievePeripheralsWithIdentifiers:
,它没有给我委托回调,所以我正在检索centralManager:didDisconnectPeripheral:error:
方法,我在哪里
NSArray *retrieved = [self.centralMgr retrievePeripheralsWithIdentifiers:identifiers];
然后遍历检索到的对象。
它有效,但它是正确的方法吗?