1. 什么是蓝牙 4.0 ?

  全新的蓝牙4.0技术并不是一种技术,而是由传统蓝牙,高速蓝牙和低功耗蓝牙合而为一。并且这三种蓝牙可以组合使用,也可以单独使用。其中,低功耗蓝牙即BLE是蓝牙4.0的核心规范。仅传统蓝牙是不需要App的,比如市面上大多数蓝牙耳机,只要连上电脑或者手机,在电脑或者手机设备上播放音乐,系统底层就可以通过传统蓝牙协议,将音频数据传到蓝牙音箱上播放。换句话说,就是传统蓝牙部分在App上不可控,在iOS上,更是连判断在设置中是否连接了传统蓝牙都办不到,iOS可控的部分只有BLE。如果想要实现像小米手环那样的功能,在手机上有来电和短信,或者其他软件信息提醒的时候,在你的蓝牙设备上也能接收到。那这个功能的实现需要用到ANCS(Apple Notification Center Service)。ANCS在可以看成一个超级权限,但却跟传统蓝牙工作在不同局域,一个是通知,一个是音频。具体的实现,我们都不得而知,这部分属于苹果系统的功能了。
  iOS蓝牙每次最多接收155字节的数据,安卓5.0以下最大接收20字节,5.0以上可以更改最大接收量,能达到500多字节

2. 蓝牙开发关键词

中心设备(central):就是用来扫描周围蓝牙硬件的设备,比如通过你手机的蓝牙来扫描并连接智能手环,这时候你的手机就是中心设备。
外设(peripheral):被扫描的设备。比如当你用手机的蓝牙扫描连接智能手环的时候,智能手环就是外设。
服务(services):外设广播和运行的时候会有服务,可以理解成一个功能模块,中心设备可以读取服务。外设可以有多个服务。
特征(characteristic):在服务中的一个单位,一个服务可以有多个特征,特征会有一个value,一般读写的数据就是这个value。

3. 实现iOS蓝牙中心设备

项目中自己可写个单例类来简易地封装下蓝牙相关代码,保证项目中只存在一个中心管理者,其它类只需调用相关方法即可

  1. 创建一个中心管理者
@property (nonatomic, strong) CBCentralManager *centralManager;// 创建中心设备管理器,会回调centralManagerDidUpdateState
self.centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
  1. 扫描外设
//两个参数为nil,默认扫描所有的外设,可以设置一些服务,进行过滤搜索[self.centralManager scanForPeripheralsWithServices:nil options:nil];
//扫描指定设备(注:要在后台进行扫描第一个参数必须不能为nil,设为nil时不会触发扫描到设备的回调,同时需外设广播出自己的SeviceUUID)
NSArray *services = @[[CBUUID UUIDWithString:kBleServiceID]];NSDictionary *dictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];[self.centralManager scanForPeripheralsWithServices:services options:dictionary];
  1. 当扫描到外设时,会触发以下代理方法
//这里默认扫到MI,主动连接,当然也可以手动触发连接
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{NSLog(@"扫描连接外设:%@ %@",peripheral.name,RSSI);if ([peripheral.name hasSuffix:@"MI"]) {//保存外设,并停止扫描,达到节电效果thePerpher = peripheral;[self.centralManager stopScan];//进行连接[self.centralManager connectPeripheral:peripheral options:nil];}
}
  1. 当连接到外设时,会调用以下代理方法
//连接外设成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{NSLog(@"连接外设成功!%@",peripheral.name);[peripheral setDelegate:self];//扫描服务[peripheral discoverServices:nil];
}//连接外设失败
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"连接到外设 失败!%@ %@",[peripheral name],[error localizedDescription]);
}
  1. 当扫描到外设服务时,会调用以下代理方法,然后继续扫描对应服务的特征
//扫描到服务
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{if (error){NSLog(@"扫描外设服务出错:%@-> %@", peripheral.name, [error localizedDescription]);return;}NSLog(@"扫描到外设服务:%@ -> %@",peripheral.name,peripheral.services);for (CBService *service in peripheral.services) {[peripheral discoverCharacteristics:nil forService:service];}NSLog(@"开始扫描外设服务的特征 %@...",peripheral.name);
}
  1. 当扫描到服务的特征时,会调用以下代理方法
//扫描到特征
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{if (error){NSLog(@"扫描外设的特征失败!%@->%@-> %@",peripheral.name,service.UUID, [error localizedDescription]);return;}NSLog(@"扫描到外设服务特征有:%@->%@->%@",peripheral.name,service.UUID,service.characteristics);//获取Characteristic的值for (CBCharacteristic *characteristic in service.characteristics){//这里需要订阅特征的通知,否则无法收到外设发送过来的数据[peripheral setNotifyValue:YES forCharacteristic:characteristic];//当我们定义好每个特征是干什么用的,我们需要读取这个特征的值,当特征值更新了会调用//- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error方法//需要说明的是UUID是硬件定义好给你,如果硬件也是个新手,那你可以先打印出所有的UUID,找出有用的[peripheral readValueForCharacteristic:characteristic];}
}
  1. 当接收到数据和读取到数据时,会调用以下代理方法
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error
{if (error) {NSLog(@"读取数据失败!%@-> %@",peripheral.name, [error localizedDescription]);return;}NSLog(@"%@ %@",characteristic.UUID.UUIDString,characteristic.value);
}
  1. 发送数据
//最后一个参数,可能有两种,如果你的程序出现连接正常,而你确定执行了写数据的函数,但是硬件确实没有反应,那很有可能是你的CBCharacteristicWriteType不对,需要使用另一种,一共是两种CBCharacteristicWriteWithResponse和CBCharacteristicWriteWithoutResponse
[thePerpher writeValue:itemData forCharacteristic:theCharacteristic type:CBCharacteristicWriteWithoutResponse];
  1. 断开蓝牙
[self.centralManager cancelPeripheralConnection: thePerpher];//蓝牙断开后会调用以下代理方法
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
}
  1. -retrieveConnectedPeripheralsWithServices:根据指定的服务,找到当前系统处于连接状态的蓝牙中包含这个服务的所有蓝牙对象
NSArray *devices = [self.centralManager retrieveConnectedPeripheralsWithServices:@[[CBUUID UUIDWithString:kBleShortServiceID],[CBUUID UUIDWithString:kBleServiceID]]];

iOS 蓝牙4.0开发相关推荐

  1. iOS 蓝牙4.0开发使用(内附Demo)

    一: 介绍 近几年,智能设备越来越火,这些智能设备中,有很大一部分是通过手机来控制硬件设备,来达到预期的效果,这中间少不了要使用到蓝牙功能,通过蓝牙来通信来控制设备. 蓝牙分为蓝牙2.0和蓝牙4.0. ...

  2. iOS 蓝牙 4.0 开发

    随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低.从iOS的发展史也不难看出 ...

  3. iOS蓝牙4.0开发例子

    1建立中心角色 1 2 3 #import <CoreBluetooth/CoreBluetooth.h>  CBCentralManager *manager;  manager = [ ...

  4. iOS蓝牙BLE4.0通信功能

    概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...

  5. iOS开发之蓝牙4.0开发使用

    转载自https://www.jianshu.com/p/f0e4b0e98336 2015年的时候自己写过一个蓝牙4.0项目,当忘了写博客,最近看到这篇博客写的挺详细,所以转载一下 一: 介绍 蓝牙 ...

  6. IOS蓝牙4.0与读卡器通讯

    IOS学习也一段时间了,该上点干货了.前段时间研究了一下IOS蓝牙通讯相关的东西,把研究的一个成果给大家分享一下. 一 项目背景 简单介绍一下做的东西,设备是一个金融刷卡器,通过蓝牙与iphone手机 ...

  7. Android BLE蓝牙4.0开发 实现扫描、连接、通讯、获取通知、特性等 (一、打开蓝牙 进行扫描)

    目录 首先说下蓝牙4.0 目前android蓝牙有2种: ble蓝牙开发流程: 1.首先当然是进行权限申请啦: 2.获取蓝牙适配器 BluetoothAdapter 3.打开蓝牙 4.关闭蓝牙 5.在 ...

  8. Android BLE蓝牙4.0开发详解

    这篇博客主要讲解 蓝牙 BLE 的用法.在讲解之前先讲一些概念性的东西,对于之前没接触过蓝牙开发,现在手上又有个蓝牙BLE项目需要做的人,先看下这些概念还是很重要的.因为我之前就是这样,之前没有接触过 ...

  9. Android蓝牙4.0开发及发送指令到蓝牙硬件设备,简单好用,方法已写好直接可用

    近日,接到需要用到蓝牙解锁硬件设备的新需求,开发过程中呢也遇到许多硬件的坑,开发协议文档较简单,几句话就完了,第一次搞得我自己一脸懵逼,本来一两个小时就能写完并测试完成的过程用了两三天.哎!默默地回到 ...

最新文章

  1. 【转载】JDBC连接各种数据库的字符串
  2. 【转】PHP获取重定向URL的几种方法
  3. map/set/multi_map/multi_set/unorder_map/unorder_set总结
  4. LeetCode 135. 分发糖果(DP)
  5. 关于Paralle.For和Paralle.ForEach
  6. 三维点云学习(4)3-Model Fitting Least Square
  7. Cocos2d-JS特效
  8. axios基于常见业务场景的二次封装
  9. c语言编写面条排序算法,腾讯PCG事业部腾讯视频面经
  10. 大数据、智慧城市与智慧交通 (全集)
  11. ass字幕导入Premiere的另一种思路 用ffmpeg把ass转换成颜色通道和透明度通道两个视频
  12. 三种工厂模式详解-简单工厂模式、工厂模式、抽象工厂模式
  13. java语言将一个字符串集合按GBK编码(简体中文按拼音顺序)排序
  14. Wex5 app 学习笔记(二)
  15. 计算机专业就业崩溃,计算机专业就业“遇冷说”引发争议
  16. 化工原理计算机辅助设计,化工原理课程设计心得三篇
  17. 计算机考研abc区划分,考研abc区有什么区别
  18. 如何在Nintendo 64控制器上更换磨损的模拟棒
  19. Metasploit 渗透测试手册第三版 第三章 服务端漏洞利用(翻译)
  20. [统计学教程] 第七章 假设检验

热门文章

  1. 现在做亚马逊测评容易吗?测评存在哪些问题?如何解决测评问题
  2. python中的eval()方法
  3. 编程入门之日志聚合系统
  4. erase函数的使用(简便易懂)(有图)
  5. 网络推广用的数据分析工具
  6. UFIDA KSOA实施检查工具V1.0
  7. Spark DAGScheduler源码分析系列之一: 基础
  8. sqlsever2019:数据库创建和数据表的内容查看
  9. Mucosal Immunology | 胃肠道内的NADPH氧化酶类和活性氧信号通路
  10. Java笔记 @__性感六2ki9