标签: core-bluetooth

蓝牙LE RSSI用于接近检测iOS

我将从问题开始.

BTLE RSSI是指示两个设备是否彼此接近的好方法吗?它只适用于像遥控器等小型设备吗?

问题:

我目前正在制作一个将使用BTLE的应用程序,并允许基于邻近度的连接.在这方面,它很像苹果在高级核心蓝牙主题演示中展示的演示应用程序(当两个设备几乎触摸它们然后连接时).

据我了解,当中心发现外围设备时,接近度是根据RSSI值确定的.然而,当我尝试使用两个iPad时,信号看起来太强了,它也太不一致,因为它没有显示与设备接近度的非常大的相关性.

我尝试过Apple示例代码,类似的是,设备不必非常接近,以便信息从一个传递到另一个.

如果只有一种方法可以降低外围设备广告的信号强度....

在此先感谢您的帮助.

iphone ipad ios core-bluetooth bluetooth-lowenergy

33
推荐指数
3
解决办法
2万
查看次数

iBeacon在后台 - 用例

与iBeacon及其背景能力相关的SO问题数量正在增加,并且在这一点上存在一些混淆.我一直在测试AirLocate项目.

iBeacon有2个"能力":区域监控和测距.

区域监控仅限于20个区域,可以在后台(监听设备)运行,并有不同的代表通知该区域的进入/退出的听力应用程序(和用户) - 即使应用程序在后台或手机已锁定.

测距仅在前台工作,但会返回(到听音设备)所有iBeacons及其属性(UUID等等)的数组(无限制?)

此外,20个区域监控是设备限制.如果用户正在使用地理围栏提醒,则使用区域监控的其他应用程序; 这会降低这个数字.

  1. 那么我们是否说我不能部署一个商城范围内的(100商店+)应用程序,该应用程序使用商店iBeacons向用户发送"特定于商店"的通知,而应用程序在后台或手机被锁定?

  2. 我认为广告设备(信标)也必须在前台,以宣传听音设备可以"进入"的区域.我们也这样说,如果商店的所有者拥有iOS设备; 我不能通过要求他使用他的iPhone(至少在早期)作为广告设备(信标)来节省他的钱 - 因为应用程序很可能并不总是在前台?

  3. 因此,在iBeacon + MLB的情况下,单个UUID(或<20 UUID)用于应用程序可能确定入口门,然后将要求用户解锁手机/将应用程序带到前台用它(找座位等)?

然后我可以调用iBeacon:单个位置/事件(商店,公园等)功能需要用户最"前景"的注意力才能拥有"完整"的实际用例吗?

我试图阐明用户案例以使其实用化.请回复多于是或否.

core-bluetooth bluetooth-lowenergy ios7 ibeacon

33
推荐指数
1
解决办法
1万
查看次数

核心蓝牙在后台进行广告和扫描

我一直试图设置一个应用程序,使设备扫描外围设备并作为外围设备做广告.目标是当两个设备通过蓝牙发现彼此靠近时在后台唤醒.从Apple文档中,您似乎应该能够在后台运行BLE(启用蓝牙 - 中央和蓝牙 - 外设背景模式),并且当一台设备位于前台时,我的应用程序可以运行.首先,我这样宣传数据:

NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey:@"my-peripheral",
                              CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:identifier]]};

// Start advertising over BLE
[peripheralManager startAdvertising:advertisingData]; 
Run Code Online (Sandbox Code Playgroud)

然后我将设备设置为扫描数据:

NSArray *services = @[[CBUUID UUIDWithString:identifier]];

[centralManager scanForPeripheralsWithServices:services options:nil];
Run Code Online (Sandbox Code Playgroud)

但是,当两者都进入后台(设备必须被锁定)时,蓝牙无法发现和

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
Run Code Online (Sandbox Code Playgroud)

永远不会在任何一个设备上调用 我怎样才能解决这个问题?谢谢

iphone cocoa-touch bluetooth ios core-bluetooth

30
推荐指数
3
解决办法
2万
查看次数

Bluez:做广告服务/ gatt服务器的例子?

目标

我正在开发一个运行Linux的简单设备.它具有BLE功能,我目前正在使用bluez 5.8.

我想使用iPhone触发此设备上的操作.

什么有效:

  • 我可以让iPhone"看到"该设备.
  • iPhone也连接到设备.

我在linux上设置了这样的蓝牙设备(感谢这个问题):

# activate bluetooth
hciconfig hci0 up                                             
# set advertise data: "hello world"
hcitool -i hci0 cmd 0x08 0x0008 48 45 4c 4c 4f 57 4f 52 4c 44
# start advertising as connectable
hciconfig hci0 leadv 0
Run Code Online (Sandbox Code Playgroud)

iOS代码很简单:

- (int) scanForPeripherals
{
    if (self->centralManager.state != CBCentralManagerStatePoweredOn) {
        return -1;
    }
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
    [self.centralManager scanForPeripheralsWithServices:nil options:options];
    return 0;
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    if (central.state …
Run Code Online (Sandbox Code Playgroud)

linux bluetooth core-bluetooth bluetooth-lowenergy bluez

25
推荐指数
1
解决办法
2万
查看次数

用于Iphone 4s的蓝牙LE应用程序的后台时间问题

我在Iphone-4s中为我的应用程序使用核心蓝牙框架.
这通常必须是一个可以尽可能长时间运行的后台应用程序.

现在它只运行40分钟 - 最多1小时.

我希望至少1天左右.

对于这个"bluetooth-central"值,在.plist文件的"Required background modes"键中添加.

好像我的应用程序将在最后"暂停"模式.因为当我再次打开应用程序(背景到前景状态)时它再次发送通知,这意味着蓝牙连接仍然连接,并且BLE设备仍在发送通知.如果我按主页按钮并且应用程序进入后台,则不会再次收到通知.

任何人都可以告诉我为什么我的应用程序只能在后台模式下工作最多1小时.它应该继续像普通的音乐应用程序一样在后台运行,就像永远.

苹果公司是否有任何具体说明背景应用程序(这是连续运行的背景应用程序中有哪一个属于5个类别)失败的情况,它将进入暂停模式?

参考" iPhoneAppProgrammingGuide",在" Communicating with a Bluetooth Accessory"部分,我开始知道,对于蓝牙LE应用程序的长期运行后台任务2实现是必要的:

1)UIBackgroundModes键应该是Info.plist文件中的"bluetooth-central" .2)任何支持蓝牙数据后台处理的应用都必须基于会话.

因此,对于我的应用程序,FIRST实现已合并,并且该应用程序能够在后台运行并执行所有任务,持续时间最长为1小时.

现在我需要实现第二个实现.即基于会话.根据文档,即使应用程序处于"暂停"状态,也可以获取事件.我试图创建一个特定于蓝牙LE(核心蓝牙框架)的合适会话,如" EASession经典蓝牙(外部附件框架)"中的" ".但我没有找到它.

基本上我不确定哪个会话类需要用于BLE目的.对于音频/视频,网络和互联网,外部配件,可提供单独的会话类.核心蓝牙框架没有.

任何人都可以帮助我,哪个会话类适合BLE.

background-application ios core-bluetooth bluetooth-lowenergy

23
推荐指数
1
解决办法
6278
查看次数

iOS CoreBluetooth:centralManager:didConnectPeripheral/didFailToConnectPeripheral:没有被调用

我正在把头发拉出来解决这个问题.我正在尝试连接到BLE设备,无法在下面的代码中看到我做错了什么.

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    _cm = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

+ (NSString*)UUIDString:(CFUUIDRef)uuid {
    CFStringRef string = CFUUIDCreateString(NULL, uuid);
    return (__bridge_transfer NSString*)string;
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    if (central.state == CBCentralManagerStatePoweredOn) {
        [self scanForPeripherals];
    }
}

- (void)centralManager:(CBCentralManager *)central
 didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary …
Run Code Online (Sandbox Code Playgroud)

delegates objective-c ios core-bluetooth bluetooth-lowenergy

22
推荐指数
1
解决办法
1万
查看次数

从BLE设备读取数据

我正在尝试从蓝牙设备(BR-LE4.0-S2)读取数据.我能够连接BLE设备,但无法从中读取数据.我没有关于BLE服务及其特性的任何规范.这是我的问题- (void)peripheral:didUpdateValueForCharacteristic:error:没有被调用.我按照教程" https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonCentralRoleTasks/PerformingCommonCentralRoleTasks.html#perapple_ref/doc/uid/TP40013257-CH3-SW2 ".以下是我的码.

我的要求是从BLE设备连续读取数据.任何帮助是极大的赞赏.

- (void)viewDidLoad
{
    self.myCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    self.peripheral = [[CBPeripheral alloc] init];
    self.peripheral.delegate = self;
    [super viewDidLoad];
}

- (void) centralManagerDidUpdateState:(CBCentralManager *)central {

    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
        [self.myCentralManager scanForPeripheralsWithServices:nil options:nil];
            break;
        default:
            NSLog(@"Central Manager did change state");
            break;
    }

}

- (void)centralManager:(CBCentralManager *)central
 didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary *)advertisementData
                  RSSI:(NSNumber *)RSSI {

    NSLog(@"Discovered %@", peripheral.name);
    [self.myCentralManager stopScan];
    NSLog(@"Scanning stopped");

    if (self.peripheral != peripheral) {
        self.peripheral = peripheral;
        NSLog(@"Connecting to peripheral %@", peripheral); …
Run Code Online (Sandbox Code Playgroud)

objective-c ios core-bluetooth

21
推荐指数
2
解决办法
3万
查看次数

如何正确实现didReceiveWriteRequests?iOS6 CoreBluetooth

我实现了iOS CoreBluetooth客户端和服务器来发送数据

client site
[self.connectedPeripheral writeValue:mainData forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
Run Code Online (Sandbox Code Playgroud)

- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic 
{
   NSString *s= [[NSString alloc] initWithData:characteristic.value encoding:NSUTF8StringEncoding];
   NSLog(@"didWriteValue characteristic.value: %@ ", s);
} 
Run Code Online (Sandbox Code Playgroud)

和服务器站点

- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests
{
  NSData *res= [[NSString stringWithFormat:@"Hello"] dataUsingEncoding:NSUTF8StringEncoding];
 [self.peripheral updateValue:res
                        forCharacteristic:self.writeCharacteristic
                     onSubscribedCentrals:nil];
 [peripheral respondToRequest:aReq withResult:CBATTErrorSuccess];
}
Run Code Online (Sandbox Code Playgroud)

但是,客户端无法接收任何数据.任何的想法?谢谢你的帮助.

bluetooth ios core-bluetooth ios6

19
推荐指数
1
解决办法
2907
查看次数

核心蓝牙和后台处理:即使在后台模式下工作几天,也可以检测设备并触发操作?

我写了一个应用程序,需要在某个蓝牙低功耗设备进入范围内时获得通知.如果BLE设备被注意到,我的应用程序只存储一个时间戳.

如WWDC 2012核心蓝牙视频中所述,使用Core Bluetooth时,应用程序可以在后台模式中执行两种操作:

事件背景

事件背景可能是大多数应用程序在与蓝牙低功耗设备交互时将使用的内容.当App处于后台时,此模式不允许与附件直接通信,但是当它想要与应用程序通信时确实提供来自附件的通知.当您的应用程序在后台时,iOS将保持与BTLE附件的连接,并将继续监视通知.当连接的BTLE附件有可用通知时,iOS将通知用户该附件想要与您的应用程序通信,允许用户加载您的应用程序并与附件进行交互.由于许多设备需要节省电力,因此仅在确定时间提供信息将大大延长配件和iPhone 4S的电池寿命.

  • 此模式不需要info.plist条目.

会话背景

有时候应用程序必须与附件交互,即使它在后台运行.考虑一个需要实时监控心率的运行应用.这个模型有一个明确的START和STOP.用户在应用程序中运行它们.当运行处于活动状态时,应用程序会读取心率信息,直到运行完成或停止.在App处于后台时,会话后台还允许扫描和连接到BTLE附件.即使应用程序在后台,scanForPeripheralsWithServices或connectPeripheral也会继续调用.CoreBluetooth将继续监控与您正在寻找的服务相匹配的特定外围设备或外围设备,并在找到或连接时致电您的应用代表.请注意,每次BTLE外围设备或iPhone 4S使用其无线电时,它都会耗尽各自的设备可用功率.使用基于会话的后台处理的应用程序开发人员必须注意使用电源.

  • 会话后台处理需要在您的Apps info.plist中输入UIBackgroundModes(bluetooth-central)的后台模式.

到目前为止我的Session Backgrounding(使用相应的info.plist条目).该应用程序要求iOS检索所有已知设备,然后将connect命令提供给我正在寻找的设备.连接回调即使在我的应用程序后台运行几分钟后也会出现.

但是:应用程序在 - 比如说 - 一小时后被暂停.这意味着下次我的应用程序被用户启动时,它无法判断是否有任何感兴趣的BLE设备.

所以我的问题是:当某个BLE设备进入后台时,即使在被发送到后台几天后我的应用程序也可以在没有用户交互的情况下得到通知,这样我就可以存储我的时间戳了吗?

iphone ios core-bluetooth bluetooth-lowenergy

19
推荐指数
2
解决办法
1万
查看次数

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

关于iOS对想要扫描BLE信标\外设的应用程序所施加的限制存在很多困惑.在阅读了几篇博客和Stack Overflow答案之后,我想看看我是否正确理解了所有问题.如果有什么我误解或错过了,请纠正我.我只提到iOS 7及更高版本,专注于检测而不是连接(你能使用iBeacon Monitoring&Ranging API连接到CLBeacon吗?).

信标的选项很明确 - 使用通用BLE外设或使用以iBeacon格式通告的BLE外设(此外,非标准外设可以在adv-packet中以iBeacon格式进行通告,并在扫描响应包).

一般限制

  • iBeacon Ranging会让你知道你周围的信标.您必须指定信标预先通告的ProximityUUID(无"一般"扫描).didRangeBeacons将使用最近找到的CLBeacon对象数组每秒调用一次.距离信标的距离及其准确度由iOS使用一些机密算法计算,只有Apple的开发人员才知道(该算法基于rssi值和信标所宣传的rssi-at-1米校准字节).每次进入或退出某个区域时,您也可以使用iBeacon Monitoring来呼叫代理 - 您必须再次指定您要查找的ProximityUUID(您还可以指定主要和次要)."退出某个地区"的定义是一段时间没有收到任何广告,因此不能立即进行.每台设备可以同时监控的区域数量 限制为20 - 这意味着如果其他应用同时监控\范围,您的应用可能无法监控\范围(对吗?).
  • CoreBluetooth - 您还可以检测信标广告中的其他广告结构.如果信标也以iBeacon格式进行广告,您无法看到iBeacon字段(ProximityUUID,主要,次要......),尽管它们是在标准的"制造商特定"广告结构下发送的,您可以在其他情况下看到.

在前台运行 - 限制较少的用例:

  • iBeacon测距和监控 - 没有进一步的限制.
  • CoreBluetooth - Passing nil in the serviceUUIDs of scanForPeripheralsWithServices will scan for all peripherals. Passing CBCentralManagerScanOptionAllowDuplicatesKey as YES in the options will make the didDiscoverPeripheral to be called multiple times for the same peripheral\beacon (I assume that using a timer you detect the advertisement was not received for …

ios core-bluetooth bluetooth-lowenergy ibeacon

19
推荐指数
1
解决办法
7176
查看次数