Tag: 蓝牙低功耗

iOS CoreBluetooth:状态保存和恢复

希望在这里得到一些input。 在我目前的iOS项目中,我正在使用CoreBluetooth和Swift。 该应用程序是启用沟通使用CoreBluetooth在基本上工作的背景,种。 外围设备需要与iOS设备进行有效连接才能按预期工作。 只要连接中断,外设就会停止当前操作。 当应用程序由于内存压力而closures时也会发生这种情况。 在这种情况下,外设不应该停止工作,所以有一个问题。 为了解决这个问题,我遵循了苹果核心蓝牙编程指南来实现状态保存和恢复的背景模式,基本上说: 使用恢复标识符初始化CentralManager。 委托=自我。 实现willRestoreState委托方法。 NSLog的东西 检查launchOptions的特殊键。 NSLog的东西。 我强制iOS使用这个通用项目closures应用程序: BackgroundKill 。 当然,应用程序不再以debugging模式运行,这就是为什么我在重要点添加了一些NSLog语句来查找设备控制台。 好消息是,当应用程序终止时,连接不会被取消,iOS现在按预期保持连接,所以外设不会停止工作。 罢工! 除了应用程序订购的电池服务之外,在此期间中央和外围设备之间没有任何通信。 进行有效连接的唯一原因是为了防止外围设备停止工作。 当手动重新启动应用程序时,没有提到的NSLogs出现。 willRestoreState委托永远不会被调用,launchOptions是零。 我尝试使用队列“DISPATCH_QUEUE_CONCURRENT”而不是nil来实例化CentralManager。 没有效果。 当重新启动应用程序时,我该如何使用保存的连接? 为什么willRestoreState委托从不调用? 我在这里错过了什么? 系统为了使用状态保存和恢复而在后台/强制closures时接收数据是强制性的? 感谢您的帮助。 🙂

通过iOS上的BTLE发送数据时的最大数据大小

我目前正在实施一个使用CoreBluetooth在两个设备之间传输数据的iOS应用程序。 例如,要将数据从中央设备发送到外设,我使用以下代码: NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; NSLog(@"Writing data of length %d", [data length]); [peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; 这工作绝对好,但事情是,我已经多次阅读,特点可以一次传输最多20个字节。 另外,当我看着Apple的BTLE示例代码时,他们实现了一种将数据分成20个字节块的机制。 但是,上面的代码打印的东西,如Writing data of length 124的数据Writing data of length 124 – 数据到达罚款在其他设备,但。 那么: 为什么这个工作呢? 而且更重要的是,恐怕这可能会在某些时候中断,特别是当非iOS设备发挥作用的时候。

如何限制信标的广告范围?

是否有可能限制信标的范围,以便只有在某个近距离(或接近度)内的设备才能识别并连接到信标? 比方说,0.5米以外的设备应该不能看到或连接到信标。 我正在使用iOS设备作为信标。 在Apple的CoreLocation API中,在CLBeaconRegion类中有一个名为peripheralDataWithMeasuredPower的方法,它说: peripheralDataWithMeasuredPower:检索可用于将当前设备通告为信标的数据。 (NSMutableDictionary *)peripheralDataWithMeasuredPower:(NSNumber *)measuredPower 参数: measuredPower :设备的接收信号强度指示器(RSSI)值(以分贝测量)。 该值代表距离一米处的信标的实测强度,并在测距期间使用。 指定nil以使用设备的默认值。 这可以用来限制信标的范围吗? 如果是,我无法理解如何决定为measurePower参数设置的值? 他们试图说什么…value represents the measured strength of the beacon from one meter away.. 请原谅,如果这是一个非常基本的问题。 我最近开始iOS开发,并会感谢您的帮助。 谢谢。

使用CoreBluetooth与iBeacons

我在iOS设备上对iBeacons和CoreBluetooth做了相当多的研究。 你的post和研究很棒。 我学到了很多东西 不幸的是,我遇到了一个死胡同,因为它与我真正想做的事情有关。 我正在阅读这篇文章: http : //developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html …. …它指出,你不能真正用CoreBluetooth没有proximityUUID很多。 那就是说,如果我真的拥有它呢? 我想要做的就是把iBeacons放在给定的位置。 我将使用didEnterRegion CLLocationManager委托方法来了解我们何时进入该区域。 我想用它来触发一些CoreBluetooth监视信标,这样可以在后台完成。 我只需要RSSI和一个唯一的标识符(我现在可以在没有Major和Minor的情况下做到这一点),我已经能够在前台获得,而不是在后台。 我的印象是,如果我的应用程序具有“蓝牙中央”(现在是“使用CoreBluetooth进行应用通信”),我仍然可以在后台获得这些基本数据。 你能阐明我想要做什么吗? 目前,似乎没有其他人尝试过这个方法,我很乐意去分享它,因为如果我能够克服这个障碍,它似乎是一个可行的解决办法。 思考?

后台模式下的iOS BLE外设/广告数据

我正在开发一个系统,其中包含一个BLE器件(TI CC2540)作为中央处理器和一个iPhone4S上的iOS应用程序作为外设。 一切工作正常,除了1我需要的function:从中央白名单(过滤)广告设备。 据我所知,iOS设备使用随机可parsing的MAC地址,所以我们不能使用基于MAC地址的白名单。 所以我现在的方法是:在iOS app的广告数据(iOS设备作为外设)上的“本地名称”字段上放置一个ID,中央设备将根据检索到的广告数据进行扫描和过滤。 这工作除非应用程序在后台。 当我的应用程序放在后台,广告数据被截断,我的“本地名称”不会在空中出现。 从corebluetooth的头文件看,当app在后台时,只有“溢出区域”的数据可以在广告数据中,但是只有iOS设备才能读取这个区域。 那么在这里任何人都可以点亮我如何将自定义数据添加到广告数据包,即使在后台模式,或任何其他解决scheme来具有此过滤function。 任何评论将非常帮助我。

通过iBeacon检测信标监测与测距与CoreBluetooth scanForPeripheralsWithServices

关于iOS应用程序对要扫描BLE信标\外围设备的限制,存在很多混淆。 阅读了几个博客和堆栈溢出的答案后,我想看看我是否正确理解所有问题。 如果有任何我误解或错过,请纠正我。 我只提到iOS 7及以上版本,重点关注检测而不是连接(您可以使用iBeacon Monitoring&Ranging API连接到CLBeacon?)。 信标的选项是明确的 – 使用通用BLE外围设备或使用以iBeacon格式通告的BLE外设(另外,非标准外设可以在adv-packet中以iBeacon格式进行通告,而在扫描 – 响应数据包)。 一般限制 iBeacon测距将让你知道你周围的信标。 您必须事先指定信标广告的ProximityUUID(无“普通”扫描)。 didRangeBeacons将每秒钟被最近被发现的一个CLBeacon对象调用。 距离信标的距离及其准确性由iOS使用一些只有苹果开发人员真正知道的机密algorithm来计算(该algorithm基于rssi值和信标广告的rssi-at-1米校准字节)。 您也可以使用iBeacon Monitoring在每次进入或退出区域时调用代理 – 同样,您必须指定您正在查找的ProximityUUID(您也可以指定主要和次要)。 “退出一个地区”的定义是一段时间没有收到任何广告,因此不能立即。 每台设备可同时进行远程监控的区域数量限制为20个。这意味着如果其他应用程序同时进行监控\测距,您的应用程序可能无法监控\范围(右侧)。 CoreBluetooth – 您还可以检测信标广告中的其他广告结构。 如果信标也以iBeacon格式进行广告宣传,则尽pipe事实上它们是在标准的“制造商特定”广告结构下发送的,但在其他情况下您不能看到iBeacon字段(ProximityUUID,major,minor …) 。 在前台运行 – 限制较less的用例: iBeacon测距和监测 – 没有进一步的限制。 CoreBluetooth – 在服务中传递nil , scanForPeripheralsWithServices将扫描所有的外围设备。 在选项中将CBCentralManagerScanOptionAllowDuplicatesKey为YES将会使didDiscoverPeripheral对于同一个外设\ beacon被多次调用(我假定使用定时器检测到广告没有被接收一段时间,并且假定用户退出了“region”) 。 在后台运行 – 更受限制的用例: iBeacon测距不会直接工作。 iBeacon监测将调用didEnterRegion并给予6秒的应用程序运行时间 – 您可以在其中启动测距(例如,检测主要和次要)。 由于iOS打开和closures扫描以保持电池电量,检测可能不会立即进行。 如果您使用相同的ProximityUUIDinput多个信标的区域,并且在没有特定专业和/或未成年人的情况下监控此UUID,则当您从第一个信标开始接收信号时,将会调用didEnterRegion – 但是,如果您没有退出第一个灯塔的地区,你也进入了第二个灯塔的地区,应用程序不会再被唤醒( didEnterRegion不会被再次调用),所以你不能开始测距,以检测第二个灯塔的主要和次要。 […]

iOS – CoreBluetooth didDiscoverPeripheral没有被调用

我已经在Xcode 6中制作了一个非常简单的iOS应用程序来试用CoreBluetooth并与我的Polar H6心率监视器进行通信。 出于某种原因,didDiscoverPeripheral方法未被调用。 我已经在StackOverflow上发现了以下类似的问题,但是你可能有点不同,或者对我没有回答: corebluetooth-diddiscoverperipheral -不存在所谓的function于迅速 未工作,号召性centralmanager-diddiscoverperipheral-advertisementdata diddiscoverperipheral-代表法-是-不叫 我在viewDidLoad中的代码: NSArray *services = @[[CBUUID UUIDWithString:HRM_HEART_RATE_SERVICE_UUID]]; CBCentralManager *centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; [centralManager scanForPeripheralsWithServices:services options:nil]; self.centralManager = centralManager; 方法centralManagerDidUpdateState被调用,它告诉我状态等于CBCentralManagerStatePoweredOn 。 didDiscoverPeripheral方法永远不会被调用,即使我把nil传递给scanForPeripheralsWithServices方法。 在app store中,我已经下载了一个名为LightBlue的应用程序。 它是一个非常简单的应用程序来testing任何使用蓝牙4.0 LowEnergy的设备。 它扫描外围设备,并显示有关设备及其服务的详细信息。 LightBlue应用程序看到我的HeartRate显示器,而我自己的小应用程序不.. 有没有人有任何提示或线索如何前进呢? (我正在使用iOS 8的Xcode 6和iPhone 6)

CoreBluetooth didDiscoverPeripheral不在Swift中调用

我99%确定我按照说明正确设置CoreBluetooth 。 无论我做什么,当我在iPad mini上运行这个应用程序时,蓝牙都在说。 这是说它正在扫描设备,但它绝对没有find任何设备。 如果我去设备上的蓝牙菜单,我看到其他设备被发现。 我初始化CBCentralManager 。 我设置了centralManagerDidUpdateState 。 当确定蓝牙准备就绪时,它会调用centralManager.scanForPeripheralsWithServices 。 所有这一切都正确地发生。 但是我的centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!)functioncentralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!)永远不会被调用。 我的代码非常简单。 也许我错过了一些东西,但我能够确认我的Macbook是BTLE设备,而我的iPad mini也是BTLE设备。 这是我的代码。 import UIKit import CoreBluetooth class ViewController: UIViewController, CBCentralManagerDelegate { var centralManager:CBCentralManager! var blueToothReady = false override func […]

iOS7设备可以作为iBeacon吗?

iOS7设备可以作为iBeacon吗?当其他iOS7设备进入其范围时, 能否找出答案? 那些其他iOS7设备是否需要启用蓝牙?

应用程序终止时重新连接蓝牙设备

我有一个蓝牙设备上有一个button。 当点击设备的button,通知特性更新和我的应用程序显示本地通知。 就这么简单。 我在前台连接蓝牙设备如下: var restoreOptions = [CBPeripheralManagerOptionRestoreIdentifierKey: "customIdentifier"] centralManager.connect(peripheral, options: restoreOptions) 然后设置通知特征值是否为真: peripheral.setNotifyValue(true, for: notificationCharacteristic) 当通知特征更新时,应用程序显示本地通知: func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { showLocalNotification() } 当通知特征发生变化时,触发didUpdateValueFor并显示本地通知。 前景和背景没有问题。 但是当应用程序被用户终止时,蓝牙设备被断开并且didUpdateValueFor不被触发。 即使应用终止,我想要重新连接蓝牙设备。 我怎样才能做到这一点 ? 我希望我能告诉你我的问题。 谢谢。