一、前提
我们在了解蓝牙开发之前,需要了解一个概念,物联网(Internet of things。顾名思义,物联网就是实物之间相连的互联网。
我们能想到的设备包括:蓝牙设备和WI-FI设备。
物联网的应用领域:智能仓储、智能物流、智能家居、智能医疗和智能农业等。
二、蓝牙(Bluetooth):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4-2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方法。蓝牙可连接多个设备,克服了数据同步的难题。
如今蓝牙由蓝牙技术联盟(Bluetooth Special Interest Group,简称SIG)管理。SIG在全球拥有超过25,000家成员公司,它们分布在电信、计算机、网络和消费电子等多重领域。IEEE将蓝牙技术列为IEEE 802.15.1,但如今已不再维持该标准。SIG负责监督蓝牙规范的开发,管理认证项目,并维护商标权益。制造商的设备必须符合SIG的标准才能以“蓝牙设备”的名义进入市场。蓝牙技术拥有一套专利网络,可发放给符合标准的设备。
蓝牙4.0是2012年的最新蓝牙版本,较3.0版本更省电、成本低、3毫秒低延迟、超长有效连接距离,AES-128加密等。
三、蓝牙的通讯流程
服务端(外设):是提供数据的设备,向外广播信息。比如小米手环,蓝牙耳机……
客户端(中心):扫描并监听外设中的广播信息。如:手机,平板……
客户端搜到对应的外设后,可以连接外设并扫描外设的具体服务和通讯通道,之后可以通过通讯协议进行数据的收发。
在CoreBluetooth开发过程中,我们先要了解几个相关的类,一下是中心开发过程中使用到的类:
- CBCentralManager:蓝牙中心设备管理类,用来同一调度中心设备的开发(扫描、连接等)
- CBPeripheral:蓝牙外设,如蓝牙血压计、心率监测仪。
- CBService:蓝牙外设的服务,这个服务可以是任意多个。
- CBCharacteristic:服务中的特征,每一个蓝牙服务中可以有N多个特征,特征中包含数据信息。具有度、写、通知等属性。
- CBUUID:可以理解为服务活着特征的身份证,可以用来选择需要的服务和特征。比如心率检测仪的服务UUID为:0x180D,这是蓝牙技术联盟已经定义好的标准,其它种类设备的UUID我们可以从蓝牙官网的GATT标准目录中去查找。
以下是外设开发过程中需要用到的类: - CBPeripheralManager:蓝牙外设发开发时使用,用来开发蓝牙外设的中心管理类。
- CBCentral:蓝牙中心设备,例如用来连接蓝牙手环的手机。
- CBMutableService:外设开发的时候可以添加多个服务,这里用CBMutableService来创建服务。
- CBMutableCharacteristic:每个服务中有多个特征,使用此类给服务添加特征。
- CBATTRequest: 读或者写请求。它的实例对象有一个value属性,用来装在外设进行蓝牙读取或写入请求时的数据。一般在外设写入或读取的回调方法中有这一个参数。
四、我们在开发中需要注意的事项:
- iOS10之后,需要在info.plist文件配置蓝牙使用描述,如果不填写,打包提交的时候会被拒绝。 image.png
- CBCenteralManager如果使用非主线程,则返回的时候需要注意转到主线程,特别是跟UI相关的回调。
- 数据大小端的问题:
1.大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点类似于把数据当作字符串顺序处理:地址由小到大增加,而数据从高位向低位放,祝贺我们的阅读习惯一致。
2.小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。 image.png PS:MacOS 和 iOS采用的都是小端模式
如果在开发过程中,外设采取的是大端模式,那么我们可以采用CFSwapInt32BigToHost( )方法对数据进行大小端的转换。
五、开发流程
我们所说的开发主要是针对中心设备的开发,也就是说通过手机来扫描可连接的外设,跟外设建立连接,然后发送指令来控制外设或者说获取外设的指令显示到手机上。
1.建立中心设备
2.中心设备开始扫描外设(Discover Peripheral)
--2.1 扫描到外围设备之后,自动调用中心设备的代理方法
--2.2 如果设备过多,可以将扫描到的外围设备添加到数组
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.在连接到蓝牙设备以后,先与蓝牙设备及服务端做一次三方的安全验证,使用一些加密算法,保证当前是自己的app对自己的设备发送的蓝牙指令。
2.在所有的蓝牙操作指令中增加时间戳安全判断,可以跟硬件端商量好具体的安全超时时常,对于连接超时的不做响应。
3.因为受蓝牙信号强度的限制,蓝牙操作的灵敏度和响应时间会存在一定问题,所以要求精简对蓝牙设备的型号跟强度进行定制。
4.在进行蓝牙设备搜索链接时,iOS没有自带的超时设置,如果不手动停止的话,会不断进行设备搜索,影响设备性能。所以建议设置一个超时时长,如果超时则停止搜索并提示用户重新搜索。
至于具体代码过程此处就不详情写了,网上的教程有很多
网友评论