与 TI BLE 密钥卡建立连接并检索特征描述符后,我尝试调用
   [peripheral writeValue: nsData forDescriptor: descriptor];
各种对象在调试器中看起来都很合理。nsData 有一个字节 1,peripheral 是从 iOS 返回的一个有效的 CBPeripheral 对象,descriptor 是一个由 iOS 返回的有效的 CBDescriptor。
我的应用程序因错误而崩溃
* -[CBConcretePeripheral writeValue:forDescriptor:]、/SourceCache/CoreBluetooth/CoreBluetooth-59.3/CBConcretePeripheral.m:358 中断言失败
关于为什么会发生这种情况或如何调试它有什么想法吗?
在连接到广告我感兴趣的特定服务的BLE设备之后,为了发现这项服务,我打电话给:
[self.peripheral discoverServices:@[[self.class serviceUUID]]];
该- (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];
        }
    }
}
控制台显示:
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 …我已经读过当我断开连接然后重新连接到同一设备时,ios 正在缓存 BLE 外围设备的服务和特征(当然是在发现这些服务和特征之后)。所以重新发现的漫长过程是不必要的,我可以在重新连接后直接写入或读取这些特性。
在这个线程中: 有没有办法更快地发现 BLE 外设服务? 据说如果连接是加密的,则服务和特征会被缓存。此外,在 WWDC 2013 Session 702 中,它说服务和特征已缓存,但未指定条件。
ios缓存BLE服务和特性的条件是什么?有人可以验证只需要加密连接吗?
ios core-bluetooth bluetooth-lowenergy cbperipheral cbcentralmanager
我希望将我的一些 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 …bluetooth core-bluetooth bluetooth-lowenergy cbperipheral 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];
也,
似乎无论我尝试什么,在外围设备和中央连接都处于活动状态4-5分钟后(我们有一个循环,其中第二个应用程序每隔五秒重复连接并断开连接,以挑战设备连接)我的传入值更新自中央设备减速到大约1/4或1/5速度,或者它们停止一整秒,然后几乎同时进行三到四次更新 - 这两次更新都会延迟我们的延迟检查.这就像是一些队列被填满并且表现平坦,但正如我上面提到的,我认为我正在使用单独的队列.
我在我的智慧结束...有没有人想过如何在iOS应用程序中优先考虑我的中心功能而不是我的外围功能,或以某种方式提高性能以防止这成为一个问题并保持我的应用程序响应10Hz来自设备的更新,即使被视为外围设备?
(编辑说我们正在重复连接/断开第二个应用程序...也许我在正确断开连接后没有清理,垃圾堆积并搞砸了BLE?这可以解释为什么问题似乎发生在4之后无论第二次连接的数据更新频率如何,均为-5分钟.)
ios bluetooth-lowenergy cbperipheral cbcentralmanager cbperipheralmanager
我正在开发 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\nID0为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\nuart 波特率设置为 9600。\nAPP 向 MCU 发送的查询指令为 0x55 0x01\nMCU 回复 APP 的信息格式为:0x55,0x02,bat_level,xH,XL(xH XL 代表当前电池电压值,\nxH - 代表高8位,XL---代表低8位)
\n\nimport 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, …我遇到了关于CoreBluetooth Framework的问题.
例如,我有两个设备,每个设备同时执行广告和扫描.所以,我在每个上都使用CBCentralManager和CBPeripheralManager.
因此,为了简化问题,我们假设Device1正在广播和Device2扫描.
当Device2上的CBCentralManager发现Device1时,回调centralManager:didDiscoverPeripheral:advertisementData:RSSI:被调用,我可以通过调用[peripheral.identifier UUIDString]来获取Device1标识符.
那我怎么能得到我的本地设备(Device2)标识符?我的意思是,如果两个设备都是广告,Device1也会发现Device2并获取它的外围设备标识符,但我怎样才能在Device2上获得这个标识符(某种自身地址)?
PS我知道这个标识符对于每个设备都不是唯一的,并且可以随时间变化,这不是问题.
在我的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 …core-bluetooth bluetooth-lowenergy cbperipheral swift cbperipheralmanager
我在我的 iOS 应用程序项目中使用核心蓝牙框架。我有以下关于蓝牙低功耗的问题-
ios core-bluetooth bluetooth-lowenergy cbperipheral cbcentralmanager
目前,我的 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)
}
我的问题是它花费的时间比我需要的要长得多,大约 30 秒。
奇怪的是,即使我在发送图像时使用 CBCharacteristicWriteType.WithoutResponse,我也会收到它们的响应,我想知道这是否会使速度变慢。 …