iOS 开发 ------ Bluetooth 4.0 开发

本贴最后更新于 2387 天前,其中的信息可能已经事过境迁

一.项目简介

简单介绍一下我们的项目,我们是做一个将手机作为中心去扫描外设(蓝牙铃铛),APP通过各种指令控制蓝牙铃铛做出一些操作,框架用的是苹果提供的CoreBluetooth(基于蓝牙4.0,iOS6.0以上).其中该框架最重要的是外设peripheral和中心central,在我们这手机就是central(中心),而需要连接的铃铛就是peripheral(外设),行了,直接上代码吧!

二.代码部分(自己封装的一个蓝牙管理类,重要的代码)
因为,蓝牙可能不止一个界面用到,所以我在此将它写成了一个单例.

// 蓝牙主要就是读写操作,需要蓝牙那边告知不同的UUID #import "ACHLBluetooth.h" #import <CoreBluetooth/CoreBluetooth.h> #define ST_CAHRACTERISTIC @"xxxx"//读取数据ID #define WT_CAHRACTERISTIC @"xxxx"//写入数据ID #define SERVICE_UUID @"0000xxxx-0000-1000-8000-00805f9b34fb" // 服务uuid @interface ACHLBluetooth () <CBCentralManagerDelegate,CBPeripheralDelegate> @property (nonatomic, strong) CBCentralManager *centralMgr; // 中心 @property (nonatomic, strong) CBCharacteristic *writeCharacteristic; @end static ACHLBluetooth *blueManager = nil;

初始化,设置代理

blueManager.centralMgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

判断是否开启蓝牙

#pragma mark ------ CBCentralManager代理方法 ------- // 检查蓝牙是否可用 - (void)centralManagerDidUpdateState:(CBCentralManager *)central { NSLog(@"检查蓝牙是否可用"); switch (central.state) { case CBCentralManagerStatePoweredOn: // 可用,扫描所有的外设 [self scanDevice]; break; case CBCentralManagerStatePoweredOff: NSLog(@"蓝牙关闭了"); break; default: break; } } // 扫描蓝牙 - (void)scanDevice { [blueManager.centralMgr scanForPeripheralsWithServices:nil options:nil]; }

扫描到的外设(centralManager 的代理方法)

// 扫描外设连接 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI { NSLog(@"扫描到%@的外设---%@",peripheral,advertisementData); // 用1或2方法 // 1.通过通知(代理,block等)传到外面在外面连接 // [[NSNotificationCenter defaultCenter] postNotificationName:@"scanedDevice" object:nil userInfo:@{@"central":central,@"advertisementData":advertisementData,@"peripheral":peripheral}]; //2.找到需要的蓝牙设备,停止搜素,保存数据(本页面连接) // if([[peripheral.identifier UUIDString] isEqualToString:IDENTIFIER]){ // NSLog(@"扫描到名字为%@的蓝牙并开始连接",peripheral.name); // // blueManager.discoveredPeripheral = peripheral; // 连接蓝牙 // [blueManager.centralMgr connectPeripheral:peripheral options:nil]; // // }else{ // // NSLog(@"未扫描到蓝牙"); // } }

连接断开,成功,失败

//连接成功 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { NSLog(@"蓝牙连接成功"); // 停止扫描 [blueManager.centralMgr stopScan]; if (self.delegate && [self.delegate respondsToSelector:@selector(connectSuccess)]) { [self.delegate connectSuccess]; } // 设置服务代理 [blueManager.discoveredPeripheral setDelegate:self]; [blueManager.discoveredPeripheral discoverServices:nil]; } // 连接失败 - (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"蓝牙连接失败"); // 通过代理传出去提示用户 if (self.delegate && [self.delegate respondsToSelector:@selector(connectError:)]) { [self.delegate connectError:error]; } } // 断开连接了 - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error { NSLog(@"连接断开"); // 记得提示用户 blueManager.discoveredPeripheral = nil; }

------- CBPeripheral 代理方法 ---------

//获取服务后的回调 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { if (error) { NSLog(@"didDiscoverServices : %@", [error localizedDescription]); return; } for (CBService *s in peripheral.services) { [s.peripheral discoverCharacteristics:nil forService:s]; } } //获取特征后的回调 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{ if (error) { NSLog(@"获取服务特征出错: %@", [error localizedDescription]); return; } for (CBCharacteristic *c in service.characteristics) { // NSLog(@"-=-=-=--=-=-=%@",c.UUID.UUIDString); if ([c.UUID.UUIDString isEqualToString:ST_CAHRACTERISTIC]) { // 这里记得开启通知 [peripheral setNotifyValue:YES forCharacteristic:c]; } else if ([c.UUID.UUIDString isEqualToString:WT_CAHRACTERISTIC]) { blueManager.writeCharacteristic = c; }else if ([c.UUID.UUIDString isEqualToString:GET_VERSION]) { // 开启通知 [peripheral setNotifyValue:YES forCharacteristic:c]; } } } //订阅的特征值有新的数据时回调 - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if (error) { NSLog(@"Error changing notification state: %@", [error localizedDescription]); } [peripheral readValueForCharacteristic:characteristic]; } // 特征值更新时回调 - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { NSLog(@"获取新的特征值了"); if (error) { NSLog(@"获取新特征值时出错"); return; } // 在这里根据不同的uuid 去做操作 if ([characteristic.UUID.UUIDString isEqualToString:ST_CAHRACTERISTIC]) { NSLog(@"外设返回的数据为%@",characteristic.value); //转为字符串 NSMutableString *strTemp = [NSMutableString stringWithCapacity:[characteristic.value length]*2]; const unsigned char *szBuffer = [characteristic.value bytes]; for (NSInteger i=0; i < [characteristic.value length]; ++i) { [strTemp appendFormat:@"%02lx",(unsigned long)szBuffer[i]]; // 根据自己需求处理strTemp.... } // 写入数据时回调 - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error { if (error) { NSLog(@"写入数据出错"); return; } else { NSLog(@"恭喜你写入数据成功!"); } }

用户主动断开连接

// 断开连接 - (void)disconnect { [blueManager.centralMgr cancelPeripheralConnection:blueManager.discoveredPeripheral]; blueManager.discoveredPeripheral = nil; }

写入数据

// 写入数据 - (void)writeWithString:(NSString *)string { // -----这个得看蓝牙那边,我在这写的只是我们这边的,并不适用所有. int length =(int)string.length / 2 ; SignedByte bytes[length]; for (int i=0; i<length;i++) { int j=i*2; NSString *tmp=[string substringWithRange:NSMakeRange(j, 2)]; unsigned int anInt; NSScanner * scanner = [[NSScanner alloc] initWithString:tmp]; [scanner scanHexInt:&anInt]; bytes[i] = anInt; } //----- NSData *writeData = [NSData dataWithBytes:bytes length:length]; if (blueManager.writeCharacteristic.properties & CBCharacteristicPropertyWrite) { [blueManager.discoveredPeripheral writeValue:writeData forCharacteristic:blueManager.writeCharacteristic type:CBCharacteristicWriteWithResponse]; } else { NSLog(@"不可写"); } }
  • 蓝牙
    10 引用 • 10 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    88 引用 • 139 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 390 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖 • 2 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 247 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 81 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 701 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 440 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 115 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 2 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 266 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 547 关注
  • CodeMirror
    2 引用 • 17 回帖 • 161 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 33 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖 • 1 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 114 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 542 回帖 • 1 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 4 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 4 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 317 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖