iOS蓝牙开发-2-按协议开发

一般来说和蓝牙外设硬件交互都会有简单的协议,一是规范通信,二是对数据加密。
我公司的协议都是由算法定义的,算法会给到一份详细的协议文档,上面会详细的写清楚数据解析及交互。


协议结构.png

例如:读取电量功能


读取电量.png

因为涉及到公司产品,所以打码。

按上面的协议结构来:
假如帧头是0x01,功能码是0x02,校验和是0xxx(具体如何计算,公司内部确定)
APP 发送给 蓝牙外设的数据(读取电量指令)应为:

0x01 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xxx(校验码)

蓝牙外设收到读取电量指令后,返回电量数据应为:

0x01 0x02 0x5A 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xxx(校验码)

注意,第三个字节为电量值,解析代码:

const u_int8_t *bytes = [data bytes];
NSInteger powerValue = bytes[2];
//得到的 powerValue 即为电量值,接下来写个if判断就好了
if (powerValue == 120) {
        //充电中
    }else{
        //显示电量即可
}

我自己做的项目中,CBCentralManager、CBPeripheral都是有单独写了一个类


单独的类.png

WSBLECenterManager:搜索外设、连接设备、自动重连等等逻辑,内含:

/**
 蓝牙状态更新
 
 @param central central
 */
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
}

/**
 发现设备
 
 @param central central
 @param peripheral 外设
 @param advertisementData 广播
 @param RSSI 信号值
 */
- (void)centralManager:(CBCentralManager *)central
 didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary *)advertisementData
                  RSSI:(NSNumber *)RSSI{
//找到自己需要的设备后,可在此处连接,调用以下方法
  [_myCentralManager connectPeripheral:peripheral options:nil];
}

/**
 连接成功

 @param central central
 @param peripheral 外设
 */
- (void)centralManager:(CBCentralManager *)central
  didConnectPeripheral:(CBPeripheral *)peripheral{
}

/**
 连接失败

 @param central central
 @param peripheral 外设
 @param error error
 */
- (void)centralManager:(CBCentralManager *)central
didFailToConnectPeripheral:(CBPeripheral *)peripheral
                 error:(NSError *)error{
}

/**
 断开连接

 @param central central
 @param peripheral 外设
 @param error error
 */
- (void)centralManager:(CBCentralManager *)central 
didDisconnectPeripheral:(CBPeripheral *)peripheral 
                 error:(NSError *)error{
}

WSBLESensor:发送指令、收取数据、解析数据等等功能
内含:

/**
 发现服务

 @param peripheral peripheral
 @param error error
 */
-(void)peripheral:(CBPeripheral *)peripheral
didDiscoverServices:(NSError *)error{
}

/**
 发现特征

 @param peripheral peripheral
 @param service service
 @param error error
 */
- (void)peripheral:(CBPeripheral *)peripheral
didDiscoverCharacteristicsForService:(CBService *)service
             error:(NSError *)error {
}

/**
 收到数据

 @param peripheral peripheral
 @param characteristic characteristic
 @param error error
 */
-(void)peripheral:(CBPeripheral *)peripheral
didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic
            error:(NSError *)error{
}

//发送数据到外设,调用
[self.peripheral writeValue:data
          forCharacteristic:self.writeCharacteristic
                       type:CBCharacteristicWriteWithResponse];

上面发送读取电量指令时,如下:

    Byte bytes[20];
    bytes[0] = (Byte)(1);//帧头
    bytes[1] = (Byte)(2);//读取电量的功能码
    for (NSInteger i = 2; i < 19; i++) {
        bytes[i] = (Byte)(0);
    }
    bytes[19] = (Byte)(/*校验和*/);
    NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
    [self.peripheral writeValue:data
              forCharacteristic:self.writeCharacteristic
                           type:CBCharacteristicWriteWithResponse];

我的设计蓝牙设计思路:

WSBLECenterManager:
  包含CBCentralManager单例对象:  _myCentralManager
  设置代理、实现CBCentralManagerDelegate协议及其方法。这样搜索到的设备都能在WSBLECenterManager获取到,同时连接成功、连接失败、断开连接等等也都可以通过 CBCentralManagerDelegate 协议中的代理方法知晓
如果是需要连接设备,我的做法是在 WSBLECenterManager 中定义了一个可变数组,用于存储连接上的设备。
  查找到的设备、连接设备是否成功、断开设备的提示等都是通过block或者代理回调到viewController中

WSBLESensor:
  这是外设模型,存储了广播数据,信号值等等
  CBPeripheralDelegate 协议中的代理方法都在这个类中实现。查找服务、查找特征、收取数据、解析数据、发送数据都在这个类中实现
  数据处理结果、数据发送结果等都是通过block或者代理回调到viewController中

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

推荐阅读更多精彩内容

  • Guide to BluetoothSecurity原文 本出版物可免费从以下网址获得:https://doi.o...
    公子小水阅读 7,616评论 0 6
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,937评论 3 118
  • 即使瘦成了一根小棍重量忽略不计头颅点燃后仍旧从黑暗的手中夺取一方时空光芒大于自己阴影低于自己活着静等燃烧死了,化光...
    龙千钧阅读 293评论 0 1
  • 人啊,这一辈子最后真正拥有的不就是昨忆嘛,那时想来一辈子实在太短,很多都似那昨天般。 而记忆里那最珍贵的就是个情!...
    朱超_85阅读 221评论 0 0
  • 01 双因素理论,由美国心理学家赫茨伯格提出。双因素理论把引起人们工作动机的因素主要有两个:一是激励因素,二是保健...
    海涛笔记阅读 1,580评论 0 5