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

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

一.项目简介

简单介绍一下我们的项目,我们是做一个将手机作为中心去扫描外设(蓝牙铃铛),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 的商业操作系统。

    89 引用 • 150 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Android

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

    336 引用 • 324 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • NetBeans

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

    78 引用 • 102 回帖 • 705 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 648 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 519 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 597 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 3 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    412 引用 • 3588 回帖
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 655 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 229 关注
  • V2Ray
    1 引用 • 15 回帖 • 3 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 3 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 654 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 438 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 85 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    53 引用 • 190 回帖
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 579 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 539 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 242 回帖
  • 星云链

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

    3 引用 • 16 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 3 关注
  • CSDN

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

    14 引用 • 155 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • OneDrive
    2 引用 • 3 关注