zoukankan      html  css  js  c++  java
  • iOS蓝牙开发

    蓝牙常见名称和缩写

    • MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备

    • BLE ==== buletouch low energy,蓝牙4.0设备因为低耗电,所以也叫做BLE

    • peripheral,central == 外设和中心,发起连接的时central,被连接的设备为perilheral

    • service and characteristic === 服务和特征 每个设备会提供服务和特征,类似于服务端的api,但是机构不同。每个外设会有很多服务,每个服务中包含很多字段,这些字段的权限一般分为 读read,写write,通知notiy几种,就是我们连接设备后具体需要操作的内容。

    • Description 每个characteristic可以对应一个或多个Description用户描述characteristic的信息或属性

    • MFI === 开发使用ExternalAccessory 框架

    • 4.0 BLE === 开发使用CoreBluetooth 框架

    蓝牙中心模式流程

    1. 建立中心角色

    2. 扫描外设(discover)

    3. 连接外设(connect)

    4. 扫描外设中的服务和特征(discover)

        - 4.1 获取外设的services

        - 4.2 获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值

    5. 与外设做数据交互(explore and interact)

    6. 订阅Characteristic的通知

    7. 断开连接(disconnect)

    蓝牙外设模式流程

    1. 启动一个Peripheral管理对象

    2. 本地Peripheral设置服务,特性,描述,权限等等

    3. Peripheral发送广告

    4. 设置处理订阅、取消订阅、读characteristic、写characteristic的委托方法

    蓝牙设备状态

    1. 待机状态(standby):设备没有传输和发送数据,并且没有连接到任何设

    2. 广播状态(Advertiser):周期性广播状态

    3. 扫描状态(Scanner):主动寻找正在广播的设备

    4. 发起链接状态(Initiator):主动向扫描设备发起连接。

    5. 主设备(Master):作为主设备连接到其他设备。

    6. 从设备(Slave):作为从设备连接到其他设备。

    蓝牙设备的五种工作状态

    • 准备(standby)

    • 广播(advertising)

    • 监听扫描(Scanning

    • 发起连接(Initiating)

    • 已连接(Connected)

    蓝牙和版本的使用限制

    • 蓝牙2.0 === 越狱设备

    • 蓝牙4.0 === iOS 6 以上

    • MFI认证设备(Make For ipod/ipad/iphone) === 无限制

    BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容iOS和Mac OS X。

    特色:

    • 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮你更简单地使用CoreBluetooth API。

    • CoreBluetooth所有方法都是通过委托完成,代码冗余且顺序凌乱。BabyBluetooth使用block方法,可以重新按照功能和顺序组织代码,并提供许多方法减少蓝牙开发过程中的代码量。

    • 链式方法体,代码更简洁、优雅。

    • 通过channel切换区分委托调用,并方便切换

    来源

    最近几个月都在做蓝牙项目,用CoreBluetooch感觉语句写的到处都是,不优雅。一整条链下来要近10几个委托方法,并且不断的在委托方法中调用方法再进入其他的委托,导致 代码很零散。因此我就想让coreBlueTooth使用更简单,语法更优雅,所以开始写这个BabyBluetooch蓝牙库。

    刚开始写BabyBluetooth时,只有目标,也不值得如何实现,于是一步步安装目标去实现,也遇到过很多问题,慢慢的也想出了解决方案,并一步步直到9月7日早晨,才算完成了 第一个可以用的版本。对于蓝牙这种在app中亮相率不高的功能,github上ios使用的操作蓝牙的库最多就100来个star,然后BabyBluetooch2天的时间内已经有了15个star和10个fork, 已经相当不错了,很快就有越来越多的人参与到项目中,issues,pull request等等。这些都是个人成长和项目成长非常宝贵的资源。

    更新于:20150916,现在BabyBluetooth 已经有了96个star

    期待

    • 蓝牙库写起来很辛苦,希望大家可以多多支持,多多star。BabyBluetooth主页

    • 如果在使用过程中遇到BUG,或发现功能不够用,希望你能Issues我,谢谢

    • 期待大家也能一起为BabyBluetooth输出代码,这里我只是给BabyBluetooth开了个头,他可以增加和优化的地方还是非常多。也期待和大家在Pull Requests一起学习,交流,成长。

    Quick Example

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    //导入.h文件和系统蓝牙库的头文件
    #import "BabyBluetooth.h"
    -(void)viewDidLoad {
        [super viewDidLoad];
       //初始化BabyBluetooth 蓝牙库
        baby = [BabyBluetooth shareBabyBluetooth];
         //设置蓝牙委托
         [self babyDelegate];
         //设置委托后直接可以使用,无需等待CBCentralManagerStatePoweredOn状态
         baby.scanForPeripherals().begin()
    }
    //蓝牙网关初始化和委托方法设置
    -(void)babyDelegate{
        //设置扫描到设备的委托
        [baby setBlockOnDiscoverToPeripherals:^(CBCentralManager *central, CBPeripheral *peripheral, NSDictionary *advertisementData, NSNumber *RSSI) {
            NSLog(@"搜索到了设备:%@",peripheral.name);
        }];
        //设置设备连接成功的委托
        [baby setBlockOnConnected:^(CBCentralManager *central, CBPeripheral *peripheral) {
            NSLog(@"设备:%@--连接成功",peripheral.name);
        }];
        //设置发现设备的Services的委托
        [baby setBlockOnDiscoverServices:^(CBPeripheral *peripheral, NSError *error) {
            for (CBService *service in peripheral.services) {
                NSLog(@"搜索到服务:%@",service.UUID.UUIDString);
            }
        }];
        //设置发现设service的Characteristics的委托
        [baby setBlockOnDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
            NSLog(@"===service name:%@",service.UUID);
            for (CBCharacteristic *c in service.characteristics) {
                NSLog(@"charateristic name is :%@",c.UUID);
            }
        }];
        //设置读取characteristics的委托
        [baby setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristics, NSError *error) {
            NSLog(@"characteristic name:%@ value is:%@",characteristics.UUID,characteristics.value);
        }];
        //设置发现characteristics的descriptors的委托
        [baby setBlockOnDiscoverDescriptorsForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {
            NSLog(@"===characteristic name:%@",characteristic.service.UUID);
            for (CBDescriptor *d in characteristic.descriptors) {
                NSLog(@"CBDescriptor name is :%@",d.UUID);
            }
        }];
        //设置读取Descriptor的委托
        [baby setBlockOnReadValueForDescriptors:^(CBPeripheral *peripheral, CBDescriptor *descriptor, NSError *error) {
            NSLog(@"Descriptor name:%@ value is:%@",descriptor.characteristic.UUID, descriptor.value);
        }];
        //过滤器
        //设置查找设备的过滤器
        [baby setDiscoverPeripheralsFilter:^BOOL(NSString *peripheralsFilter) {
            //设置查找规则是名称大于1 , the search rule is peripheral.name length > 1
            if (peripheralsFilter.length >1) {
                return YES;
            }
            return NO;
        }];
        //设置连接的设备的过滤器
         __block BOOL isFirst = YES;
        [baby setFilterOnConnetToPeripherals:^BOOL(NSString *peripheralName) {
            //这里的规则是:连接第一个AAA打头的设备
            if(isFirst && [peripheralName hasPrefix:@"AAA"]){
                isFirst = NO;
                return YES;
            }
            return NO;
        }];
    }

    CoreBluetooch中实现上扫描,连接,发现服务和characteristic以及它的值相关方法调用是很麻烦啰嗦凌乱的。如下: centralManager启动->状态委托->调用扫描方法->进入扫描到设备的委托->调用连接设备方法->进入连接到设备的委托->发现服务方法->发现服务委托-> 发现characteristic方法->发现characteristic委托->读characteristic的value->读characteristic的value的委托->读description,读description的value-> ....的委托

    而BabyBluetooth只需要一句话就执行了上面的内容。

    1
    2
    3
    4
      //扫描设备 然后读取服务,然后读取characteristics名称和值和属性,获取characteristics对应的description的名称和值
      baby.scanForPeripherals().connectToPeripheral().discoverServices()
      .discoverCharacteristics().readValueForCharacteristic().discoverDescriptorsForCharacteristic()
      .readValueForDescriptors().begin();

    另一方面,BabyBluetooth所有的委托方法都紧凑的聚在了一起。此外,快速示例中没有包括channel的使用,如果包括了channel,那么ios几个页面或者组件的蓝牙 调用模块都可以写在一起,看起来就觉得很方便。

  • 相关阅读:
    一个改写MBR的例子
    explore没有桌面
    Guidance of Set up FTP Server
    重启远程机器(不登录远程机器下的重启)
    Eclipse 一些小知识
    check time period
    Scrum 冲刺——Day 1
    Scrum 冲刺——Day 2
    初学C语言
    CSS选择器
  • 原文地址:https://www.cnblogs.com/Yun-Longcom/p/6000035.html
Copyright © 2011-2022 走看看