学而时习之,不亦悦乎,大家好,我是张杰。
随着社会的发展已经手机应用的普及,可穿戴以及携带的蓝牙设备已经随处可见,比如我们最常见的体重秤,体脂秤之类的,还有一些常见的医疗设备如血压计,高端一点的类似心电图等。
本文主要介绍:
一、iOS开发扫描蓝牙设备。
二、iOS开发连接蓝牙设备。
三、iOS开发读取蓝牙设备数据。
四、iOS开发发送指令给蓝牙设备。
一下开始解读并附上代码:
1、引入蓝牙库
#import <CoreBluetooth/CoreBluetooth.h>
2、设置代理
@interface ViewController () <CBCentralManagerDelegate, CBPeripheralDelegate>
3、初始化,只要一触发这句代码系统会自动检测手机蓝牙状态,你必须实现其代理方法,当然得添加<CBCentralManagerDelegate>
self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
4、查看手机蓝牙状态
/** 从这个代理方法中你可以看到所有的状态,其实我们需要的只有on和off连个状态*/
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
switch (central.state) {
case CBManagerStateUnknown:
NSLog(@"__CBManagerStateUnknown__");
break;
case CBManagerStateResetting:
NSLog(@"__CBManagerStateResetting__");
break;
case CBManagerStateUnsupported:
NSLog(@"__CBManagerStateUnsupported__");
break;
case CBManagerStateUnauthorized:
NSLog(@"__CBManagerStateUnauthorized__");
break;
case CBManagerStatePoweredOff:
NSLog(@"__CBManagerStatePoweredOff__");
break;
case CBManagerStatePoweredOn:
NSLog(@"__CBManagerStatePoweredOn__");
[self.bluetoothManager scanForPeripheralsWithServices:nil
options:nil];
break;
default:
break;
}
}
这里有一点要注意的是一定要检测到蓝牙打开状态才能开始扫描蓝牙设备,如果关闭状态下调用会导致扫描不到设备,也就是没有反应。
5、扫描蓝牙设备
[self.bluetoothManager scanForPeripheralsWithServices:nil options:nil];
注意:调用这个方法要在监听到蓝牙打开的状态下,详解看上面第四点。
6、扫描到蓝牙设备代理并筛选我们需要的,然后连接。
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
NSLog(@"扫描连接外设:%@ %@", peripheral.name, RSSI);
if ([peripheral.name isEqualToString:@"BeneCheck-0095"]) {
self.pripheral = peripheral;
[central stopScan];
/** 进行连接*/
[central connectPeripheral:peripheral options:nil];
}
}
扫描到的蓝牙设备基本都会在这里,一般我们做的逻辑就是扫描到某一个设备就停止扫描,然后连接设备。
如果需要单独手动连接,可以抽象出来:
[self.bluetoothManager connectPeripheral:peripheral options:nil];
7、连接成功或者失败后走的代理
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
NSLog(@"连接外设成功!%@", peripheral.name);
[peripheral setDelegate:self];
[peripheral discoverServices:nil];
}
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"连接到外设 失败!名字:%@ 错误信息:%@", [peripheral name], [error localizedDescription]);
}
8、扫描到服务
// 扫描到服务
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
if (error)
{
NSLog(@"扫描外设服务出错:%@-> %@", peripheral.name, [error localizedDescription]);
return;
}
NSLog(@"扫描到外设服务:%@ -> %@", peripheral.name, peripheral.services);
for (CBService *service in peripheral.services) {
[peripheral discoverCharacteristics:nil forService:service];
}
NSLog(@"开始扫描外设服务的特征 %@...", peripheral.name);
}
9、扫描到特征
// 扫描到特征
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
if (error)
{
NSLog(@"扫描外设的特征失败!%@->%@-> %@", peripheral.name, service.UUID, [error localizedDescription]);
return;
}
NSLog(@"扫描到外设服务特征有:%@->%@->%@", peripheral.name, service.UUID, service.characteristics);
//获取Characteristic的值
for (CBCharacteristic *characteristic in service.characteristics){
//这里外设需要订阅特征的通知,否则无法收到外设发送过来的数据
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
//需要说明的是UUID是硬件定义好给你,如果硬件也是个新手,那你可以先打印出所有的UUID, 找出有用的
//步数
if ([characteristic.UUID.UUIDString isEqualToString:@"FF06"])
{
[peripheral readValueForCharacteristic:characteristic];
}
//电池电量
else if ([characteristic.UUID.UUIDString isEqualToString:@"FF0C"])
{
[peripheral readValueForCharacteristic:characteristic];
}
else if ([characteristic.UUID.UUIDString isEqualToString:@"2A06"])
{
//震动
self.characteristic = characteristic;
}
}
}
10、扫描到具体的值->通讯主要的获取数据的方法
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error
{
if (error) {
NSLog(@"扫描外设的特征失败!%@-> %@", peripheral.name, [error localizedDescription]);
return;
}
NSLog(@"%@ %@", characteristic.UUID.UUIDString, characteristic.value);
if ([characteristic.UUID.UUIDString isEqualToString:@"FF06"]) {
Byte *steBytes = (Byte *)characteristic.value.bytes;
int steps = bytesValueToInt(steBytes);
NSLog(@"%d", steps);
} else if ([characteristic.UUID.UUIDString isEqualToString: @"FF0C"])
{
Byte *bufferBytes = (Byte *)characteristic.value.bytes;
int buterys = bytesValueToInt(bufferBytes)&0xff;
NSLog(@"电池:%d%%",buterys);
} else
{
Byte *infoByts = (Byte *)characteristic.value.bytes;
NSLog(@"===%s", infoByts);
//这里解析infoByts得到设备信息
}
}
最后一步是收到的数据,这一步需要看蓝牙设备文档才能知道怎么解析。如果自己研究,可以打印出来看看。
11、写入
- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type
{
/**
我们只需要在搜索每个服务的特征,记录这个特征,然后向这个特征发送数据就可以了。
*/
}
12、手动断开连接
- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral
{
}
以上就是开发蓝牙的全部过程了,其中读取和写入参考蓝牙设备开发文档就好。这次的写的仅仅是蓝牙入门,仅限入门。 所谓师傅引进门,修行靠个人。
如果有错误或者还有其他问题,可以联系我:zhangjieiossky@163.com,谢谢
网友评论