• iOS蓝牙4.0


    iOS的蓝牙用到了  CoreBluetooth 框架

    首先导入框架  

    #import <CoreBluetooth/CoreBluetooth.h>

    我们需要一个管理者来管理蓝牙设备,CBCentralManager 

    首先创建管理者  

    self.manager = [[CBCentralManager alloc]initWithDelegate:self queue:nil options:nil];

    这里只需要设置一个代理,队列根据需求来选择,这里用了nil 就是默认在主线程。options是筛选设备的条件。

    创建完管理者后  会执行代理方法  

    - (void)centralManagerDidUpdateState:(CBCentralManager *)central

    可以查看manager的一个属性 : state  来识别蓝牙的状态 ,该属性是一个枚举值  CBCentralManagerState

    typedef NS_ENUM(NSInteger, CBCentralManagerState) {

    CBCentralManagerStateUnknown = 0,   初始的时候是未知的(刚刚创建的时候)

    CBCentralManagerStateResetting,   正在重置状态

    CBCentralManagerStateUnsupported,   设备不支持的状态

    CBCentralManagerStateUnauthorized,      设备未授权状态

    CBCentralManagerStatePoweredOff,    设备关闭状态

    CBCentralManagerStatePoweredOn,    设备开启状态 -- 可用状态

    };

    如果是处于  CBCentralManagerStatePoweredOn  状态,那么就可以开始搜索设备   [self.managerscanForPeripheralsWithServices:nil options:nil];

    可以设置一个计时器 在一段时间后停止搜索,避免耗电 [self.manager stopScan];

    如果搜索到了设备,那么会调用代理方法  

    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI

    其中 peripheral是搜索到的设备,advertisementData是关于设备的一些信息,RSSI是设备的信号强度

    可以根据 advertisementData 里面的 kCBAdvDataServiceUUIDs 的值 UUID来筛选某种设备  

    搜索到设备后就可以进行连接了,蓝牙4.0支持一对多连接。

    连接设备    [self.manager connectPeripheral:peripheral options:nil];  

    连接成功后 会执行代理方法

    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral

    如果需要断开某个设备,则调用方法  [self.manager cancelPeripheralConnection:peripheral];

    设备不管是自己断开还是手动断开,都会调用代理方法

    - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error

    在这里可以判断一下,如果不是手动断开的连接,则可以再连接断开的设备,实现断开设备自动连接的功能

    CBCentralManager就是用来做以上这些事情的,要给设备发送数据和接受数据 则要用到 CBPeripheral

    首先设置设备的代理

    peripheral.delegate = self;

    然后开始搜索设备服务    [peripheral discoverServices:nil];

    搜索成功后会执行代理方法

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

    在这里 设备的 services 属性里面就有设备服务的数据了,可以遍历这个数组来匹配到我们需要的服务,这个一般跟硬件厂商协商,这里我们假如需要UUID为FF00的服务

     

    如果成功匹配到服务,那么调用方法    [peripheral discoverCharacteristics:nil forService:s];  

    成功后会执行代理方法 

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

    在这个方法里面,服务的属性 characteristics ,会是一组的 CBCharacteristic,是服务的一些特征,在这里,我们假设发送数据需要用到特征的UUID为 FF02

     

    发送的数据为  550504010101AA,我们将其转换为 NSData 类型 调用方法   [peripheral writeValue:dataforCharacteristic:c type:CBCharacteristicWriteWithoutResponse]  将数据发送给设备

    发送成功后会执行代理方法 

    - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

    如果是读取设备的数据 那么使用方法  [peripheral readValueForCharacteristic:c] ,读取数据后会执行代理方法

    - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic*)characteristic error:(NSError *)error

     

    为了更好点交流和学习,请大家在参阅博客后,留下你的疑问和宝贵意见。谢谢!!!!
  • 相关阅读:
    .NET开发人员遇到Maven
    基于VS Code创建Java command-line app
    IntelliJ IDEA连接TFS local workspace无法正常签入
    Xcode连接TFS Git用户名和密码不正确解决方案
    Fiddler如何捕捉DefaultHttpClient的HTTP请求
    IIS 6的日志time-taken字段没有值的解决方案
    简单的音乐轮播JS
    SpringCloud分布式开发理解
    SpringCloud分布式开发五大神兽
    socket长连接和短链接区别
  • 原文地址:https://www.cnblogs.com/fshmjl/p/4843811.html
Copyright © 2020-2023  润新知