iOS关于蓝牙框架BLE的开发--基础用法(下)

承接上文:iOS关于蓝牙框架BLE的开发--基础用法(上)
上文提及到对特征码CBCharacteristic进行操作,现在聊聊对应不同的操作的后续吧...

操作特征码后的回调——订阅/读取回调与失败回调

1.订阅/读取成功

按正常流程,通过特征码的订阅或读取,成功之后,都会通过这个方法获取对应的数据:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
其中characteristic.value就是订阅/读取特征码对应的数据,我们可以通过代理或者block把这个value传到需要用到的地方,全部代码如下:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
if (error) {
NSLog(@"error:%s,%@",PRETTY_FUNCTION,error);
return;
}
else {
NSLog(@"peripheral value == %@",characteristic.value);
if (_delegate && [_delegate respondsToSelector:@selector(receiveData:data:)]) {
[_delegate receiveData:peripheral data:characteristic.value];
}
}
}

而大家看到,如果订阅/读取失败的话,就有error,所以我在这个方法判断一下error是否存在,如果存在就做相应的事情并且返回;

2.向设备写入数据或发送指令回调

当需求需要中心设备向外设写入数据或发送指令,如果使用的方法是CBCharacteristicWriteWithResponse的话,就会进入-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error这个代理方法里面去:

-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
  if (error) {
    NSLog(@"写入命令失败=====%@",error.userInfo);
  }
  else{
    NSLog(@"写入命令成功");
  }
}

再略略展开一下讲讲,一般有几种情况会用到写入方法,已经遇到过的情况先列举一下,日后可能还会增加

  • 有些外设,在获取数据前会让中心设备先在规定时间内发送认证指令,增加安全性.这样的话,我们订阅或读取特征码的方法,就要放到这个方法里面来了;
  • 有些外设,有一些例如同步时间啊,打开/关闭某个功能开关,修改设备名或者修改某个功能.这个时候,我们就要对不同的需求在这个地方做不同的操作,一般情况下,就写个代理或者block在其他地方实现.

3.读取外设信号

这点算是补充说明吧,在旧的iOS版本下,设备peripheral有个属性叫做RSSI,可以拿到外设的信号,而新的(忘记了在哪个)版本下,这个属性被废弃了,想要获取,就要通过[peripheral ReadRSSI]的方法来获取,执行这个方法后,将进入-(void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error这个代理方法,流程就和订阅和写入回调一样,就不详细讲了,不过这个方法,好像不用连接外设,只要搜索到了就可以用了

-(void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error{
  if (_delegate && [_delegate respondsToSelector:@selector(SG_readPeripheralRSSI:peripheral: error:)]) {
     [_delegate SG_readPeripheralRSSI:RSSI peripheral:peripheral error:error];
  }
}
一些补充
  • 苹果的框架下,没有提供方法让我们拿到外设的MAC地址的.但是,我们通过和硬件工程师的协商,把MAC地址暴露出来,就可以获取得到,而方法却比较苛刻.
    iOS关于蓝牙框架BLE的开发--基础用法(上)搜索外设的步骤中,代理方法-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI有个很奇怪的东西混了进来,名字叫advertisementData,仔细一看,是个字典,而苹果是允许外设在成功连接前把要广播的数据存在这里,而通过指定keykCBAdvDataManufacturerData,在没连接成功的情况下获取里面包的内容,于是,我们就可以把MAC地址放进去,让我们中心设备拿到MAC地址了,我遇到的情况,就是要通过这个MAC地址和一些指定协议,来生成认证指令,发送到外设去;

  • 一般情况下,如果不过滤的话,搜索后蓝牙列表会有很多奇奇怪怪的设备,于是,我们会通过 advertisementData 这个广播包或者设备名字来进行过滤,把一些APP不需要展示的外设过滤掉,或者根据不同的名字和型号,兼容不同的设备并对其做不一样的操作.

  • 在我的具体项目,认证指令需要通过异或计算,把十六进制数据异或之后生成一个校验,什么是异或计算,怎么异或计算,本人也是直接谷歌的,就直接上代码吧:
    .h文件:
    #import <Foundation/Foundation.h>

    @interface ExclusiveOr : NSObject
    /**
     添加数组
     */
    +(NSString *)exclusiveOrArray:(NSArray *)array;
    /**
     两个数进行异或
     */
    +(NSString *)pinxCreator:(NSString *)pan withPinv:(NSString *)pinv;
    @end
    

.m文件:

#import "ExclusiveOr.h"
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
@implementation ExclusiveOr

+(NSString *)exclusiveOrArray:(NSArray *)exclusive{
  if (exclusive.count !=0) {
    NSString *exclusiveString = exclusive.lastObject;
    for (int i =0; i<exclusive.count - 1; i++) {
      if (i==0) {
            NSString *pan = [exclusive[i] uppercaseString];
            NSString *pinv = [exclusive[i+1] uppercaseString];
            exclusiveString = [ExclusiveOr pinxCreator:pan withPinv:pinv];
      }
      else{
        NSString *pinv = [exclusive[i+1] uppercaseString];
        exclusiveString = [ExclusiveOr pinxCreator:exclusiveString withPinv:pinv];
      }
    }
    return exclusiveString;
  }
  else{
    return @"";
  }
}

+ (NSString *)pinxCreator:(NSString *)pan withPinv:(NSString *)pinv  {
  if (pan.length != pinv.length)   {
      return nil;
  }
  const char *panchar = [pan UTF8String];
  const char *pinvchar = [pinv UTF8String];
  NSString *temp = [[NSString alloc] init];
  for (int i = 0; i < pan.length; i++) {
    int panValue = [ExclusiveOr charToint:panchar[i]];
    int pinvValue = [ExclusiveOr charToint:pinvchar[i]];
    temp = [temp stringByAppendingString:[NSString stringWithFormat:@"%X",panValue^pinvValue]];
      }
    return temp;
  }

+ (int)charToint:(char)tempChar {
  if (tempChar >= '0' && tempChar <='9') {
         return tempChar - '0';
  }
  else if (tempChar >= 'A' && tempChar <= 'F') {
    return tempChar - 'A' + 10;
  }
  return 0;
}
@end

到这里,我们对BLE开发基本就讲完了,或许后面,我会把一些简单的操作,如自动重连,刷新蓝牙列表,绑定设备之类的功能简单实现,骚骚期待一下吧...

Demo在想要不要发出来好...没人看就算了

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

推荐阅读更多精彩内容