不想写太多字、所以就直接粘贴代码了
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()<CBPeripheralDelegate,CBCentralManagerDelegate>{
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<NSString *,id> *)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 ==== %@",characteristic.value);
return;
}else if(characteristic.properties == CBCharacteristicPropertyRead){
NSLog(@"value ==== %@",characteristic.value);
[peripheral readValueForCharacteristic:characteristic];
}
}else{
}
}
}
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
if (error) {
return;
}else{
}
NSLog(@"value = ========== %@",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 == %@",descriptor.value);
//
// }
//
//}
- (void)writeDataToUratWithKeyId:(UInt8)keyId moudleId:(UInt8)moudleId datavalue:(NSData *)dataValue
{
_dataValue = 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 == %@",[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
- 代码里面我一般不会写注释、因为这是我自己写的我能看得懂。
网友评论