标签: cbperipheral

CBPeripheral writeValue: forDescriptor 崩溃:

与 TI BLE 密钥卡建立连接并检索特征描述符后,我尝试调用

   [peripheral writeValue: nsData forDescriptor: descriptor];
Run Code Online (Sandbox Code Playgroud)

各种对象在调试器中看起来都很合理。nsData 有一个字节 1,peripheral 是从 iOS 返回的一个有效的 CBPeripheral 对象,descriptor 是一个由 iOS 返回的有效的 CBDescriptor。

我的应用程序因错误而崩溃

* -[CBConcretePeripheral writeValue:forDescriptor:]、/SourceCache/CoreBluetooth/CoreBluetooth-59.3/CBConcretePeripheral.m:358 中断言失败

关于为什么会发生这种情况或如何调试它有什么想法吗?

ios core-bluetooth cbperipheral

5
推荐指数
1
解决办法
2243
查看次数

iOS Core Bluetooth:在外围设备上未发现广告服务

在连接到广告我感兴趣的特定服务的BLE设备之后,为了发现这项服务,我打电话给:

[self.peripheral discoverServices:@[[self.class serviceUUID]]];
Run Code Online (Sandbox Code Playgroud)

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error委托方法被调用,没有错误,但在外围返回服务的数量为0,因此没有特性进一步发现.有谁知道为什么会这样?提前致谢!

以下是委托方法的完整主体.

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
    if (error) {
        NSLog(@"didDiscoverServices failed: %@", error);
        return;
    }

    NSLog(@"didDiscoverServices succeeded for peripheral: %@.", peripheral.name);
    NSLog(@"Number of services: %d", peripheral.services.count);

    for (CBService *s in peripheral.services) {
        NSLog (@"Discovered service UUID: %@", s.UUID);
        if ([s.UUID isEqual:[self.class serviceUUID]]) {
            NSLog(@"Discover characteristics...");
            [self.peripheral discoverCharacteristics:@[[self.class controlPointCharacteristicUUID], [self.class packetCharacteristicUUID]] forService:s];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台显示:

2014-11-27 15:54:51.933 k[197:13362] didDiscoverServices succeeded for peripheral: BootK
2014-11-27 15:54:51.934 k[197:13362] Number of …
Run Code Online (Sandbox Code Playgroud)

xcode objective-c ios core-bluetooth cbperipheral

5
推荐指数
1
解决办法
913
查看次数

ios缓存BLE服务和特性的条件是什么?

我已经读过当我断开连接然后重新连接到同一设备时,ios 正在缓存 BLE 外围设备的服务和特征(当然是在发现这些服务和特征之后)。所以重新发现的漫长过程是不必要的,我可以在重新连接后直接写入或读取这些特性。

在这个线程中: 有没有办法更快地发现 BLE 外设服务? 据说如果连接是加密的,则服务和特征会被缓存。此外,在 WWDC 2013 Session 702 中,它说服务和特征已缓存,但未指定条件。

ios缓存BLE服务和特性的条件是什么?有人可以验证只需要加密连接吗?

ios core-bluetooth bluetooth-lowenergy cbperipheral cbcentralmanager

5
推荐指数
0
解决办法
592
查看次数

在 OSX 和 iOS (GAP/GATT) 上发现外设时,CBPeripheral 广告数据不同

我希望将我的一些 CoreBluetooth 代码从 iOS 移植到 OS X。我已经设置了一组共享的 CoreBluetooth 包装器,iOS 应用程序和 OS X 应用程序使用相同的 BLE 设备以完全相同的方式使用这些包装器.

外围设备扫描:

override init() {
    super.init()
    let queue = DispatchQueue.global(qos: .background)
    centralManager = CBCentralManager(delegate: self, queue: queue)
}

func startScanning() {
    let options: [String: Any] = [CBCentralManagerScanOptionAllowDuplicatesKey: true]
    let deviceUUID = CBUUID(string: Project.Service.Device)
    let recoveryUUID = CBUUID(string: Project.Service.DFURecovery)
    centralManager?.scanForPeripherals(withServices: [deviceUUID, recoveryUUID], options: options)
}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
    // Inspect advertisementData here to decipher what kind …
Run Code Online (Sandbox Code Playgroud)

bluetooth core-bluetooth bluetooth-lowenergy cbperipheral cbcentralmanager

5
推荐指数
1
解决办法
2029
查看次数

如何在CBPeripheralManager处于活动状态时提高CBCentralManager的性能

我们创建了一个iOS应用程序,它实现了一个CBCentralManager来连接我们创建的设备,以10Hz的频率传输数据.这些数据通过并快速显示非常重要,因此我们围绕此建立了严格的延迟检查,如果错过了太多的点,或者如果本地时钟检测到传入值减慢,我们将会出错并断开连接.

客户端已经要求我们顶级实现第二个iOS应用程序,它将观察第一个.我们在原始应用程序中实现了一个CBPeripheralManager,它可以广告,可以连接,并定期将其数据发布到一些传出特性.

我们发现我们似乎无法将观察者iOS应用程序连接到原始iOS应用程序(即,原始iOS应用程序同时具有与设备的CBCentral连接和同时活动的观察者应用程序的CBPeripheral连接),绊倒我们对来自设备的传入数据的延迟检查.

我已经尝试了我能想到的一切,我为CBPeripheralManager和CBCentralManager使用了单独的队列,如下所示:

    q = dispatch_get_global_queue(QOS_CLASS_UTILITY, 0);
    ptr_CBPeriphMgr = [[CBPeripheralManager alloc] initWithDelegate:self queue:q];
Run Code Online (Sandbox Code Playgroud)

也,

  • 我记录并记录了所有内容,验证我的代码没有花太长时间
  • 我将几乎所有的代码都移出了BLE处理程序,使它们非常轻巧而不会阻塞,
  • 我尝试了低优先级的单独队列(上面显示的例子)
  • 我已经尝试将我的CBPeripheralManager数据速率降低到涓流,一秒钟更新几次
  • 我已经尝试在建立CBPeripheralManager连接后暂停延迟检查三秒钟(这非常不理想),但问题似乎是随机发生的,而不仅仅是在连接之后.

似乎无论我尝试什么,在外围设备和中央连接都处于活动状态4-5分钟后(我们有一个循环,其中第二个应用程序每隔五秒重复连接并断开连接,以挑战设备连接)我的传入值更新自中央设备减速到大约1/4或1/5速度,或者它们停止一整秒,然后几乎同时进行三到四次更新 - 这两次更新都会延迟我们的延迟检查.这就像是一些队列被填满并且表现平坦,但正如我上面提到的,我认为我正在使用单独的队列.

我在我的智慧结束...有没有人想过如何在iOS应用程序中优先考虑我的中心功能而不是我的外围功能,或以某种方式提高性能以防止这成为一个问题并保持我的应用程序响应10Hz来自设备的更新,即使被视为外围设备?

(编辑说我们正在重复连接/断开第二个应用程序...也许我在正确断开连接后没有清理,垃圾堆积并搞砸了BLE?这可以解释为什么问题似乎发生在4之后无论第二次连接的数据更新频率如何,均为-5分钟.)

ios bluetooth-lowenergy cbperipheral cbcentralmanager cbperipheralmanager

5
推荐指数
1
解决办法
345
查看次数

如何在ios swift中为BLE设备写入characteristc值

我正在开发 iOS BLE 应用程序来为手机充电。我做了所有正确的事情来发现特征。首先扫描外围设备并连接到它。发现具有通知和无响应写入属性的服务(FFB0)和特征(FFB1,FFB2)。

\n\n

我找到了客户端特征配置描述符。我想向 PCB 发送命令以解锁充电 我想将值写入 FFB2 特性,但外设没有响应。这是我的代码。

\n\n

我已经搜索了与此相关的所有内容,但没有找到任何解决方案如果有人提供此问题的解决方案,这将对我有所帮助。

\n\n

这是客户提供的文件:

\n\n

每个PCB上都有一个BLE4.0蓝牙模块,每个蓝牙模块都有一个单独的12字节长度的地址码,PCB数据通道,Service UUID为OxFFBO,包括两个特征值,分别是OxFFBI和OxFFB2,通信长度数据为1--20字节。\nOxFFB1为APP数据下载通道。OxFBB2为蓝牙上传数据通道。

\n\n

开机进入空闲模式,空闲模式下两个灯会闪烁。它会发送一个ID码(一个字节)到手机,手机中的APP会获取该ID码(一个字节)。\nID码可以通过手机设置来设置。是指通过ID码发送相应的解锁指令。

\n\n

解锁指令为0x55,0xe1,(ID0+1),时间,解锁指令说明如下:

\n\n

ID0为ID码,“time”为用户解锁时间(5-120分钟),\n请注意是二进制到十六进制的转换,\ntime==05表示5分钟,\ntime==6表示6分钟,\n时间==A表示10分钟,以此类推。\n如果PCB的ID0为0xff,\n解锁PCB 60分钟为:0x55,0xe1,0x00,0x3c;\n如果PCB的ID0为0x05 ,\n解锁 PCB 10 分钟为:0x55、0xe1、0x06、0x0a

\n\n

当PCB上的MCU收到解锁指令时,将开始打开输出并计时。\n计时时间到后系统再次进入空闲模式。\n在空闲模式下,长按该键进入关机休眠时间模式。

\n\n

uart 波特率设置为 9600。\nAPP 向 MCU 发送的查询指令为 0x55 0x01\nMCU 回复 APP 的信息格式为:0x55,0x02,bat_level,xH,XL(xH XL 代表当前电池电压值,\nxH - 代表高8位,XL---代表低8位)

\n\n
import CoreBluetooth\n\nlet batteryServiceCBUUID = CBUUID(string: "FFB0")\nlet batteryServiceRequestCBUUID = CBUUID(string: "FFB1")\nlet batteryServiceRequestCBUUID2 = CBUUID(string: "FFB2")\n\n class ChargingViewController: UIViewController , CBPeripheralDelegate \n ,CBCentralManagerDelegate {    \n\n  override func viewDidLoad() {\n    super.viewDidLoad()\n centralManager = CBCentralManager(delegate: self, …
Run Code Online (Sandbox Code Playgroud)

characteristics ios core-bluetooth cbperipheral swift

5
推荐指数
1
解决办法
7294
查看次数

CBPeripheral,获取本地外设标识符

我遇到了关于CoreBluetooth Framework的问题.

例如,我有两个设备,每个设备同时执行广告和扫描.所以,我在每个上都使用CBCentralManager和CBPeripheralManager.

因此,为了简化问题,我们假设Device1正在广播和Device2扫描.

当Device2上的CBCentralManager发现Device1时,回调centralManager:didDiscoverPeripheral:advertisementData:RSSI:被调用,我可以通过调用[peripheral.identifier UUIDString]来获取Device1标识符.

那我怎么能得到我的本地设备(Device2)标识符?我的意思是,如果两个设备都是广告,Device1也会发现Device2并获取它的外围设备标识符,但我怎样才能在Device2上获得这个标识符(某种自身地址)?

PS我知道这个标识符对于每个设备都不是唯一的,并且可以随时间变化,这不是问题.

ios core-bluetooth cbperipheral cbcentralmanager ibeacon

4
推荐指数
1
解决办法
4749
查看次数

外围没有连接 - 斯威夫特

在我的Swift应用程序中,我有一个应该找到蓝牙设备并连接到它的视图.蓝牙设备已开机.我能够扫描并找到该设备,然后我调用该功能连接到它,但我得不到任何反馈.我不确定为什么它无法连接.

didFailToConnectPeripheral或didConnectPeripheral都没有返回任何值.

我如何让它工作?

import UIKit
import CoreBluetooth

class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate {

    var manager: CBCentralManager!


    override func viewDidLoad() {
        super.viewDidLoad()
        manager = CBCentralManager (delegate: self, queue: nil)
    }


    func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {

        print("Peripheral: \(peripheral)")

        manager.connectPeripheral(peripheral, options:nil)

        manager.stopScan()

    }



    func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
        print("connected!")
    }

    func centralManager(central: CBCentralManager, didDisconnectPeripheral
        peripheral: CBPeripheral, error: NSError?) {
            print("disconnected!")
    }


    func centralManager(central: CBCentralManager,
        didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {
            print("failed")
    }


    func …
Run Code Online (Sandbox Code Playgroud)

core-bluetooth bluetooth-lowenergy cbperipheral swift cbperipheralmanager

4
推荐指数
1
解决办法
3727
查看次数

单个 BLE 中心可以通过蓝牙低功耗连接多个 BLE 外设吗?

我在我的 iOS 应用程序项目中使用核心蓝牙框架。我有以下关于蓝牙低功耗的问题-

  1. 一个单一的中心是否有可能在 iOS 中连接多个外围设备?
  2. 多个中心设备可以连接单个外围设备吗?
  3. 单个 iOS 设备能否同时充当中心和外围设备?
  4. 如果是,那么如果两个这样的设备都尝试作为彼此的中心连接会发生什么?
  5. 当应用程序在后台时,我们可以通过 BLE 进行通信吗?

ios core-bluetooth bluetooth-lowenergy cbperipheral cbcentralmanager

4
推荐指数
1
解决办法
1792
查看次数

使用 CoreBluetooth 提高文件传输速度

目前,我的 OSX 应用程序(中央)通过使用 writeValue 的可写特性将 4Kb 图像发送到我的 iOS 应用程序(外围)。

由于图像大小超出限制,我通过以下函数多次使用 writeValue :

func sendData() {
    while (self.sendDataIndex < self.dataToSend.length) {
        var amountToSend = self.dataToSend.length - self.sendDataIndex!

        if (amountToSend > NOTIFY_MTU) {
            amountToSend = NOTIFY_MTU
        }

        // Copy out the data we want
        var chunk = self.dataToSend.subdataWithRange(NSMakeRange(self.sendDataIndex!, amountToSend))

        // Send it
        self.discoveredPeripheral?.writeValue(chunk, forCharacteristic: self.setupCharacteristic, type: CBCharacteristicWriteType.WithoutResponse)

        // It did send, so update our index
        self.sendDataIndex = self.sendDataIndex!+amountToSend;

    }
    self.discoveredPeripheral?.writeValue("EOM".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true), forCharacteristic: self.setupCharacteristic, type: CBCharacteristicWriteType.WithResponse)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是它花费的时间比我需要的要长得多,大约 30 秒。

奇怪的是,即使我在发送图像时使用 CBCharacteristicWriteType.WithoutResponse,我也会收到它们的响应,我想知道这是否会使速度变慢。 …

ios core-bluetooth cbperipheral cbcentralmanager

3
推荐指数
1
解决办法
1588
查看次数