iOS|iOS 蓝牙开发

iOS|iOS 蓝牙开发
文章图片
042ec9e15de70b28500fa5b9e06883be.jpg

【iOS|iOS 蓝牙开发】不想写太多字、所以就直接粘贴代码了
1、实现蓝牙单连接
2、实现蓝牙重连
3、实现蓝牙简单发送指令
这个Demo是16年写的了、最近才开始写的,所以就把这个分享给大家
// //MBBlueToothManager.m //MBDemo //Created by kcl on 16/12/28. //Copyright ? 2016年 kcl. All rights reserved. //#import "MBBlueToothManager.h"@interface MBBlueToothManager(){CBCentralManager *manager; CBUUID *identifiers; NSData *_dataValue; L2_command_id_t _keyId; UInt8 _moudleId; NSMutableArray *connectDevice; } @end static MBBlueToothManager *manager; @implementation MBBlueToothManager- (instancetype)init { self = [super init]; if (self) { pairDeviceMutArr = [[NSMutableArray alloc]init]; } return self; } + (instancetype)shareManager { if (manager == nil) { manager = [[MBBlueToothManager alloc]init]; } return manager; } - (void)startScan { manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()]; if (manager.state != CBCentralManagerStatePoweredOn) { //[self alertWithTitle:@"蓝牙未打开" Message:nil certainActionString:@"确定" cancelActionString:@"取消"]; //return; NSLog(@"=====please open your BlueTooth"); } NSLog(@"============= startScan"); [self RetryConnectSaveDevice]; } - (void)stopScan { [manager stopScan]; } - (void)tryToConnect:(CBPeripheral *)pairDevice { //[manager stopScan]; NSLog(@"开始连接设备:%@",pairDevice.name); //NSDictionary *options = @{CBConnectPeripheralOptionNotifyOnDisconnectionKey: @TRUE}; [manager connectPeripheral:pairDevice options:nil]; } - (void)disConnectDevice { if (self.device.state != CBPeripheralStateConnected) { return; } [manager cancelPeripheralConnection:self.device]; }#pragma mark -CBPeripheralDelegate - (void)centralManagerDidUpdateState:(CBCentralManager *)central { CBManagerState state = central.state; switch (state) { case CBCentralManagerStateUnknown:break; case CBCentralManagerStatePoweredOn:[manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@YES}]; break; case CBCentralManagerStatePoweredOff: [self disConnectDevice]; break; case CBCentralManagerStateUnsupported: break; case CBCentralManagerStateUnauthorized: break; default: break; } } - (void)RetryConnectSaveDevice { NSString *uuidStr = [[NSUserDefaults standardUserDefaults] stringForKey:DidConnectDeviceUUID]; NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:uuidStr]; if (uuidStr != nil) {NSArray *arr = [manager retrievePeripheralsWithIdentifiers:@[uuid]]; for (CBPeripheral *aperipheral in arr) { //if ([aperipheral.identifier.UUIDString isEqualToString: peripheral.identifier.UUIDString]) { NSLog(@"connectPeripheral =======%@",[aperipheral debugDescription]); [manager connectPeripheral:aperipheral options:nil]; //[manager stopScan]; //} }}else{ } } //这个地方是自定义的模式、我们公司的设备就是这样的 -(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { MBDeviceModel *model = [[MBDeviceModel alloc] init]; model.device = peripheral; NSString *macStr = [[NSString alloc] init]; NSString *peripheralName = advertisementData[@"kCBAdvDataLocalName"]; if (advertisementData[@"kCBAdvDataServiceUUIDs"]) { NSArray *array = advertisementData[@"kCBAdvDataServiceUUIDs"]; if (array.count>=6) { NSMutableData *tData = [[NSMutableData alloc]initWithCapacity:6]; CBUUID *uuid3 = array[5]; NSData *data3 = uuid3.data; [tData appendData:data3]; CBUUID *uuid2 = array[4]; NSData *data2 = uuid2.data; [tData appendData:data2]; CBUUID *uuid1 = array[3]; NSData *data1 = uuid1.data; [tData appendData:data1]; macStr = [tData macAddrString]; } } model.deviceName = peripheralName; model.macString = macStr; //if ([peripheral.identifier.UUIDString isEqualToString:[[NSUserDefaults standardUserDefaults] stringForKey:DidConnectDeviceUUID]]) { //[manager connectPeripheral:peripheral options:nil]; //}if ([peripheral.name containsString:@"MB12"]) { [[NSNotificationCenter defaultCenter] postNotificationName:kJRDUpdatePeripheralList object:model]; }else{}}- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { [manager stopScan]; NSLog(@"didConnectPeripheral = %@",peripheral.name); self.device = peripheral; [[NSUserDefaults standardUserDefaults] setObject:peripheral.identifier.UUIDString forKey:DidConnectDeviceUUID]; peripheral.delegate = self; [peripheral discoverServices:nil]; } - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"didFailToConnectPeripheral = %@",peripheral.name); [[NSNotificationCenter defaultCenter] postNotificationName:kBHBLEUartDeviceConnectFailNotification object:nil]; } - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"didDisconnectPeripheral = %@",peripheral.name); }#pragma mark - CBPeripheralDelegate -(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { NSLog(@"deviceName = %@ ,didDiscoverServices = %@",peripheral.name,peripheral.services); for(CBService *svc in peripheral.services ) { [peripheral discoverCharacteristics:nil forService:svc]; } }- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { NSLog(@"deviceName = %@ ,didDiscoverCharacteristicsForService = %@",peripheral.name,service.characteristics); for (CBCharacteristic *character in service.characteristics) {if ([[character.UUID UUIDString] isEqual:kBAIDU_HEALTH_BRACELET_UART_RX_CHARACTER_UUID_STRING]) { [peripheral setNotifyValue:YES forCharacteristic:character]; [[NSNotificationCenter defaultCenter] postNotificationName:kBHBLEUartDeviceConnectOKNotification object:nil]; NSLog(@"character = %@",character); } } }- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error { if (!error) { NSLog(@"数据写入成功"); }else{ NSLog(@"数据写入失败"); } } - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { NSLog(@"didUpdateNotificationStateForCharacteristic"); CBUUID *characteristicUUID = [CBUUID UUIDWithString:kBAIDU_HEALTH_BRACELET_UART_RX_CHARACTER_UUID_STRING]; if ([characteristic.UUID isEqual:characteristicUUID]) { if (characteristic.isNotifying) { if (characteristic.properties == CBCharacteristicPropertyNotify) { NSLog(@"value =https://www.it610.com/article/===%@",characteristic.value); return; }else if(characteristic.properties == CBCharacteristicPropertyRead){ NSLog(@"value =https://www.it610.com/article/===%@",characteristic.value); [peripheral readValueForCharacteristic:characteristic]; } }else{} } } - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if (error) { return; }else{} NSLog(@"value = https://www.it610.com/article/========== %@",characteristic.value); if (characteristic.value){ NSString *value = [[NSString alloc]initWithData:characteristic.value encoding:NSUTF8StringEncoding]; }else{ NSLog(@""); } } //- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error //{ //NSLog(@"didUpdateValueForDescriptor"); //if (descriptor.characteristic) { // //[peripheral readValueForCharacteristic:descriptor.characteristic]; //NSLog(@"readValue =https://www.it610.com/article/= %@",descriptor.value); // //} // //} - (void)writeDataToUratWithKeyId:(UInt8)keyId moudleId:(UInt8)moudleId datavalue:(NSData *)dataValue { _dataValue = https://www.it610.com/article/dataValue; _keyId = keyId; _moudleId = moudleId; NSLog(@"开始写入数据 =========keyid=%u ,moduleId = %hhu",keyId,moudleId); for (CBService *service in self.device.services) { for (CBCharacteristic *character in service.characteristics) {if ([[character.UUID UUIDString] isEqualToString:kBAIDU_HEALTH_BRACELET_UART_TX_CHARACTER_UUID_STRING]) {NSLog(@"forCharacteristic ====== %@",character); NSLog(@"=======senddata =https://www.it610.com/article/= %@",[self package]); [self.device writeValue:[self package] forCharacteristic:character type:CBCharacteristicWriteWithoutResponse]; }else{} } } } - (NSData *)package { NSMutableData *header = [[NSMutableData alloc]initWithCapacity:16]; UInt16 magic = L_Magic; NSData *magicData = [NSData dataWithBytes:&magic length:sizeof(UInt16)]; [header appendData:magicData]; UInt16 length = L_Head_length; if (_dataValue) { length = [_dataValue length] + L_Head_length; NSData *lengthData = [NSData dataWithBytes:&length length:sizeof(UInt16)]; [header appendData:lengthData]; }else{ NSData *lengthData = [NSData dataWithBytes:&length length:sizeof(UInt16)]; [header appendData:lengthData]; } UInt8 packageType = L_PackageTypeSend; NSData *packageTypeData = [NSData dataWithBytes:&packageType length:sizeof(UInt8)]; [header appendData:packageTypeData]; UInt8 tversion = L_Version; NSData *vr = [NSData dataWithBytes:&tversion length:sizeof(UInt8)]; [header appendData:vr]; NSData *keyIdData = [NSData dataWithBytes:&_keyId length:sizeof(UInt8)]; [header appendData:keyIdData]; NSData *moudleData = [NSData dataWithBytes:&_moudleId length:sizeof(UInt8)]; [header appendData:moudleData]; if (_dataValue) { [header appendData:_dataValue]; } return header; }- (void)alertWithTitle:(NSString *)alertTitle Message:(NSString *)message certainActionString:(NSString *)certainActionString cancelActionString:(NSString *)cancelActionString { UIAlertController *alertCtr = [UIAlertController alertControllerWithTitle:alertTitle message:message preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *certainAction = [UIAlertAction actionWithTitle:certainActionString style:UIAlertActionStyleDefault handler:nil]; [alertCtr addAction:certainAction]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:cancelActionString style:UIAlertActionStyleCancel handler:nil]; [alertCtr addAction:cancelAction]; UIViewController *ctr = [UIApplication sharedApplication].keyWindow.rootViewController; [ctr presentViewController:ctr animated:YES completion:nil]; }@end

  • 代码里面我一般不会写注释、因为这是我自己写的我能看得懂。
使用这一套可以完成蓝牙简单的需求、有不懂的可以问我、大家一起交流

    推荐阅读