概述
前几个月做了一个蓝牙的项目,初次接触,也查了好多资料,算是有了个大概的了解,最近又做另一个蓝牙的项目,发现还是有很多地方不是很明白,也为了防止忘记,就写下来吧!
在CBCentralManager初始化的时候,一般放在另一个线程中:
dispatch_queue_t centralQueue = dispatch_queue_create("myCentralQueue",DISPATCH_QUEUE_SERIAL);
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueue];
初始化也可以使用如下的方法:
- (id)initWithDelegate:(id<CBCentralManagerDelegate>)delegate queue:(dispatch_queue_t)queue options:(NSDictionary *)options
如:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],CBCentralManagerOptionShowPowerAlertKey, @"zStrapRestoreIdentifier",CBCentralManagerOptionRestoreIdentifierKey,nil];
myCenter = [[CBCentralManager alloc] initWithDelegate:self
queue:dispatch_queue_create("com.myBLEQueue", NULL)
options:options];
Central Manager Initialization Options 对应的有两项:
- CBCentralManagerOptionShowPowerAlertKey
布尔值,表示的是在central manager初始化时,如果当前蓝牙没打开,是否弹出alert框。 - CBCentralManagerOptionRestoreIdentifierKey
https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html
就是说,如果蓝牙程序进入后台,程序会被挂起,可能由于memory pressure,程序被系统kill了,那么代理方法就不会执行了。这时候可以使用State Preservation & Restoration,这样程序会重新加载进入后台。
调试iOS蓝牙的时候,可以下个LightBlue,非常方便,网上也有仿写LightBlue的Demo,参考这两处:
https://github.com/chenee/DarkBlue
http://boxertan.github.io/blog/2014/07/07/xue-xi-ioslan-ya-ji-zhu-%2Cfang-xie-lightblue/
使用scanForPeripheralsWithServices:options: 来扫描外设:
NSDictionary *option = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey,nil];
<span style="white-space:pre"> </span>[_centralManager scanForPeripheralsWithServices:nil options:option];
options是可选的,CBCentralManagerScanOptionAllowDuplicatesKey,bool值,为NO,表示不会重复扫描已经发现的设备。
连接外设使用connectPeripheral:options: 方法,options为可选,options可以为:
- CBConnectPeripheralOptionNotifyOnConnectionKey
- CBConnectPeripheralOptionNotifyOnDisconnectionKey
- CBConnectPeripheralOptionNotifyOnNotificationKey
[myCenter connectPeripheral:peripheralInfo.peripheral options:@{CBConnectPeripheralOptionNotifyOnConnectionKey: @YES, CBConnectPeripheralOptionNotifyOnDisconnectionKey: @YES, CBConnectPeripheralOptionNotifyOnNotificationKey: @YES}];
在蓝牙连接的过程中,代理方法centralManagerDidUpdateState: 会判断中央设备的状态:
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
// Determine the state of the peripheral
if ([central state] == CBCentralManagerStatePoweredOff) {
NSLog(@"CoreBluetooth BLE hardware is powered off");
}
else if ([central state] == CBCentralManagerStatePoweredOn) {
NSLog(@"CoreBluetooth BLE hardware is powered on and ready");
}
else if ([central state] == CBCentralManagerStateUnauthorized) {
NSLog(@"CoreBluetooth BLE state is unauthorized");
}
else if ([central state] == CBCentralManagerStateUnknown) {
NSLog(@"CoreBluetooth BLE state is unknown");
}
else if ([central state] == CBCentralManagerStateUnsupported) {
NSLog(@"CoreBluetooth BLE hardware is unsupported on this platform");
}
}
返现characteristic后可以读取它的值,也可以订阅它:
[self.peripheral readValueForCharacteristic:characteristic];
[self.peripheral setNotifyValue:YES forCharacteristic:characteristic];
以上两个方法都会调用代理方法:didUpdateValueForCharacteristic:error:
向外设的某个characteristic写入值,可以这样写:
- (void)writeToperipheral:(CBPeripheral *)peripheral Service:(NSString *)serviceUUID characteristic:(NSString *)characteristicUUID data:(NSData *)data
{
CBUUID *servUUID = [CBUUID UUIDWithString:serviceUUID];
CBUUID *charUUID = [CBUUID UUIDWithString:characteristicUUID];
CBService *service = nil;
CBCharacteristic *characteristic = nil;
for (CBService *ser in peripheral.services) {
if ([ser.UUID isEqual:servUUID]) {
service = ser;
break;
}
}
if (service) {
for (CBCharacteristic *charac in service.characteristics) {
if ([charac.UUID isEqual:charUUID]) {
characteristic = charac;
break;
}
}
}
if (characteristic) {
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
}
else{
NSLog(@"not found that characteristic");
}
}
NSData的值可以这样组织,这与你的需求有关并不一定:
char data;
data = 0x15;
NSData *d = [[NSData alloc] initWithBytes:&data length:1];
读取某个 characteristic的值
- (void)readPeripheral:(CBPeripheral *)peripheral serviceUUID:(NSString *)serviceUUID characteristicUUID:(NSString *)characteristicUUID
{
CBUUID *servUUID = [CBUUID UUIDWithString:serviceUUID];
CBUUID *charUUID = [CBUUID UUIDWithString:characteristicUUID];
CBService *service = nil;
CBCharacteristic *characteristic = nil;
for (CBService *ser in peripheral.services) {
if ([ser.UUID isEqual:servUUID]) {
service = ser;
break;
}
}
if (service) {
for (CBCharacteristic *charac in service.characteristics) {
if ([charac.UUID isEqual:charUUID]) {
characteristic = charac;
break;
}
}
}
if (characteristic) {
[peripheral readValueForCharacteristic:characteristic];
}else{
NSLog(@"----------未找到当前的characteristic");
}
}
通过保存的identity来找到以前连接的设备
保存identity
NSUUID *uuid = peripheral.identifier;
NSString *uuidString = uuid.UUIDString;
[[NSUserDefaults standardUserDefaults] setObject:uuidString forKey:PERIPHERAL_UUID];
[[NSUserDefaults standardUserDefaults] synchronize];
然后通过
identity,来搜索设备:
NSString *uuidString = [[NSUserDefaults standardUserDefaults] stringForKey:PERIPHERAL_UUID];
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidString];
_peripheralArr = [NSMutableArray arrayWithArray: [self.centralManager retrievePeripheralsWithIdentifiers:@[uuid]]];
for (CBPeripheral *peripheral in _peripheralArr) {
self.peripheral = peripheral;
[self.centralManager connectPeripheral:peripheral options:nil];
}
通过retrieveConnectedPeripheralsWithServices:函数来检索当前连接到系统的蓝牙设备:
NSArray *atmp = [NSArray arrayWithObjects:[CBUUID UUIDWithString:@"180A"], nil];
NSArray *retrivedArray = [myCenter retrieveConnectedPeripheralsWithServices:atmp];
NSLog(@"retrivedArray:n%@",retrivedArray);
for (CBPeripheral* peripheral in retrivedArray) {
[self addPeripheral:peripheral advertisementData:nil RSSI:nil];
}
最后
以上就是殷勤小蝴蝶为你收集整理的iOS蓝牙的全部内容,希望文章能够帮你解决iOS蓝牙所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复