首先要做的事:运行OSX 10.10.4,iOS 4,Xcode 6.3.2,iPhone 6,Swift

短篇小说:我在这里有一个蓝牙LE设备,我希望在特征值发生变化时收到通知,例如:通过用户输入.尝试订阅它不会成功,而是产生错误错误域= CBATTErrorDomain代码= 10“找不到该属性.”

长话:所以,我有一个BluetoothManager类,在我的$CBCentralManager.state是.PoweredOn时,我开始扫描peripherals.这很容易,我甚至是一个好公民,专门为有我想要的服务的人扫描

centralManager.scanForperipheralsWithServices([ServiceUUID],options: nil)

希望这会成功,我实现了以下委托方法:

func centralManager(central: CBCentralManager!,diddiscoverPeripheral peripheral: CBPeripheral!,advertisementData: [NSObject : AnyObject]!,RSSI: NSNumber!) {

    if *this is a kNown device* {
        connectToPeripheral(peripheral)
        return
    }

    [...] // varIoUs stuff to make something a kNown device,this works
}

所以继续前进,我们得到:

func connectToPeripheral(peripheral: CBPeripheral) {
    println("connecting to \(peripheral.identifier)")

    [...] // saving the peripheral in an array along the way so it is being retained

    centralManager.connectPeripheral(peripheral,options: nil)
}

Yupp,这成功了,所以我得到确认并开始发现服务:

func centralManager(central: CBCentralManager!,didConnectPeripheral peripheral: CBPeripheral!) {        
    println("Connected \(peripheral.name)")

    peripheral.delegate = self

    println("connected to \(peripheral)")
    peripheral.discoverServices([BluetoothConstants.MY_SERVICE_UUID])
}

这也有效,因为该委托方法也被调用:

func peripheral(peripheral: CBPeripheral!,diddiscoverServices error: NSError!) {

    if peripheral.services != nil {
        for service in peripheral.services {
            println("discovered service \(service)")
            let serviceObject = service as! CBService

            [...] // discover the Characteristic to send controls to,this works
            peripheral.discovercharacteristics([BluetoothConstants.MY_CHaraCTERISTIC_NOTIFICATION_UUID],forService: serviceObject)

           [...] // Some unneccessary stuff about command caches
        }
    }
}

你知道什么:特征被发现了!

func peripheral(peripheral: CBPeripheral!,diddiscovercharacteristicsForService service: CBService!,error: NSError!) {
    for characteristic in service.characteristics {
        let castCharacteristic = characteristic as! CBCharacteristic

        characteristics.append(castCharacteristic) // Retaining the characteristic in an Array as well,not sure if I need to do this

        println("discovered characteristic \(castCharacteristic)")
        if *this is the control characteristic* {
            println("control")
        } else if castCharacteristic.UUID.UUIDString == BluetoothConstants.MY_CHaraCTERISTIC_NOTIFICATION_UUID.UUIDString {
            println("notification")
            peripheral.setNotifyValue(true,forCharacteristic: castCharacteristic)
        } else {
            println(castCharacteristic.UUID.UUIDString) // Just in case
        }
        println("following properties:")

        // Just to see what we are dealing with
        if (castCharacteristic.properties & CBCharacteristicProperties.broadcast) != nil {
            println("broadcast")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.Read) != nil {
            println("read")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.WriteWithoutResponse) != nil {
            println("write without response")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.Write) != nil {
            println("write")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.Notify) != nil {
            println("notify")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.Indicate) != nil {
            println("indicate")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.AuthenticatedSignedWrites) != nil {
            println("authenticated signed writes ")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.ExtendedProperties) != nil {
            println("indicate")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.NotifyEncryptionrequired) != nil {
            println("notify encryption required")
        }
        if (castCharacteristic.properties & CBCharacteristicProperties.IndicateEncryptionrequired) != nil {
            println("indicate encryption required")
        }

        peripheral.discoverDescriptorsForCharacteristic(castCharacteristic) // Do I need this?
    }
}

现在控制台输出到这里看起来像这样:

connected to <CBPeripheral: 0x1740fc780,identifier = $FOO,name = $SomeName,state = connected>
discovered service <CBService: 0x170272c80,isPrimary = YES,UUID = $BAR>
[...]
discovered characteristic <CBCharacteristic: 0x17009f220,UUID = $BARBAR properties = 0xA,value = (null),notifying = NO>
control
following properties:
read
write
[...]
discovered characteristic <CBCharacteristic: 0x17409d0b0,UUID = $BAZBAZ,properties = 0x1A,notifying = NO>
notification
following properties:
read
write
notify
[...]
discovered DescriptorsForCharacteristic
[]
updateNotification: false

嘿!它说updateNotification是假的.它来自哪里?为什么,这是我对setNotify的回调…:

func peripheral(peripheral: CBPeripheral!,didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic!,error: NSError!) {

    println("updateNotification: \(characteristic.isnotifying)")
}

是什么赋予了?我告诉它要通知!为什么不通知?让我们在println的行中设置一个断点并检查错误对象:

(lldb) po error
Error Domain=CBATTErrorDomain Code=10 "The attribute Could not be found." UserInfo=0x17026eac0 {NSLocalizedDescription=The attribute Could not be found.}

好的,所以这让我没有想法.我无法找到有关该错误代码的相关线索.自从我尝试为之前发现的特征设置通知以来,我无法理解描述本身,因此它必须存在,对吧?此外,在Android上似乎可以订阅通知,所以我想我可以排除设备的问题……或者我可以吗?有关这方面的任何线索都非常感谢!

解决方法

对我来说问题是我使用另一个Android设备作为外围设备并且需要实现配置描述符.看这里:
https://stackoverflow.com/a/25508053/599743

ios – 订阅来自CBC特性的通知不起作用的更多相关文章

  1. ios – 订阅来自CBC特性的通知不起作用

    现在控制台输出到这里看起来像这样:嘿!它说updateNotification是假的.它来自哪里?为什么,这是我对setNotify的回调…我告诉它要通知!让我们在println的行中设置一个断点并检查错误对象:好的,所以这让我没有想法.我无法找到有关该错误代码的相关线索.自从我尝试为之前发现的特征设置通知以来,我无法理解描述本身,因此它必须存在,对吧?此外,在Android上似乎可以订阅通知,所以我想我可以排除设备的问题……有关这方面的任何线索都非常感谢!

  2. ios – 为什么NSManagedObjectID会发生变化?

    我不确定这个问题的格式对这个网站是否有用.基本上,有没有人知道什么使得Apple确保在每次将数据保存到持久存储时NSManagedobjectID发生变化的设计决策?我最大的问题是为什么提供临时的managedobjectID.它有什么意义吗?解决方法我有点困惑为什么你一直说NSManagedobjectID特别是UUID.URI表示可能具有与UUID格式类似的外观,但我没有在文档中看到它表示“NSManagedobjectID是UUID”.为什么Apple以这种方式设计它超出了StackOverflow

  3. ios – 修复ARC中潜在的内存泄漏

    以下单例类帮助器方法可能会导致保留周期.在静态分析器中获取警告:“在线路上分配的对象的潜在泄漏……”我确实尝试过使用ivaruuid__weak但是当我分析时仍会出现警告.谢谢像这样在课堂上被召唤:解决方法这会删除警告吗?

  4. ios – 如何从核心蓝牙设备读取信息

    >如何阅读蓝牙设备的其他信息?

  5. ios – 在开发过程中应该如何使用identifierForVendor?

    解决方法在模拟器中构建和运行时,这个值将会改变.在真实的设备上,只有当用户从设备中删除所有应用并重新安装应用时,才会更改.如果您希望模拟器应用程序在开发期间使用一致的标识符,您可以定义该UUID,并将其用于模拟器构建:请注意,您需要用真实的UUID字符串替换SOME-STATIC-UUID-STRING.

  6. ios – 通过UUID编写CBC特征

    我试图用CoreBluetooth写一个特定的,已知的特征.我觉得这应该是可能的,因为我使用了一个德州仪器BLE实用程序,您可以在连接的外设上选择一个“写值”操作,只需输入特征UUID和您要编写的值,并且执行没有问题.据我了解,为了做到这一点,我必须打电话配置为具有正确的UUID的CBC特征对象.我已经尝试使用正确的UUID进行CBMutableCharacteristic,甚至正确的权限,我知道

  7. ios – 扫描特定CBUUID时,Core Bluetooth无法找到外围设备

    似乎这个问题被“回答”了here,但没有任何代码来表明他们做了不同的事情,我不得不问一个新问题.我有自己的代码具有相同的行为,在OSX上使用CoreBluetooth的CBCentralManager扫描特定的CBUUID并没有发现一个iOS设备充当CBPeripheralManager的外围设备(除非它及其服务先前已被发现).为了查看我的代码是否有问题,我下载了Apple’ssamplecode

  8. 如何在不使用登录系统的情况下识别唯一用户(iOS)

    我可以从设备获得的任何类型,而无需用户填写任何字段.解决方法您可以尝试使用存储在用户的iCloud中的键值存储中的一些唯一随机字符串.因此,当用户第一次启动您的应用时,您会发现他的iCloud没有存储任何值,因此您生成并存储它.当用户下次启动应用程序时,您将看到此值,并将采取相应措施.更重要的是,即使用户将重新安装您的应用程序或将重置设备,您仍然可以在他的iCloud中按值识别用户.

  9. iBeaconswift

    随着这一技术的发展,苹果在2013年WWDC大会上,苹果推出iBeacon技术。该技术允许开发人员开发能够使用iBeacon硬件传感器的iOS应用程序,来为相应的应用程序提供更加精准的位置信息。2014年WWDC大会上,苹果表示,对iBeacon技术进行了改善,借助该技术,应用程序现在能够跟踪到用户所在的楼层的精确位置信息。iBeacon的工作方式是Transmitter-Receiver,即基站-接收机模式的。这里列举个iBeacon的使用场景:在房屋中介中使用。

  10. iBeacon 的第一篇基于Swift实现

    随着这一技术的发展,苹果在2013年WWDC大会上,苹果推出iBeacon技术。2014年WWDC大会上,苹果表示,对iBeacon技术进行了改善,借助该技术,应用程序现在能够跟踪到用户所在的楼层的精确位置信息。iBeacon的工作方式是Transmitter-Receiver,即基站-接收机模式的。这里列举个iBeacon的使用场景:在房屋中介中使用。甚至于还有一个老外用iBeacon做了一个实景的经营游戏,点击这里观看。

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部