关于iOS蓝牙开发二三事

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后的超过两个字节的数据都是小端的,所以大家要警惕这一点。

五、完结

  没有啦!想看代码的小伙伴对不起了,由于项目还需要保密,工程管理很严格,所以就不贴了。不过我确实是这样做的,一天就写好了整个蓝牙交互模块。希望我的经验对大家有用。

时间: 2024-11-07 22:08:03

关于iOS蓝牙开发二三事的相关文章

IOS蓝牙开发

IOS蓝牙开发 http://blog.csdn.net/xufeidll/article/details/24022261 http://blog.csdn.net/swibyn/article/details/20531593 由于接到iphone需要和第三方蓝牙设备交互的任务,便开始了蓝牙开发这件事. 在探索了一段时间后,iOS的蓝牙开发相关Apple大致有以下几种方式. 1 GameKit.framework [只能存在于iOS设备之间,多用于游戏 能搜索到的demo比较多,不确切说名字

iOS蓝牙开发(一)蓝牙相关基础知识

原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0设备因为低耗电,所以也叫做BLE peripheral,central == 外设和中心,发起连接的时central,被连接的设备为peri

iOS蓝牙开发总结-4

蓝牙开发总结 只要熟悉蓝牙的流程,和蓝牙中每一个角色的作用,其实蓝牙通讯并没有想象中的难 1.蓝牙中心CBCentralManager:一般指得是iPhone手机 2.设备(外设)CBPeripheral:装有蓝牙芯片的智能硬件  外设的服务peripheral.services数组,CBService对象:硬件可以提供很多服务,实际上就是把硬件的功能分模块,比如手环的震动和亮起来的颜色是两个不同服务 服务下的特征CBCharacteristic:负责为服务提供读写数据,一个服务下可以有很多个特

iOS 蓝牙开发(三)app作为外设被连接的实现(转)

转载自:www.cocoachina.com/ios/20151105/14071.html 原作者:刘彦玮 再上一节说了app作为central连接peripheral的情况,这一节介绍如何使用app发布一个peripheral,给其他的central连接 还是这张图,central模式用的都是左边的类,而peripheral模式用的是右边的类 peripheral模式的流程 1. 打开peripheralManager,设置peripheralManager的委托 2. 创建characte

iOS蓝牙开发(一)蓝牙相关基础知识(转)

转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0设备因为低耗电,所以也叫做BLE peripheral,central == 外设和中心,发起连接的时central,被连接的设备为perilheral service an

iOS蓝牙开发(上)基础以及连接外设的实现

蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0设备因为低耗电,所以也叫做BLE peripheral,central == 外设和中心,发起连接的时central,被连接的设备为perilheral service and characteristic === 服务和特征 每个设备会提供服务和特征,类似于服务端的api,但是机构不同.每个外设会

小程序开发二三事--图片错误显示默认图

小程序的image组件不像普通html 的image,没有onerror属性,不过有个binderror回调方法.却不像onerror="this.src='/static/img/fmdefault.png'"来的方便. binderror 当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: 'something wrong'}; 当图片错误时,调用binderror方法,然后去改变image的src绑定的值. <ima

https://github.com/coolnameismy/BabyBluetooth github上的一个ios 蓝牙4.0的库并带文档和教程

The easiest way to use Bluetooth (BLE )in ios,even bady can use. 简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac osx. 为什么使用它? 1:基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮你更简单地使用CoreBluetooth API. 2:CoreBluetooth所有方法都是通过委托完成,代码冗余且顺序凌乱.BabyBluetooth使用block方法,可以重新按照功能和顺序

iOS,蓝牙开发!!--By帮雷

iOS的蓝牙开发大致有以下几种方式. 1 GameKit.framework [只能存在于iOS设备之间,多用于游戏 能搜索到的demo比较多,不确切说名字了,code4app里面就有] 2 CoreBlueTooth.framework [必须要支持蓝牙4.0,且iPhone4以上,即至少4s手机.可与第三方设备交互数据, 官方demo是Temperature Sensor ] 3 ExternalAccessory.framework [可于第三方蓝牙设备交互,但是蓝牙设备必须经过MFI认证