iOS蓝牙极速开发
一、背景
最近一段时间,由于公司一套蓝牙设备更新,通讯协议上需要修改,功能也要完善,因此需要更新app。坑爹的是,这款app开发到现在已有一年时间,出了源码和app啥都没有。无奈,上级交与的任务难也要做。花了大概三天时间熟悉整个项目,由于app的主要功能在于与公司的配套设备进行交互,所以,界面上的东西我就一带而过,主要了解蓝牙交互的内容。
经过仔细了解,我发现这款app的开发者也是极品,不知道是不了解C的基本知识,还是不会用,整个蓝牙交互的数据全部使用字符串操作,这对一个开发者来说真心不应该。有的数据头竟然还是写死在字符串里!没办法,重构!所以就有了这篇文章。
二、蓝牙
蓝牙技术发展到现在的4.0,也就是常说的低功耗蓝牙。蓝牙4.0是2012年最新蓝牙版本,是3.0的升级版本;较3.0版本更省电、成本低、3毫秒低延迟、超长有效连接距离、AES-128加密等;通常用在蓝牙耳机、蓝牙音箱等设备上。
以上介绍来源于百度,大家相对蓝牙具体了解,请自行google,在这里我主要介绍我本次重构的心得。
蓝牙是居于socket的长链接,遵循TCP/IP协议,iOS-CoreBluetooth 框架已经帮我们做了内部封装,我们不需要了解连接设备,数据发送等相关细节,只需要在其上定制应用层的通讯协议即可。当然这个协议是与设备上的协议配套的,一般都是私有协议。一方面保护设备,另一方面避免被恶意使用。
三、通讯协议
现在,做智能家居的越来越多,不可避免的要用到蓝牙,但是,蓝牙通讯都有自己的私有协议,这个协议在我的理解上看就是数据的安排方式。按照一定的格式去排序命令和数据,再加上校验就是通讯协议的主要部分了。一般来说,这个协议分为两部分,一部分是数据头,一部分是数据题。数据头有头帧、命令、校验等等东西,数据体就是具体的数据和数据校验。当然有的可能没有校验,这需要与设备开发者协商好。
四、发送数据与接受数据
蓝牙数据包只能包含20个字节的数据,再多了就会分包,这点需要注意。许多时候我们需要发送给设备很多的数据,这就需要分包发送,这是我们需要警惕的问题。接受的时候也一样,数据长度超过20个字节就要等待下一次读取,拼接上数据,这样获取的数据才完整。当然,还需要校验数据是否正确,避免接受到不正确的数据干扰app。
由于数据都是字节,操作起来很麻烦,不管是发送还是接受对一些不擅长使用C的朋友来说都是一种折磨。如何变得简单呢?答案是结构体!是的就用结构体包装数据,无论是发送数据还是接受数据都使用结构体去操作这样就会省事很多。
我们可以按照通讯协议去构建我们的结构体数据结构,虽然有时候结构很多,没关系你可以拆分数据结构,相同的数据结构就不用重复了。malloc加上memset(或者calloc)初始化结构体,再赋值数据,注意结构体中的数据顺序需要与通讯协议相匹配。这样,我们就能很简单的创建发送数据了,然后我们将数据转换成NSData,现在就是OC的领域了。具体如何去拆剪数据,拼接数据等等都去用NSData解决。
接受数据是同样的道理,需要注意的是,我们需要把接受的数据直接装在NSData里,长数据需要拼接的装在NSMutableData内。然后用这些数据初始化接受数据的结构体,接着从结构体中校验数据,如果数据正确,就可以使用一个模型去接收这些数据,然后之后如何使用这些数据就是OC的内容了。这里就很像我们常说的数据转模型。
最后需要提示的是,一般外部设备可能是小端通讯,也可能采用大端通讯,采用结构体封装后转NSData后的超过两个字节的数据都是小端的,所以大家要警惕这一点。
五、完结
没有啦!想看代码的小伙伴对不起了,由于项目还需要保密,工程管理很严格,所以就不贴了。不过我确实是这样做的,一天就写好了整个蓝牙交互模块。希望我的经验对大家有用。