iOS蓝牙开发记录

        在公司待的一年多时间里,做了几个蓝牙、Wi-Fi通讯的项目,碍于时间关系一直没有做整理工作,现在稍微闲下来,就顺便整理一下。iOS蓝牙3.0需要获得苹果MFI认证,因此项目初期和嵌入式工程师沟通iOS蓝牙只做4.0BLE,和嵌入式工程师做好沟通后,就开始进入BLE的iOS开发阶段。蓝牙、Wi-Fi项目中,实现连接、通讯很简单,项目大部分的时间是和嵌入式工程师联调通讯部分,最让人头痛的是iOS开发工程师没做过蓝牙项目同时嵌入式工程师也没做过蓝牙项目(笔者亲身体验)出了问题的时候不清楚到底是嵌入式工程师AT指令不对呢,还是iOS开发工程师自己的代码有问题,也花费大量时间发现、处理iphone与蓝牙模块中的异常情况,做出逻辑改进,优化用户体验。我们的项目中,iphone与蓝牙模块基于Modbus协议通讯,这以后笔者会慢慢写。本文是通过iphone手机控制外设,不涉及iphone手机之间的蓝牙连接交互,也不涉及其他设备控制iphone手机。

第一步:建立连接

1.基于系统库<CoreBluetooth/CoreBluetooth.h>进行开发,因此导入头文件#import <CoreBluetooth/CoreBluetooth.h>;

遵循代理<CBCentralManagerDelegate,CBPeripheralDelegate>

2.创建CBCentralManager实例

3.当创建完CBCentralManager实例后,会收到CBCentralManagerDelegate回调,执行以下代理方法(可自行把苹果弃用的方法枚举改为新的枚举,笔者较懒没改,但能用);

CBCentralManagerStatePoweredOff的时候可添加方法通知到你当前的控制器,让它提示用户到系统->设置->蓝牙里打开蓝牙连接;CBCentralManagerStatePoweredOn的时候可添加方法通知你当前的控制器,告诉它蓝牙可用,让用户继续后面的操作。

4.当蓝牙走到CBCentralManagerStatePoweredOn的时候,此时添加方法去告诉控制器蓝牙是可用的,此时用户可进行scan扫描周边蓝牙设备的操作,scanForPeripheralsWithServices中,传入nil表示对搜索周边所有的蓝牙设备,当然你也可以通过UUID寻找特定的蓝牙设备;

5.当CBCentralManager开始做scan这个搜索动作后,会触发CBCentralManagerDelegate的回调;此处有三坑,第一坑:蓝牙模块很久都搜不出来。针对这个坑,需要找到嵌入式工程师,让嵌入式工程师去调整蓝牙模块广播的频率,笔者的项目中,当嵌入式工程师调整完此频率后,就很容易把蓝牙模块搜索出来了;第二坑:比如我有一个蓝牙模块,两台名字不同的机器,第一台机器叫A,第二台机器叫B,当蓝牙模块插进A的时候,此时我们搜出的名字应该叫A,当蓝牙模块插进B的时候,此时我们搜出的名字应该叫B,如果此时间用peripheral.name,我们把原本插在A的蓝牙拔出,然后插进B,会发现peripheral.name还没变过来依然叫A,但嵌入式工程师广播的name,NSString* name = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey];确实已经变成B了,笔者原来一直用peripheral.name,然后一直跟嵌入式工程师纠缠说他没改过来,但其实他确实已经改过来了;第三坑:iOS与安卓不同,安卓能轻松拿到蓝牙设备的mac地址,但iOS拿不到,这里嵌入式工程师和产品又会跟你说你最讨厌的一句话“安卓可以”,然后问题又推到iOS开发者身上了,笔者是不能够通过iphone直接拿到mac地址,要获取mac地址只能叫嵌入式工程师把mac地址写在广播里的advertisementData中,key是kCBAdvDataManufacturerData,要写到这个key的value里,关于kCBAdvDataManufacturerData,请自行百度搜索;RSSI为距离值;

至此,已经完成搜索

6.搜索出你的蓝牙模块后,开始下一个动作,用iphone去连接蓝牙模块;

7.当调用上面connectPeripheral:options的方法连接成功后,会触发CBCentralManagerDelegate的回调,在回调中,需要调起服务services和特征Characteristics,这时,去找到你的嵌入式工程师,问他把读\写放在services、Characteristics这两个数组的哪个地方,找出特征,通过该特征实现iphone和蓝牙设备之间的交互;

8.当上面peripheral调用discoverServices时,会触发CBPeripheralDelegate代理的回调。下面回调里面的内容忽略,根据具体情况而定,哪个服务里的哪个特征是读写的问嵌入式,使劲质问他就对了;

9.上面调用discoverCharacteristics:forService,触发CBPeripheralDelegate回调。readValueForCharacteristic 和 setNotifyValue:forCharacteristic:请记得打开,不打开这两个进行操作的话,数据发出去了,得不到回调,然后一脸懵逼地跟嵌入式说没有数据返回,他只会跟你说已经给你返回了,人家确实是返回了;

第二步:实现通讯

10.   iphone手机发送指令

value是你组好的包NSData,Characteristic是那个打开了readValueForCharacteristic和setNotifyValue:forCharacteristic的特征

 [self.peripheral writeValue:sendData forCharacteristic:self.charater type:CBCharacteristicWriteWithResponse];

11.调用了readValueForCharacteristic和setNotifyValue:forCharacteristic:后,按照嵌入式制定的modbus协议发送数据,触发CBPeripheralDelegate回调,忘记了是什么原因触发下图第一个回调了请自行尝试,后面按照正确的modbus协议发出数据,蓝牙模块透传给机器,机器完成操作返回给模块,模块->iphone,调起didUpdateValueForCharacteristic回调,NSData*data = characteristic.value;data就是要取回的包,回调中拼包等一系列数据处理、block回传值之类的乱七八遭的东西请自行发挥;

至此,iphone手机连接蓝牙外设的项目已完成最主要的连接、交互两部分,剩下的功能实现,就要看各种逻辑处理的自行发挥了;

12.断开蓝牙

整个交互过程就是这么简单,然后就是一大堆的组包、解包、拼包等逻辑题;以上,为本人在实战中自行探讨出来,如有说得不对的地方、可以更简单的地方,请帮忙指出;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 每天上下班路上来回十六站,利用这一个小时读书。坚持下来,一个月也能看完一本普通厚度的书。我自己体验了拿纸质版书籍在...
    这一刻的永恒阅读 301评论 0 0
  • 每年清明的时候,家里都要给去世的爷爷和姥爷上坟祭祀。初春的天气,虽然杨柳吐了新叶,连翘开出了点点金黄的花朵,素净的...
    小蛾子吖阅读 970评论 9 14
  • 君不见,月灼西窗,笔下惶惶 君不见,日暮西褚,渔歌独唱 君不见,伛偻提携,往来无常 君不见,车过龙马,人走夕幢 君...
    语无期阅读 450评论 0 5