我已成功修改了参考实现应用程序的的Android的信标库使用以下信标布局,使得它检测到我手边的iBeacon显示设备:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.bind(this);
}
}
Run Code Online (Sandbox Code Playgroud)
作为BLE数据包内部的新手,我不确定这是否是正确的布局.该库赞同AltBeacon标准,其文档未提及如何检测iBeacon设备.
m:前缀是否过于严格,或者是与iBeacon规范匹配的正确字节序列?参考:
Android设备是否可以充当iBeacon并了解其他Android设备何时进入其范围?那些其他Android设备是否需要打开蓝牙?
如果客户进入我的商店并且他的设备上没有安装我的应用程序,iBeacon可以工作,还是必须先安装应用程序?有很多客户每天访问我们的商店,但如果他们没有安装我的应用程序,iBeacon概念是否有效?
android bluetooth bluetooth-lowenergy android-bluetooth ibeacon
是否可以将iOS 7设备作为蓝牙LE外设(iBeacon)运行并在后台进行广告宣传?我已经能够使用下面的代码在前台做广告,并且可以从另一个iOS设备看到它但是一旦我回到主屏幕就停止广告.我确实在plist中添加了蓝牙外设背景模式,但这似乎没有帮助,虽然我得到提示说该设备想要在后台使用蓝牙.我做错了什么,或者这在iOS 7中是不可能的?
peripManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
{
if (peripheral.state != CBPeripheralManagerStatePoweredOn) {
return;
}
NSString *identifier = @"MyBeacon";
//Construct the region
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:identifier];
//Passing nil will use the device default power
NSDictionary *payload = [beaconRegion peripheralDataWithMeasuredPower:nil];
//Start advertising
[peripManager startAdvertising:payload];
}
Run Code Online (Sandbox Code Playgroud)
这是接收/收听端的代码:
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons
inRegion:(CLBeaconRegion *)region
{
//Check if we have moved closer or farther away from the iBeacon…
if (beacons.count > 0) {
CLBeacon *beacon …Run Code Online (Sandbox Code Playgroud) 目标:使用BlueZ和蓝牙4LE加密狗创建一个外围设备,宣传相当于"Hello World"的蓝牙.
我在哪里:我目前有BlueZ堆栈设置和下载,我可以使用hci工具识别并看到蓝牙适配器.我已经使用了hciconfig leadv,但我只是不太了解它/了解正在发生的事情.
我认为我需要什么帮助:我需要进入下一步.如果有人能指出我对一个好的资源,请指导我,或任何事情,非常感谢.如果我需要做额外的腿(搜索)工作,我可以,但我已经用我能想到的这个问题的许多不同衍生物来搜索Google和SO.
*我将此标记为CoreBluetooth,希望可能是iOS开发者在某些时候对此进行了修改.
编辑:回应评论,说明我的最终目标似乎是谨慎的.我最终希望通过加密狗广告最简单的简单消息/信号,并在iOS设备(CoreBluetooth)上进行选择.我已经能够让iOS方面运行良好(与Linux方面相比,大量文档)但对我来说困难的部分是将此适配器设置为外设.BlueZ堆栈对我来说是一个可怕的谜.
编辑:经过更多的挖掘,我最终偶然发现了这篇文章:Raspberry Pi蓝牙4.0连接.这使我走向GATT服务器的主题,我将继续追求这个话题.
编辑:好吧,所以我继续学习.在过去的几天里,我深入研究了hci*,sdptool和gatttool工具.我已经到了能够设置适配器做广告的程度,"hciconfig hci0 leadv".此时,我可以成功"看到"适配器,但我实际上无法读取任何内容.我甚至没有看到友好的名字.我将保持卡车运输,但一如既往,任何帮助/建议都非常受欢迎.
编辑:相关链接,关于iOS的蓝牙LE的可靠概述. https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html#//apple_ref/doc/uid/TP40013257-CH1-SW1
最后编辑:嘿所有,这个链接涵盖了如何使用Raspberry Pi + BlueZ创建iBeacon ... http://www.wadewegner.com/2014/05/create-an-ibeacon-transmitter-with-the-raspberry -pi /
我买了一个开发工具包Radius Networks,包括a ioGear GBU521 BLE 4.0 dongle和a Raspberry Pi.我也买了他们的一个RadBeacon iBeacons.他们都像宣传的那样工作,但我对我得到的东西感到惊讶.
我以为RaspPi可以检测到iBeacons.相反,该套件设置为创建一个iBeacon.我的用例是检测何时forklift进入特定房间,以便我可以将工作发送给他们.我的想法是在叉车上放一个iBeacon然后把RaspPi搜索到iBeacons.当检测到iBeacon(叉车)时,您可以断定它在附近.我会将RaspPi连接到LAN并通过它传达信息REST or similar.我知道我可以放一个合适的Android or Apple device并以这种方式完成它,但我不明白为什么这个加密狗无法检测到这些iBeacons并告诉我它们UUID's是什么?我错过了什么?
关于iOS对想要扫描BLE信标\外设的应用程序所施加的限制存在很多困惑.在阅读了几篇博客和Stack Overflow答案之后,我想看看我是否正确理解了所有问题.如果有什么我误解或错过了,请纠正我.我只提到iOS 7及更高版本,专注于检测而不是连接(你能使用iBeacon Monitoring&Ranging API连接到CLBeacon吗?).
信标的选项很明确 - 使用通用BLE外设或使用以iBeacon格式通告的BLE外设(此外,非标准外设可以在adv-packet中以iBeacon格式进行通告,并在扫描响应包).
一般限制
didRangeBeacons将使用最近找到的CLBeacon对象数组每秒调用一次.距离信标的距离及其准确度由iOS使用一些机密算法计算,只有Apple的开发人员才知道(该算法基于rssi值和信标所宣传的rssi-at-1米校准字节).每次进入或退出某个区域时,您也可以使用iBeacon Monitoring来呼叫代理 - 您必须再次指定您要查找的ProximityUUID(您还可以指定主要和次要)."退出某个地区"的定义是一段时间没有收到任何广告,因此不能立即进行.每台设备可以同时监控的区域数量 限制为20 - 这意味着如果其他应用同时监控\范围,您的应用可能无法监控\范围(对吗?).在前台运行 - 限制较少的用例:
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 …我在OSX下遵循这个示例项目BeaconEmitter来生成样本iBeacons,用于在iPhone上开发应用程序.BeaconEmitter应用程序基于Matthew Robinson的教程,直到Apple决定在OSX的Core Location上引入iBeacon支持,生成iBeacon的唯一机会是使用IO Bluetooth Framework从头开始构建广告数据包.
但是......那不起作用!
我当然也尝试过iOS上的Apple的AirLocate教程代码,以及可以正常使用的iOS设备之间的代码.但是,如果您尝试使用OSX(BeaconEmitter)生成iBeacon并使用不起作用的iOS设备(AirLocate)接收它.
我有一个基于CC2540 TI芯片的BLE RF嗅探器,以及Windows上的TI嗅探器软件.所以我观察到从AirLocate和BeaconEmitter生成的iBeacons数据包有点不同.
这是使用AirLocate生成的iBeacon:

Thah是使用BeaconEmitter生成的ibeacon:

继这篇文章中的逆向工程师(因为Apple尚未发布iBeacons规范)之后,可以看出Adv PDU Header与两种情况不同.在OSX中,Type = 2且TxAdd = 0,在iOS中Type = 0且TxAdd = 1.
为何如此区别?
以女巫的方式可以强制OSX发送iOS的相同Adv PDU Header?
似乎在AdvData的前5个字节中,两个数据包不等于:
OSX:02 01 06 1A FF
iOS:02 01 1A 1A FF
AdvData有效负载的其余部分与上面链接的逆向工程师帖子一致.
再次,为什么这个字节不同?
我没有找到OSX示例中依赖于哪些代码部分.
更新:它的工作原理
因为BeaconEmitter生成的iBeacon未被AirLocate识别的主要原因是我的错.我不明白AirLocate过滤UUID的一些具体示例,即:E2C56DB5-DFFB-48D2-B060-D0F5A71096E0或5A4BCFCE-174E-4BAC-A814-092E77F6B7E5或74278BDA-B644-4520-8F0C-720EAF059935并非每个UUID值.
因此,BeaconEmitter生成的随机UUID肯定与AirLocate中预先写好的UUID不匹配.
如果您可以从BeaconEmitter"强制"使用具有良好值的UUID,则AirLocate可以识别它:

所以这是iOS AirLocate示例应用程序中的成功测试:

保持上述相同字节的差异......只有嗅探器可以看到:).
我想以编程方式查看广告包的所有proximityUUID.有些文章说在iOS上是不可能的,但Android是可能的.但我无法相信它,因为我发现梦幻般的应用程序"BLExplr"具有该功能.我需要在我的应用程序中实现该功能.有谁知道怎么做或好例子?任何帮助将不胜感激.
(更新2014/1/17)
我相信@davidgyoung的回答是对的.Estimote beacon的proximityUUID是"B9407F30-F5F8-466E-AFF9-25556B57FE6D",但在BLExplr app上显示我的Estimote beacon的UUID是另一个ID.

我希望在iOS上创建一个BLE广告,我可以在字节级别上控制广告.
一个用例是模仿iBeacon广告.什么是iBeacon蓝牙配置文件(我想在我的应用程序处于后台时做广告,这就是为什么我不使用CoreLocation)
我没有看到使用Core Bluetooth API做到这一点的方法.它是否正确?是否有使用私有API或越狱的替代品?
我有几个nRF51822传感器,我想开始玩iOS iBeacon设置.我遇到的问题是为了做到这一点
- (id)initWithProximityUUID:(NSUUID *)proximityUUID identifier:(NSString *)identifier;
Run Code Online (Sandbox Code Playgroud)
你需要知道传感器proximityUUID.看看CLBeacon文档,它似乎是传感器的只读属性,但我是如何/从哪里读取的
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
Run Code Online (Sandbox Code Playgroud)
我看到kCBAdvDataServiceUUID只有一个2500字符串,但我不认为是这样.任何人都有任何指导或见解?
谢谢
我正在使用Nordic BLE nRF8001开发套件来测试CoreBluetooth.使用CBCentralManager的方法(例如didDiscoverPeripheral(),didConnectPeripheral()等),我的iPhone 5能够检测到北欧设备的广告并连接到它就好了.但是,我没有收到新的locationManager range或regionMonitoring方法的任何响应.下面我将解释我的设置:
1.)首先,我使用传入的外围设备(我的Nordic设备)在didDiscoverPeripheral()委托方法中从我的Nordic设备检索我的NSUUID.我为我的Nordic设备创建了一个自定义服务,所以假设这个外围设备是Nordic设备.要检索我使用的NSUUID:
NSUUID *uuid = [peripheral identifier];
NSString *uuidString = [uuid UUIDString]; //uuidString = 9A8D4C73-152D-BBDA-E4C2-9CE952654645
Run Code Online (Sandbox Code Playgroud)
2.)接下来,我为我的Nordic设备创建一个信标区域并创建一个CLLocationManager:
self.locationManagerBeacon = [[CLLocationManager alloc] init];
[self.locationManagerBeacon setDelegate:self];
NSUUID *myUUID = [[NSUUID alloc] initWithUUIDString:@"9A8D4C73-152D-BBDA-E4C2-9CE952654645"];
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:myUUID
identifier:@"nordicRegion"];
self.beaconRegion.notifyEntryStateOnDisplay = YES;
Run Code Online (Sandbox Code Playgroud)
3.)现在我开始监控信标区域
[self.locationManagerBeacon startRangingBeaconsInRegion:self.beaconRegion];
Run Code Online (Sandbox Code Playgroud)
4.)问题:locationManager:didRangeBeacons:调用inRegion,但信标区域始终为空.
问题:Nordic BLE设备是否需要以某种方式配置,以便新的locationManager信标方法能够检测到它(例如BLE广告频率,功率电平等)?如果是这样,有人可以指向我的文档.
感谢帮助!
我EVT_LE_ADVERTISING_REPORT从 HCI 插座接收。我想区分 BLE 信标和普通 BLE 设备(解析设备名称等)我对所有 BLE 设备是否都发出信标或它们不同感到困惑。如果不同,那么它们的数据包格式如何?