ios开发ibeacon,iOs开发判断勾股数

iOS iBeacon 使用

最近做一个店铺签到获取积分的App,用到了iBeacon,蛮好玩的一个小玩意,简单来说iBeacon这个小设备,可以被手机通过蓝牙搜索到,并能比较精确的显示距离,和拿到该iBeacon的uuid,major,minor。其中uuid 是一个区域内的唯一标识符,用它可以区别一个公司的iBeacon,而用major和minor 来区别店铺和具体哪台设备。

创新互联IDC提供业务:眉山服务器托管,成都服务器租用,眉山服务器托管,重庆服务器租用等四川省内主机托管与主机租用业务;数据中心含:双线机房,BGP机房,电信机房,移动机房,联通机房。

项目源码地址 感谢作者的分享

同时可以参考苹果官方源码,里面有设计多个uuid同时检测

苹果官方提供demo

在IOS 的开发中iBeacon和BLE的区别

在ios中ibeacon是基于地理位置的微定位技术(从这句话中可以得出Introduced in iOS 7, iBeacon is an exciting technology enabling new location awareness possibilities for apps.),虽然借助手机蓝牙进行接收Majro、Minor,但是他们在开发工程中没有任何关系。

ibeacon使用苹果提供CoreLocation库,然而在BLE在开发过程中使用CoreBluetooth库。从上面提供的库来看就很清楚了,特别是在IOS8之上的时候如果想使用ibeacon,必须让用户点击是否允许“App使用地理位置”。如果在第一次使用ios app扫描ibeacon的时候没有提示这句话是不可能接收到ibeacon的信号(除非ios 8.0之下)。如果是BLE则的开发过程中之需要提示用户打开蓝牙,并不要求其他的地理位置任何信息。

第一:在ios中所有的数据都是通过API获取的,也就是说在IOS中不会看到蓝牙模块的裸数据(在这里的裸数据就代表蓝牙模块发送的16进制的数据),只能拿到苹果公司提供的极个别的API中的数据。

第二:ble、ibeacon各使用各自的API,他们之间没有任何对应关系。如果想使用ble就不可能获取到ibeacon的major、minor、uuid等信息,如果使用ibeacon,没有办法发起链接请求获取服务。

第三:在ios中ibeacon通信数据只有

这个六个属性,其分别含义是“ proximityUUID major、minor表示ibeacon的uuid,major、minor;proximity就是苹果提供的几个表示距离的属性CLProximityUnknown(没有数据),CLProximityImmediate(十厘米以内),CLProximityNear(一米以内),CLProximityFar(一米以外)”。

“在很多硬件人员的眼中认为,ibeacon和ble没有区别啊,我们都是在同一个模块上面开发的,只是发送的数据格式不一样,ibeacon应该和ble没有区别,ios可以获取数据按照我们给的通信协议进行解析就可以啊。”这个就犯了我刚才所说的一个错误,在ios的开发过程中ibeacon和ble是两个不同的东西,所有的数据都被苹果拦截了,只给开发者特定的api可以调用。虽然从硬件上面来看没有任何区别但是在开发过程中确实两个不同的东西。但是有很多的厂商又想让ble具有ibeacon的类似的功能,比如可以让app获取到major、minor这个又怎么办?让ios的app获取ble的MAC地址等等功能(说明一下,ios是不能直接获取ble的mac地址的)?在这里(只是我个人的意见也是我在工作中得到的一些方法)是我的建议,一般很多ble正在发送发现广播的时候携带了“kCBAdvDataServiceData”信息,可以把ibeacon的major、minor放在kCBAdvDataServiceData的数据区域,然后让app根据协议截取响应的信息。也可以放到其他的信息中,这要看公司的策略。

如果有一款iOSble的巡检App(非ibeacon的App)可以用BLE扫描出ibeacon的信息,他的App肯定不是直接扫描ibeacon,这一点可以从两个方面进行验证第一:是否使用用户的地理位置,第二:拿一个其他厂家的标准ibeacon,(ibeacon的uuid一定不要一样,因为ios在扫描ibeacon的时候一定要指定需要扫描的uuid,换一个uuid

app都不可能扫描到)。通过上面两点可以很好的判定app是巡检ble还是ibeacon。

总结上面所有的观点,如果想使用ios的app巡检ble又能巡检ibeacon,一定要在蓝牙模块的广播数据中做文章。怎么做文章需要各厂商自己权衡。

iPhone用户可以在未打开App情况下(App被用户开启过,并且授权使用蓝牙以及定位,并且蓝牙处于开启状态),收到IBeacon设备(蓝牙外设设备)广播的信息,并短暂的激活该App (约10秒)去执行一些方法。

根据IBeacon设备的发射范围,确定用户当前的状态:进入、持续监听、离开。然后做出不同的响应

蓝牙扫一扫;区域推送;活动现场互动(配对,寻宝等);签到,蓝牙锁(应用内手动签到、开锁或者点亮屏幕即可签到、开锁)。

蓝牙连接打印机

iOS开发中iBeacon和BLE的区别

iBeacon

在ios 中ibeacon是基于地理位置的微定位技术,虽然借助手机蓝牙进行接收Majro、Minor,但是在开发工程中没有任何关系。

ios 在ble、ibeacon 开发过程中与Android 的区别

在ios 中所有的数据都是通过API获取的,也就是说在IOS中不会看到蓝牙模块的裸数据,只能拿到苹果公司提供的极个别的API中的数据。

ble、ibeacon各使用各自的API,之间没有任何对应关系。如果想使用ble就不可能获取到ibeacon的major、minor、uuid 等信息,如果使用ibeacon,没有办法发起链接请求获取服务。

在ios中ibeacon通信数据只有六个属性,就是苹果提供的几个表示距离的属性,是一个float类型数据。

iOS蓝牙开发相关知识点和注意事项

总结一下蓝牙开发相关的知识点和注意事项,做个笔记,也希望你们能少踩坑

(公司部分蓝牙项目为混编项目,蓝牙相关处理均采用了Objective-C,故本文????均采用OC,Swift处理相同)

蓝牙4.0包含两个蓝牙标准,它是一个是 双模 的标准,它包含 传统蓝牙部分(也称经典蓝牙) 和 低功耗蓝牙部分(BLE) , 二者适用于不同的应用场景和应用条件。他们的特点如下

所以蓝牙4.0是集成了传统蓝牙和低功耗蓝牙两个标准的,并不只是低功耗蓝牙

蓝牙4.0支持两种部署方式: 双模式 和 单模式 ,双模同时支持经典蓝牙和低功耗蓝牙,而单模则只支持其中一种。

二者更多细节详见: 传统蓝牙和低功耗蓝牙的区别

iOS中蓝牙相关功能都封装进了 CoreBluetooth 类中,其中有几个常见的参数和概念

具体API参考 CoreBluetooth蓝牙开发

保存到数组中的设备可通过 UUID 来进行区分。从 iOS7之后苹果不提供外设的mac地址,外设的唯一标识换成了由mac封装加密后的UUID,需要注意的是不同的手机获取同一个外设的UUID是不同的,所以在不同手机之间UUID不是唯一的,但在本机上可以作为唯一标识(特殊情况手机刷机后也会改变UUID)。

如何获取Mac地址

一般使用场景是根据Mac地址区分某个外设

注意点:

写入数据时可能会遇到需要分包发送的情况,我们可以通过下面的API或许当前特征支持的最大的单条写入长度

maxLength 一般取决于蓝牙模块内部接收 缓冲区 的大小,很多硬件设备这个缓冲区的大小是 20 字节, 这个大小也和特征的写入权限有关,像具有写入权限 withResponse 类的特征其大小一般为 512 字节,当然这些都是取决于设备测的设置;

当我们单次发送的数据字节长度大于 maxLength 时,我们就需要采用分包的方式来发送数据了,

分包发送的逻辑类似于下面

这边延时主要是设备侧的接收模块接收数据以及处理能力有限

外围设备测和中心设备(大部分情况下是手机)保持蓝牙连接的状态下,如果长时间不产生交互,蓝牙就会断开,所以为了保持两者持续的连接状态,需要做保活处理,也就是需要持续的发送心跳包(watchdog)。相应的处理是使用一个定时器定时向设备侧发送符合设备协议格式的心跳包。

断开连接很简单,只需要调用 [self.centralManager cancelPeripheralConnection:peripheral] 传入需要断开连接的设备对象就行了。断开连接时会自动调用 centralManager:didDisconnectPeripheral:error: 代理方法。

按照之前的惯例,当error为nil时表示断开成功,error不为nil时断开失败。这种理解是错误的。

当你调用 cancelPeripheralConnection: 方法(主动断开)断开连接时error为nil ; 没有调用这个方法(异常断开)而断开时error返回的是异常断开的原因。也可以理解为主动调用断开连接方法一定会断开

接下来就是断开重连的问题了,对蓝牙功能进行封装时肯定少不了断开重连。首先断开时可通过上面的代理方法的error是否为nil判断是否是异常断开,一般情况下异常断开时是需要重连的

原因就是当设备断开连接后 peripheral.services 为nil了,当然 service.characteristics 也是nil,所以需要在断开连接时把保存这个设备对应的服务和特征全部清除,然后在连接成功时重新过一遍发现服务和发现特征的流程就好了。

iOS7 开始,Apple加入了Beacon围栏检测的API, ( iBeacon-维基百科 ), 其工作方式是,配备有低功耗蓝牙(BLE)通信功能的设备使用 BLE 技术向周围发送自己特有的 ID,接收到该 ID 的应用软件会根据该 ID 采取一些行动。比如,在店铺里设置 iBeacon 通信模块的话,便可让 iPhone 和 iPad 上运行一资讯告知服务器,或者由服务器向顾客发送折扣券及进店积分, 或者公司的手机打卡,只要手机靠近打卡器一定范围,手机测就向打开器发送打卡信息,从而自动打卡。这种场景还有很多。 其中一个最重要的功能就是App的唤醒功能(杀死后也能唤醒)

举一个我们的例子,我们的产品业务场景就是在进入车辆以后,需要使用蓝牙连接我们的后装车载设备以采集车辆信息和驾驶行为行程等,这里有一个问题就是在App被杀死的情况下如何唤醒App, 因为不可能要求用户每次都主动去打开App,这样体验太差。我们的做法是通过iBeacon,当我们的车辆点火以后,设备测通电,发出 iBeacon广播 ,App实现监听iBeacon相关功能后就可以唤醒我们App,然后在相应的回调的处理一些事情,比如通过蓝牙连接设备。这里的前提条件是我们的硬件设备测包含iBeacon模块,具有iBeacon功能,而且对iBeacon的广播频率也有一定的要求,长了可能唤醒的功能会不稳定,官方建议的好像是100ms,频率超高越耗电,但可以让手机或其它监听设备越快地发现iBeacon。标准的BLE广播距离是100m,这使Beacon在室内位置跟踪场景下的效果更理想。

关于iBeacon更多的使用及介绍请参考

苹果核 - iOS端近场围栏检测(一) ——iBeacon

iBeacon技术初探

BLE蓝牙ios简介(一)

随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低。从iOS的发展史也不难看出苹果目前对蓝牙技术也是越来越关注,例如苹果于2013年9月发布的iOS7就配备了iBeacon技术,这项技术完全基于蓝牙传输。但是众所周知苹果的设备对于权限要求也是比较高的,因此在iOS中并不能像Android一样随意使用蓝牙进行文件传输(除非你已经越狱)。知道什么是蓝牙之后,那么在iOS中进行蓝牙传输应用开发常用的框架有哪几种呢?

1、GameKit的

在ios 的开发中iBeacon和BLE的区别

iBeacon

在ios 中ibeacon是基于地理位置的微定位技术,虽然借助手机蓝牙进行接收Majro、Minor,但是在开发工程中没有任何关系。

ios 在ble、ibeacon 开发过程中与Android 的区别

在ios 中所有的数据都是通过API获取的,也就是说在IOS中不会看到蓝牙模块的裸数据,只能拿到苹果公司提供的极个别的API中的数据。

ble、ibeacon各使用各自的API,之间没有任何对应关系。如果想使用ble就不可能获取到ibeacon的major、minor、uuid 等信息,如果使用ibeacon,没有办法发起链接请求获取服务。

在ios中ibeacon通信数据只有六个属性,就是苹果提供的几个表示距离的属性,是一个float类型数据。


本文标题:ios开发ibeacon,iOs开发判断勾股数
本文路径:http://azwzsj.com/article/dsdjdge.html