(迁移自我的qq日志:http://user.qzone.qq.com/511107989/blog/1401877946)
端午放假的时候,张老师@张诚 跟我说起一个词,iBeacon,说来惭愧,虽然一直做蓝牙相关的APP,但在此之前是完全没听过这个概念,虽然iBeacon是Location和Ble的结合体,但也算是直亲了吧,又想起了WWDC2014上新发布的开发语言Swift,突然感觉尝试去学习、掌握所有的东西是一个很笨的,因为更新的太快了,然后智商又比较捉急,按我的智商与学习能力,是永远没法赶上知识更新的脚步的,不知道其他同学有没有记忆力下降的现象,我反正是有了,所以都不得不边写代码,边通过日志的方式来记住刚学的东西了。
能在闲暇的时候,积累或者扩展一下知识就好了,身体才是最重要滴。好了,老套路,扯淡完毕,进入正题:
==============================割了吧,反正将很久用不上了=========================================
Beacon的应用场景是:当你手持一个设备,开启监听基站信号,一旦你进入这个基站的信号范围,你就能处理这个信号;就从这个角度看,这个很简单,就跟我们手机Sim卡信号和WiFi信号处理是一样的,只是SIM卡信号和WiFi信号的处理可能存在一个连接建立的过程,然后iBeacon不同,他是一个广播,那很简单的,我们就可以把它理解成,收音机,然而,这是一个特殊的收音机,不像我们日常用的收音机,你可以调不同频道,收听不同的内容,而iBeacon只能收到特定格式的广播。
1、基站:一个BLE设备,广播内容;因为是一个BLE设备,因此不论是Android平台还是iOS平台,都可以扫描到这个基站;
2、手持设备:既然是通过处理BLE设备广播的数据,那自然手持设备就必须含有BLE模块,然而在iOS平台下(iBeacon其实就是iOS专属的,只是Android平台我们也可以做到大概的定位),确实通过了BLE模块和GPS模块结合起来(有没有其他模块以及内部是如何实现就暂不清楚了),来进行确定位置的,因此要使用的话,必须开启定位服务和蓝牙服务;在Android的平台,我们只能简单解析BLE的广播内容了;
好了,软件原理其实就是上面说的这么简单,掌握上面两个概念即可,而且iOS做了很好的集成,根本不需要我们做很多的工作;
现在如果你在iOS平台下做一个基站,广播内容,只需要以下3行关键代码:
CLBeaconRegion *region = [[CLBeaconRegion alloc]initWithProximityUUID:self.beaconRegion.proximityUUID
major:value1
minor:value2
identifier:self.beaconRegion.identifier];//根据uuid创建区域,uuid用来识别商场或其他应用场景,major和minor可以用来识别商场里面的不同的基站(beancon)
NSDictionary *beaconPeripheralData = [regionperipheralDataWithMeasuredPower:nil];//根据区域来建立广播的内容
[self.peripheralManager startAdvertising:beaconPeripheralData]//广播内容
//注:Android手机现在貌似不支持用作周边来广播内容,所以Android的先不写
如果你要做手持设备端软件:
self.beaconRegion = [[CLBeaconRegion alloc]initWithProximityUUID:proximityUUID identifier:kIdentifier];
self.beaconRegion.notifyEntryStateOnDisplay = YES;//创建需要监听的区域
[self.locationManager startMonitoringForRegion:self.beaconRegion];//开始监控区域
如果要停止监控,调用:
[self.locationManager stopMonitoringForRegion:self.beaconRegion];
接下来,就是回调函数的事情了:
didRangeBeacons:(NSArray *)beacons
inRegion:(CLBeaconRegion *)region {
}
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion*)region
{
}
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion*)region
{
}
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
}
其实到目前为止,可能还是没有理解这玩意有多大用处,说来说去我们只是收到了广播的内容,内容还非常有限,那接下来的事情,其实就是解析广播内容,然后搜索本地数据库或者网络中心等,获取内容后,显示给手持设备,
比如我收到的major值为1000,客户端就是给服务器发送这个major参数,服务器根据major值,xml格式或者jason格式返回打折对应产品的打折或者其他信息, 客户端解析,然后显示就ok啦;
Android平台就有点为难了,并没iOS集成的好,Android目前只是解析最表层的ble广播数据:
onLeScan (final BluetoothDevice device, int rssi, byte[] scanRecord)
解析这个scanRecord数组:
// 02 01 1a 1a ff 4c 00 02 15 # Apple's fixed iBeacon advertising prefix 0215代表着iBeacon设备
// e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon profile uuid
// 00 00 # major值
// 00 00 # minor 值
// c5 # The 2's complement of the calibrated Tx Power
然后再对应的处理,同iOS。