iOS BLE
蓝牙的历史!
1999年5月20日,索尼爱立信、IBM、英特尔、诺基亚及东芝等业界龙头创立蓝牙特别兴趣组(SIG,Special Interest Group),制订蓝牙技术标准。“蓝牙”(Bluetooth)这名称来自10世纪的丹麦国王哈拉尔德(Harald Gormsson)的外号。出身海盗家庭的哈拉尔德统一了北欧四分五裂的国家,成为维京王国的国王。由于他喜欢吃蓝莓,牙齿常常被染成蓝色,而获得“蓝 牙”的绰号,当时蓝莓因为颜色怪异的缘故被认为是不适合食用的东西,因此这位爱尝新的国王也成为创新与勇于尝试的象征。1998年,爱立信公司希望无线通信技术能统一标准而取名“蓝芽”。蓝牙,或称为蓝芽,是一种无线个人局域网(Wireless PAN),最初由爱立信创制,后来由蓝牙技术联盟订定技术标准。据说因为此技术尚在萌芽的阶段,故将Bluetooth以“蓝芽”的中文译名在台湾进行商 业的注册,不过在2006年,该组织已将全球中文统一为“蓝牙”。
什么是BLE?
BLE 是Bluetooth Low Energy的缩写,又叫蓝牙4.0,区别于蓝牙3.0和之前的技术。BLE前身是NOKIA开发的Wibree技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久。BLE是在蓝牙技术的基础上发展起来的,既同于蓝牙,又区别于传统蓝牙。BLE设备分单模和双模两种,双模简称BR,商标为Bluetooth Smart Ready,单模简称BLE或者LE,商标为Bluetooth Smart。Android是在4.3后才支持BLE,这可以解释不是所有蓝牙手机都支持BLE,而且支持BLE的蓝牙手机一般是双模的。
BLE的工作原理?
大概知道ble是什么东西后,我们就来了解下他的工作原理。想要了解原理,先搞清楚蓝牙通信之间的关系——主从关系。
蓝牙技术规定每一对设备之间进行蓝牙通讯时,必须一个为主角色,另一为从角色,才能进行通信,通信时,必须由主端进行查找,发起配对,建链成功后,双方即可收发数据。理论上,一个蓝牙主端设备,可同时与7个蓝牙从端设备进行通讯。一个蓝牙设备以主模式发起呼叫时,需要知道对方的蓝牙地址,配对密码等信息,配对完成后,可直接发起呼叫。这可以解释为什么有时无法连接蓝牙,有可能是连接的蓝牙设备过多。
BLE和CLASSIC蓝牙的比较!
经典蓝牙模块(BT):泛指支持蓝牙协议在4.0以下的模块,一般用于数据量比较大的传输,如:语音、音乐、较高数据量传输等。经典蓝牙模块可再细分为:传统蓝牙模块和高速蓝牙模块。传统蓝牙模块在2004年推出,主要代表是支持蓝牙2.1协议的模块,在智能手机爆发的时期得到广泛支持。高速蓝牙模块在2009年推出,速率提高到约24Mbps,是传统蓝牙模块的八倍,可以轻松用于录像机至高清电视、PC至PMP、UMPC至打印机之间的资料传输。
低功耗蓝牙模块(BLE):是指支持蓝牙协议4.0或更高的模块,也称为BLE模块(BluetoohLow EnergyModule),最大的特点是成本和功耗的降低,应用于实时性要求比较高,但是数据速率比较低的产品,如:遥控类的(鼠标、键盘)、传感设备的数据发送(心跳带、血压计、温度传感器)等。
1、建立中心角色
2、扫描外设(Discover Peripheral)
3、连接外设(Connect Peripheral)
4、扫描外设中的服务和特征(Discover Services And Characteristics)
4.1 获取外设的services
4.2 获取外设的Characteristics,获取characteristics的值
4.3 获取Characteristics的Descriptor和Descriptor的值
5、利用特征与外设做数据交互
6、订阅Characteristic的通知
7、断开连接(Disconnect)
1.建立中心管家
2.扫描外部设备
3.连接外部设备
4.扫描服务和特征
5.数据交互
6.断开连接
1 centerManager 实例化,并检查设备蓝牙状态,通过代理回调
2 蓝牙可用时,开始搜索周边设备,每次搜索到都会触发回调(注,将已搜索到的设备,实例化存本地,不然好像会一直搜索到)
3 选择某个扫描到的设备进行连接,代理回调
4 连接成功后,搜索设备包含的服务,代理回调
5 选择某个服务,搜索服务包含的特征,代理回调(注:服务也可能包含服务)(注2:一般对特征进行订阅与读写,注意属性)
6 选择某个特征,搜索特征包含的描述,代理回调
/** 只要一触发这句代码系统会自动检测手机蓝牙状态,你必须实现其代理方法,当然得添加<CBCentralManagerDelegate>*/
self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
/** 两个参数为nil, 默认扫描所有的外设,可以设置一些服务,进行过滤搜索*/
[self.bluetoothManager scanForPeripheralsWithServices:nil options:nil];
// 打印流程: 搜索蓝牙外设 -->连接蓝牙 -->搜索服务 -->搜索特性 -->写入数据 -->打印成功
// 连接上打印机,需要判断扫描的阶段,如果直接进行打印会有可能导致 没有搜索到特性阶段,调用打印API是打印不成功的,所以等待特性回调之后打印 万无一失
typedef NS_ENUM(NSInteger, JWScanStage) {
JWScanStageConnection = 0, //蓝牙连接阶段
JWScanStageServices, //服务阶段
JWScanStageCharacteristics, //特性阶段 //注意 只有到达特性阶段才能进行打印
};
/**
* 在ios中蓝牙广播信息中通常会包含以下4中类型的信息。ios的蓝牙通信协议中默认不接受其他类型的广播信息。因此需要注意的是,如果需要在扫描设备时,通过蓝牙设备的Mac地址来唯一辨别设备,那么需要与蓝牙设备的硬件工程师沟通好:将所需要的Mac地址放到一下几种类型的广播信息中。
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = SN00000003;
kCBAdvDataManufacturerData = <43474d01>;
kCBAdvDataTxPowerLevel = 0;
*/
// 设备的UUID(peripheral.identifier)是由两个设备的mac通过算法得到的,所以不同的手机连接相同的设备,它的UUID都是不同的,无法标识设备
// 苹果与蓝牙设备连接通信时,使用的并不是苹果蓝牙模块的Mac地址,使用的是苹果随机生成的十六进制码作为手机蓝牙的Mac与外围蓝牙设备进行交互。如果蓝牙设备与手机在一定时间内多次通信,那么使用的是首次连接时随机生成的十六进制码作为Mac地址,超过这个固定的时间段,手机会清空已随机生成的Mac地址,重新生成。
// 也就是说外围设备是不能通过与苹果手机的交互时所获取的蓝牙Mac地址作为手机的唯一标识的。
我们来打个比喻:BluetoothDevice为学校,BluetoothGatt为学校到达某一个班级的通道,BluetoothCattService为学校的某一个班级,BluetoothCattCharacteristic为班级中的某一个学生。那么蓝牙连接通信的过程就是这样,BluetoothAdapter先找到学校(就是连接目的设备),再通过通道找到目标班级,最后从班级中找到目标学生,这个学生就是我们设备之间通信的中介,很重要,学校有唯一的MAC地址,班级有唯一的serviceUUID,学生有唯一的charactersticUUID(相当于学号),所以就是在一所学校找一个学生的问题,好了,应该了解了吧。