蓝牙开发小结

1. 工程中导入CoreBluetooth.framework并在相关界面(建议写在父类,便于继承使用)import "CoreBluetooth/CoreBluetooth.h"。

2.初始化CBCentralManager并准备扫描周围蓝牙设备。初始化之后会检测设备是否打开了蓝牙服务:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central{

switch (central.state) {

case CBCentralManagerStateUnknown:

break;

case CBCentralManagerStateUnsupported:

NSLog(@"模拟器不支持蓝牙调试");

break;

case CBCentralManagerStateUnauthorized:

break;

case CBCentralManagerStatePoweredOff:

NSLog(@"蓝牙处于关闭状态");

[[NSNotificationCenter defaultCenter]postNotificationName:@"BluthooClose" object:nil];

break;

case CBCentralManagerStateResetting:

break;

case CBCentralManagerStatePoweredOn:

NSLog(@"蓝牙处于打开状态");

[[NSNotificationCenter defaultCenter]postNotificationName:@"BluthooOppen" object:nil];

break;

}}

3.当蓝牙处于正常打开状态,就可以开始搜索周边设备

{UIActivityIndicatorView * IndicatorView;

IndicatorView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];}//系统自带旋转小菊花

{[self.MyCentralManager stopScan];

[self.MyCentralManager scanForPeripheralsWithServices:nil options:nil];}每次扫描之前先确保扫描动作处于停止状态。

4.扫描到外设走代理方法,并添加到相关数组用于显示在界面

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

NSLog(@"能发现设备:%@----RSSI-%@---services---%@-----mac——Data---%@---peripheral---%@",peripheral.name,peripheral.RSSI,peripheral.services,advertisementData,peripheral.identifier);

BluetoothModel * bluetooth = [[BluetoothModel alloc]init];

bluetooth.advertisementData = advertisementData;

bluetooth.peripheral = peripheral;

if (YES){

if (self.dataArray.count == 0){

[self.dataArray addObject:bluetooth];

[self.Last_peripheral_arr addObject:peripheral];

}

else{

if (peripheral.name.length > 0) {

for(int i = 0;i < self.dataArray.count; i ++){

if (![self.Last_peripheral_arr containsObject:peripheral]){

[self.dataArray addObject:bluetooth];

[self.Last_peripheral_arr addObject:peripheral];

}

}

}

}

}

[[NSNotificationCenter defaultCenter]postNotificationName:@"reloadTable" object:nil];

}

5.接下来就是连接外设(这里需要注意的是:外设物理MAC地址需要硬件端工程师写在外设属性advertisementData中的kCBAdvDataManufacturerData字段中,用于之后的短线自动重连)。

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

BluetoothModel * bluetooth = [[BluetoothModel alloc]init];

bluetooth = self.dataArray[indexPath.row];

CBPeripheral * Peripheral = bluetooth.peripheral;

NSDictionary * Mac_data = bluetooth.advertisementData;

#pragma mark  Mark 外设的物理地址

NSLog(@"------连接的外设的Mac地址------%@",[Mac_data objectForKey:@"kCBAdvDataManufacturerData"]);

[UserDefaultManager SetLocalDataObject:[Mac_data objectForKey:@"kCBAdvDataManufacturerData"] key:BluetoothMac];

[self connectPeripheral:Peripheral];(指向父类中的方法---->[self.MyCentralManager connectPeripheral:peripheral options:nil];)

}

6.连接成功与否

#pragma mark 蓝牙连接设备成功与否的回调

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{

//    ALERT(@"连接成功");

[self.peripheral discoverServices:nil];

self.peripheral.delegate = self;

[[NSNotificationCenter defaultCenter]postNotificationName:@"Connected" object:nil];

[self cancelScan];

}

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error{

NSLog(@"-------连接失败----原因----%@",error);

/*--取消本地以保存的外设Mac地址--*/

[UserDefaultManager removeLocalDataForKey:BluetoothMac];

ALERT(NSLocalizedString(@"Bluetooth_connection_is_broken", nil));

}

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error

{

#pragma mark 蓝牙断开连接,是否重连

ALERT(NSLocalizedString(@"Bluetooth_connection_is_broken", nil));

}

7.连接成功之后,会搜索外设相关Service和与之对应的Characteristic

#pragma mark 寻找Characteristic找到Service后会调用下面的方法:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

{

NSLog(@"寻找到了服务");

NSArray *services = nil;

if (peripheral != self.peripheral) {

NSLog(@"Wrong Peripheral.\n");

return ;

}

if (error != nil) {

NSLog(@"Error %@\n", error);

return ;

}

services = [peripheral services];

if (!services || ![services count]) {

NSLog(@"No Services");

return ;

}

for (CBService *service in services) {

NSLog(@"service:%@",service.UUID);

NSString * str = [NSString stringWithFormat:@"%@",service.UUID];

[peripheral discoverCharacteristics:nil forService:service];

}

}

#pragma mark 找到Characteristic后读取数据,找到Characteristic后会调用下面的delegate方法:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

{

NSLog(@"characteristics:%@",[service characteristics]);

NSArray *characteristics = [service characteristics];

[SVProgressHUD showWithStatus:NSLocalizedString(@"The_connection_is_successful_please_wait...", nil)];

if (peripheral != self.peripheral) {

NSLog(@"Wrong Peripheral.\n");

return ;

}

if (error != nil) {

NSLog(@"Error %@\n", error);

return ;

}

{

for (CBCharacteristic * Characteristic in characteristics) {

NSLog(@"Characteristic.uuid----%@",Characteristic.UUID);

NSString * uuidStr = [NSString stringWithFormat:@"%@",Characteristic.UUID];

if ([uuidStr isEqualToString:@"FFE1"]) {

self.characteristic_read = Characteristic;

}else if ([uuidStr isEqualToString:@"FFE2"]){

self.characteristic_write = Characteristic;

}else if ([uuidStr isEqualToString:@"FFE4"]){

self.characteristic_powerNotify = Characteristic;

}

}

[self.peripheral setNotifyValue:YES forCharacteristic:self.characteristic_powerNotify];

[self.peripheral setNotifyValue:YES forCharacteristic:self.characteristic_read];

[self.peripheral setNotifyValue:YES forCharacteristic:self.characteristic_write];

#pragma mark 所有搜索,连接,寻找服务,找到characteristic通道的操作都已完成

/*---所有搜索,连接,寻找服务,找到characteristic通道的操作都已完成----*/

/*

做获取电量的操作

*/

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

unsigned char byte[] = {0xF8,0x01,0x00,0x02,0x01,0x00};//电量

NSData * theData = [NSData dataWithBytes:byte length:sizeof(byte)];

[self writeWithData:theData WithCharacteristic:self.characteristic_write];

});

}

}

8.向外设写入数据和获得会掉的方法

#pragma mark 向设备端写数据

//向设备写数据

- (void)writeWithData:(NSData *)data WithCharacteristic:(CBCharacteristic *)characterris{

}

#pragma mark 接收到设备端回调 处理数据,读到数据后会调用delegate方法:

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{

}

9.字节数据处理

{

unsigned char byte[] = {0xF8,0x02,0x00};//头字节

NSData *first_Data = [NSData dataWithBytes:byte length:sizeof(byte)];

NSMutableData * lastData = [NSMutableData dataWithData:first_Data];

int Link_Long = 16;//整个应用层数据长度,包括功能符和应用层数据长度两个字节

NSData *Link_Long_Data = [NSData dataWithBytes:&Link_Long length:sizeof(Byte)];

[lastData appendData:Link_Long_Data];

unsigned char byte2[] = {0x02};//功能标示字节-写入md5

NSData *theData = [NSData dataWithBytes:byte2 length:sizeof(byte2)];

int Application_Long = 16;//应用层的数据长度(md5码的长度)

NSData *Application_Long_data = [NSData dataWithBytes:&Application_Long length:sizeof(Byte)];

[lastData appendData:Application_Long_data];

[self writeWithData:lastData WithCharacteristic:self.characteristic_write];

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容