iOS

ios蓝牙BLE读写设备信息(一)

2019-04-29  本文已影响0人  幻风0628

前言:最近公司的一个关于beacon设备管理的app端,用到蓝牙BLE,第一次接触踩了不少坑,大致介绍一下开发的思路。

初始化蓝牙

项目中使用的框架<CoreBluetooth/CoreBluetooth.h> 蓝牙管理类CBCentralManager

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

代理监听蓝牙状态,蓝牙状态可用的情况下扫描外设,这里ServiceUUID需要找硬件厂商获取,扫描特定的beacon设备,如果ServiceUUID为空,那就是扫描所有的蓝牙设备。

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    switch (central.state)
    {
        case CBManagerStateUnsupported:
            [ToolClass showMsg:@"蓝牙不可用"];
            break;
        case CBManagerStateUnauthorized:
            [ToolClass showMsg:@"蓝牙未授权"];
            break;
        case CBManagerStatePoweredOff:
            [ToolClass showMsg:@"蓝牙未打开"];
            break;
        case CBManagerStatePoweredOn:
        {
            CBUUID *uuid = [CBUUID UUIDWithNSUUID:ServiceUUID];
            [self.bluetoothManager scanForPeripheralsWithServices:@[uuid] options:nil];
        }
            break;
        case CBManagerStateUnknown:
            [ToolClass showMsg:@"蓝牙状态未知"];
        default:
            NSLog(@"不明情况了");
    }
}

扫描后发现设备

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
}
image.png

注意:坑来了,这里扫描到蓝牙外设之后,获取的peripheral中只有name、identifier、RSSI等属性,但是项目中要求要读取设备的major、minor值、电量等等。只有通过获取蓝牙广播的信息advertisementData获取,此时安卓端已经能够通过广播读取全部信息,iOS中获取的广播信息advertisementData中的字段并没有这些字段,网上查了诸多资料都没能解决。后来发现了一篇文档,附上地址 https://blog.csdn.net/zh_kun/article/details/50920434 上面介绍外设设置成了iBeacon模式了,ibeacon会限制ios可接受的广播信息。我就尝试着让硬件工程师将广播模式改成了ble模式,终于从advertisementData获取到了kCBAdvDataManufacturerData,需要通过顺序截取相应的属性值。

后记:刚拿到这个项目时准备使用iOS中的CLBeaconRegion进行开发,后来发现只能获取蓝牙属性值,不能进行连接读写,果断放弃。

未完待续

上一篇下一篇

猜你喜欢

热点阅读