iOS 蓝牙的原理及简单应用
https://www.jianshu.com/p/e7df216f9e5e
被连接的设备叫外设Peripheral;发起连接的叫cental;
BLE蓝牙的角色有以下几种:广播者(Advertise)、扫描者(Scanner)、从设备(Slave)、主设备(Master)、发起者(Initiator),其中主设备是由发起者、扫描者转化而来,从设备则是由广播者转化而来;蓝牙模块通信是指两个蓝牙模块或蓝牙设备之间进行通信,进行数据通信的双方一个是主机,一个是从机。
主设备模式:工作在主设备模式,可以与一个从设备进行连接。在此模式下可以对周围设备进行搜索并选择需要连接的从设备进行连接。理论上,一个蓝牙主端设备,可同时与7个蓝牙从端设备进行通讯。一个具备蓝牙通讯功能的设备, 可以在两个角色间切换,平时工作在从模式,等待其它主设备来连接,需要时,转换为主模式,向其它设备发起呼叫。一个蓝牙设备以主模式发起呼叫时,需要知道对方的蓝牙地址,配对密码等信息,配对完成后,可直接发起呼叫。
从设备模式:工作在从机模式下的蓝牙模块只能被主机搜索,不能主动搜索。从设备跟主机连接以后,也可以和主机设备进行发送和接收数据。
主模式与从模式的区别:主机是指能够搜索别人并主动建立连接的一方,从机则不能主动建立连接,只能等别人连接自己。
目前市场上影响力最大的三种无线技术,蓝牙,WIFI和Zigbee。从上图可以看出,蓝牙的传输距离是最短的,功耗是高于Zigbee,低于WIFI。传输距离最短,只有2-10米,当然这是传统蓝牙,传输速度能达到3Mbps。全新的蓝牙4.0技术并不是一种技术,而是由传统蓝牙,高速蓝牙和低功耗蓝牙合而为一。并且这三种蓝牙可以组合使用,也可以单独使用。其中,低功耗蓝牙即BLE是蓝牙4.0的核心规范。
服务和特征都有UUID属性;
#import "ViewController.h"
#import <CoreBluetooth/CoreBluetooth.h>
@interface ViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate>
/** 中央管理者*/
@property (nonatomic,strong) CBCentralManager *manager;
/** 发现的外围设备数据*/
@property (nonatomic,strong) NSMutableArray *peripheralData;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
/**
1. 创建中央管理者
2. 扫描外围设备
3. 连接外围设备
4. 扫描服务和特性
5. 利用特性做数据的读写操作
6. 断开连接
*/
//0. 初始化数组
self.peripheralData = [NSMutableArrayarray];
//1. 创建中央管理者
//Delegate: 代理
//queue : 队列如果传nil,就是主队列
self.manager = [[CBCentralManageralloc] initWithDelegate:selfqueue:nil];
//2. 扫描外围设备
//scan: 扫描
//Peripheral: 外设
//Services: 服务的UUID如果传nil,代表扫描所有的服务
[self.managerscanForPeripheralsWithServices:niloptions:nil];
}
/**
3. 当发现外围设备的时候会调用方法
peripheral: 外设
advertisementData: 数据
RSSI : 信号强度
*/
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
{
//当扫描到的时候,我们需要数组保存,然后创建tableView给用户显示,让用户来选择连接哪一个设备
// 又可能扫描到重复的设备,需要去重
if (![self.peripheralDatacontainsObject:peripheral]) {
[self.peripheralDataaddObject:peripheral];
}
}
/**
4. 将来需要选中tableViewCell的某一行,来连接外设
用下面的方法connectPeripheral模拟tableViewCell选中的方法
*/
- (void)connectPeripheral:(CBPeripheral *)peripheral
{
// 连接外围设备
[self.managerconnectPeripheral:peripheraloptions:nil];
}
/**
5. 当连接到外围设备时调用的代理方法
*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
//5.1 设置外设的代理
peripheral.delegate =self;
//5.2 用外设来扫描服务(传如UUID数组NSArray<CBUUID *> *)serviceUUIDs)如果不传,代表扫描所有服务
[peripheral discoverServices:nil];
}
/**
6. 当扫描到服务的时候,此代理方法会调用
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
//找到指定服务UUID,然后去扫描此服务的特性
//services: 当扫描到服务时,所有的服务会存在在外设的services属性中
for (CBService *servicein peripheral.services) {
//将来服务和特征的UUID,都在蓝牙厂商提供的文档中
// 假设服务的UUID为 123456
if ([service.UUID.UUIDStringisEqualToString:@"123456"]) {
//扫描此服务的特性
//Characteristics: 特征
//如果特征传nil,代表扫描所有特征
[peripheral discoverCharacteristics:nilforService:service];
}
}
}
/**
7. 扫描到某个服务的某个特征时,会调用的代理方法
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
//找到指定特征的UUID,然后就可以做数据交互了
//characteristics: 当扫描到特征时,所有的特征会存在在服务的characteristics属性中
for (CBCharacteristic *characteristicin service.characteristics) {
// 假设特征的UUID为 654321
if ([characteristic.UUID.UUIDStringisEqualToString:@"654321"]) {
NSData *data=[NSDatadataWithContentsOfFile:@""];
// 在这里进行写操作,写数据到特征中
[peripheral writeValue:dataforCharacteristic:characteristictype:CBCharacteristicWriteWithResponse];
//从特征中读取数据
[peripheral readValueForCharacteristic:characteristic];
//处理蓝牙发过来的数据
//不过更好的办法是设置事件通知实时获取读取到的数据。设置了这个方法,会调用代理方法- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{}
[peripheral setNotifyValue:YESforCharacteristic:characteristic];
}
}
}
///获取外设发来的数据,不论是read和notify,获取数据都是从这个方法中读取。
-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
}
//向特征中写入数据后调用
-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
}
//管理中心读取外设发来的实时数据(在前面设置了setNotifyValue:forCharacteristic:这个方法发送通知。会调用下面这个方法)
- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
}
/**
8. 断开连接
*/
- (void)viewWillDisappear:(BOOL)animated
{
[superviewWillDisappear:animated];
// 停止扫描
[self.managerstopScan];
}
#pragma mark 必须实现的代理方法
//中央管理器的状态改变时调用(也就是蓝牙开或者关的状态发生改变);
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
NSLog(@"state: %zd", central.state);
switch (central.state) {
caseCBCentralManagerStatePoweredOn:
{
//蓝牙开启状态
//扫描外设
[_managerscanForPeripheralsWithServices:@[[CBUUIDUUIDWithString:@"FF15"]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey :@YES }];//@[[CBUUID UUIDWithString:@"FF15"]]是为了过滤掉其他设备,可以搜索特定标示的设备
}
break;
caseCBCentralManagerStatePoweredOff:
//蓝牙关闭状态
break;
default:
break;
}
}
//蓝牙链接失败时调用
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
}
//蓝牙断开链接时调用
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
}
//在和硬件之间的数据发送和接受,用的都是byte数组。
Byte byte[] = {7};
[_peripheral writeValue:[NSData dataWithBytes:byte length:1] forCharacteristic:_writeCharacteristic type:CBCharacteristicWriteWithoutResponse];//向特征中写入数据
NSData dataWithBytes:byte length:1] forCharacteristic:_writeCharacteristic type:CBCharacteristicWriteWithoutResponse];//向特征中写入数据
NSData * data = characteristic.value;Byte * resultByte = (Byte *)[data bytes];
end
iOS 蓝牙的原理及简单应用相关推荐
- iOS蓝牙原生封装,助力智能硬件开发
代码地址如下: http://www.demodashi.com/demo/12010.html 人工智能自1956年提出以来,一直默默无闻,近年来人工智能的发展得到重视逐渐发展起步,智能硬件.智能手 ...
- iOS蓝牙BLE4.0通信功能
概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...
- iOS 蓝牙开发 BabyBluetooth蓝牙库介绍
BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容iOS和Mac OS X. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮 ...
- iOS应⽤签名原理浅析
目录 1. 前文 2. 数字签名 3. 简单代码签名 4. 双层代码签名 5. 描述文件 6. 结束语 1. 前文 还记得刚开始开发iOS APP的时候,总是在真机调试这块弄的云里雾里的,什么证书,什 ...
- 今日分享-ios蓝牙
1. ios蓝牙库的基本介绍-CoreBluetooth 2. CoreBluetooth使用详解 3. 相关问题 1. ios蓝牙库的基本介绍-CoreBluetooth 首先熟悉相关名词:Cent ...
- iOS - 蓝牙开门智能门锁
蓝牙的实现原理网上很多 在此就不一一描述了 有需要的可以看以下的文章学习 在ios 的开发中iBeacon和BLE的区别 iBeacon介绍 iOS蓝牙空中升级(固件升级) 本文主要是写实现过程: g ...
- ios 蓝牙开发总结
随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低.从iOS的发展史也不难看出 ...
- iOS蓝牙学习(一)
最近在学蓝牙开发,就去网上收集了一些文章看,自己做了一个总结,下面就分享出来. 前提: iOS蓝牙开发使用的API是:Core Bluetooth 正常情况下需要两台真实的蓝牙4.0设备(当然也可以使 ...
- iOS 蓝牙 4.0 开发
随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低.从iOS的发展史也不难看出 ...
最新文章
- 第五次作业 何雅
- 韩信点兵-中国剩余定理(练习)
- Spring AOP源码分析(七)ProxyFactoryBean介绍
- 使用Lightbox制作照片条
- InnoDB引擎与MyIASM的一点总结
- tomcat配置及遇到的问题
- Java- Math类
- POJ2456-Aggressive cows
- React 18 超全升级指南
- git 找到冲突_git怎么知道哪个文件冲突
- 基于C++和opengl实现太阳系动画演示系统 课程论文+项目源码
- 考过HCIP入职心仪公司,分享华为认证学习经历及心得
- 贝叶斯统计为什么优于频率统计?
- P1053 [NOIP2005 提高组] 篝火晚会
- led灯条维修_LED灯坏了怎么维修?学会自己动手,简单的LED故障自己也能维修
- 【SQL】通过SQL 语句创建学生信息表(学号、学生姓名、班级)、学习成绩表(学号、学科、成绩)
- 摄氏度符号英文计算机语言,英文文章里摄氏度符号打法
- 开启ylmf desktop ubuntu的pae支持
- linux libzip的编译安装
- 中国49城市智慧程度排行榜:新一线城市武汉和杭州靠前
热门文章
- python 中文乱码 问题深入分析
- c语言对数组求秩,怎样用C语言求矩阵的秩
- python 生意参谋_如何爬取生意参谋数据?是不是违规操作?
- FreeBSD安装软件
- 拼多多如何提高大促报名通过率?
- 南京邮电大学电工电子(数电)实验报告——计数器 移位寄存器
- python气象数据可视化学习笔记7——利用cartopy+cnmaps和ERA5数据绘制填色图并对中国地区白化
- docker部署excalidraw画图工具
- 2022 ICPC 亚洲区域赛(杭州)赛后总结
- win7备份工具_利用大白菜U盘启动工具制作系统安装工具,小白学会就成高手了