FireBLE

FireBLE 是一个面向于打造智能生活的开源平台,以BLE(Bluetooth Low Energy)技术为核心,拥有超低的功耗、不俗的处理能力和广泛的应用场合,专注于更智能、高效率的工作模式,让生活在科技中更安全、方便、快捷。也许您一个不经意的想法与FireBLE擦出的火花,会在这片原野上燎出火焰,甚至燃烧整个世界。

开发入门

更新时间:2017-08-08 阅读:3030

蓝牙

蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等之间进行无线信息交换.1998年5月,爱立信、诺基亚、东芝、IBM和英特尔公司等五家著名厂商,在联合开展短程无线通信技术的标准化活动时提出了蓝牙技术,其宗旨是提供一种短距离、低成本的无线传输应用技术.从1998年至今蓝牙从1.0不断升级到4.1,蓝牙从4.0版本后采用了低功耗,所以也称其为BLE4.0.


BLE通信

微微网组成

蓝牙协议中的基带协议确保各个蓝牙设备之间的射频连接,以形成微微网络. 蓝牙节点组网中,只能存在一个主节点(Central)和多个从节点(Peripheral),从节点是发出信号者,主节点是扫描且发起连接者.

建立连接

当从节点发出广告信号(包括设备地址和设备名称之类的附加信息);主节点收到此广告信号后,向从节点发出扫描请求;当从节点回应扫描时,就完成了设备发现过程. 接着主节点向从节点发出连接请求(包括连接时隙,从节点待机次数,连接超时值),从节点回应连接,就完成了建立连接. 为了安全起见,一些数据的访问需要认证,它的完成是这样的:一方(可以是主节点,也可以是从节点)向另一方索要6位数字的密码,之后,两个节点彼此交换安全密钥用于加密和认证,此过程称为配对. 认证的过程比较繁琐,BLE协议支持两节点保存认证的安全密钥(一般是非易失性存储器中),以便于两节点下次连接后快速认证,这就是绑定技术.连接过程如下图所示:

Connect.jpg

                                                                       图 2.2-1

交换数据

大部分通信,尤其是TCP/IP,交换数据的媒介是数据包,但蓝牙通信中,工程师找不到数据包访问方式,于是就产生疑问.其实蓝牙最底层也是基于无线数据包交换,只是通过层层封装,交付给工程师的API接口就变成了Client访问Server的方式.

IOS蓝牙

IOS 有两个框架支持蓝牙与外设连接。一个是 ExternalAccessory。从IOS3.0就开始支持,也是在iphone4s出来之前用的比较多的一种模式,但是它有个不好的地方,External Accessory需要拿到苹果公司的MFI认证。 另一个框架则是CoreBluetooth,在iphone4s开始支持,专门用于与BLE设备通讯(因为它的API都是基于BLE的)。这个不需要MFI,并且现在很多蓝牙设备都支持4.0,所以也是在IOS比较推荐的一种开发方法。

CoreBluetooth介绍

角色和职责

CoreBluetooth框架的核心分为peripheral和central, 可以理解成外设(从节点)和中心(主节点)。蓝牙节点组网中,只能存在一个主节点(Central)和多个从节点(Peripheral),从节点是发出信号者,主节点是扫描且发起连接者。对应他们分别有一组相关的API和类,如下图所示: API.jpg

                                                                       图 3.1-1


如果手机作为central,那么需要用到左边的API,反之则用到右边的API.虽然中心设备和外部设备通信是CS结构,但是他们之间的角色是不固定的.外部设备和中心设备谁在发送消息,那么在CS架构就扮演客户端的角色,反之亦然.

基本概念

在BLE4.0中有两个概念:服务(service)和特征(characteristic).

每个蓝牙4.0的设备都是通过服务和特征来展示自己的,一个设备必然包含一个或多个服务,每个服务下面又包含若干个特征。特征是与外界交互的最小单位。比如说,一台蓝牙4.0设备,用特征A来描述自己的出厂信息,用特征B来与设备收发数据等。

服务和特征都是用UUID来唯一标识的,国际蓝牙组织为一些很典型的设备(比如测量心跳和血压的设备)规定了标准的service UUID.

通过特征获取数据有两种方式:一种是读(主动),一种是订阅(被动). 读:[peripheral readValueForCharacteristic:characteristic]; 订阅方式: [peripheral setNotifyValue:YES forCharacteristic:characteristic];