ios蓝牙详解
最近这段时间在研究蓝牙,也研究了一段时间了现在在下面做个总结
1 其实蓝牙连接只要明白了整体原理,其实挺简单的
2 大部分情况下,手机作为中心管理者,而连接的设备被称为外设,外设的结构有点像一颗大树,外设我把它看成是大叔的树干,然后由树干向上生成生成许多树干分支,这些分支就是服务,分支上面在分的小分支就是特征,而小树枝上面的职业可以看成是特征的描述。
3 然后就需要知道哪根树枝为你服务了,苹果取名字为服务,那就是为你服务的,所以你需要知道是哪跟树枝为你服务
知道了哪根树枝之后就需要分析这根树枝上的小枝干到底是是些什么功能,其实这些小枝干就是所谓的"特征"
然后根据硬件工程师提供的UUID 记录下可以读取信息的特征,对这个特征监听它的值的变化。
4 同样的根据硬件工程师提供的UUID 记录下可以写入信息额特征,方便后期对特征进行数据命令写入来操作蓝牙设备。蓝牙大体就这样一个流程了,下面说下代码如何一步一步实现上述过程
1. 首先是想要导入蓝牙需要的头文件 CoreBluetooth
然后实例化中心管理者
self.manger=[[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
中心管理者实例化了会自动触发监测蓝牙状态的代理
/*
CBManagerStateUnknown = 0,
CBManagerStateResetting,
CBManagerStateUnsupported,
CBManagerStateUnauthorized,
CBManagerStatePoweredOff,
CBManagerStatePoweredOn,
监测蓝牙状态
*/
-(void)centralManagerDidUpdateState:(CBCentralManager *)central{
switch (central.state) {
case CBManagerStatePoweredOn:
{
NSLog(@"蓝牙已开启");
[self.manger scanForPeripheralsWithServices:nil options:nil];
}
break;
case CBManagerStatePoweredOff:{ }
break;
default:
break;
}
}
在蓝牙开启的情况下去扫描周围的蓝牙设备 然后扫描到了设备会调用到下面的方法
#pragma mark 扫描 发现周围设备
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{
NSLog(@"%@===%ld",peripheral.name,(long)peripheral.state);
//发现需要的设备 进行蓝牙连接
if ([peripheral.name rangeOfString:@"BP826"].length!=) {
self.pheral=peripheral;
[self.manger connectPeripheral:peripheral options:nil];
[central stopScan];
} }
找到对应的蓝牙设备进行蓝牙连接 成功、失败、断开连接会有下面回调
#pragma mark 连接成功对应设备
-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
// self.pheral=peripheral;
peripheral.delegate=self; [peripheral discoverServices:nil]; NSLog(@"连接上了对应的设备");
}
#pragma mark 断开连接
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{ }
#pragma mark 连接失败 失败
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{ }
成功连接上外设之后就是去发现外设里面的服务 [peripheral discoverServices:nil];
然后发现服务会调用下面的方法 找到你需要的那个服务,然后再去发现你的那个服务中的特征
#pragma mark 发现服务
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
for (CBService *service in peripheral.services) {
if ([service.UUID.UUIDString isEqualToString:kSERVICEUUID]) {
[peripheral discoverCharacteristics:nil forService:service];
}
}
}
然后就回去寻找服务中的特征 然后根据硬件提供给你的读取或者写入的特征ID去找到对应的特征 然后记录下来
并对读取的特征进行特征值变化的监听
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error{
for (CBCharacteristic *character in service.characteristics) {
if ([character.UUID.UUIDString isEqualToString:kread_UUID]) {
self.readCharacter=character;
//开启特征值变化监听 值变化了会调用 peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
[peripheral setNotifyValue:YES forCharacteristic:character];
}
if ([character.UUID.UUIDString isEqualToString:kwrite_UUID]) {
self.writeCharater=character;
}
}
}
然后特征值发生变化了会调用到下面的方法
#pragma mark 特征值发生变化
-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
NSLog(@"%@",characteristic.value);
}
如果你想对硬件操作 那么你需要给写入的那个特征写入值 需要调用
[self.pheral writeValue:[self convertHexStrToData:@"A0A0A0A0A0A0A0"] forCharacteristic:self.writeCharater type:CBCharacteristicWriteWithResponse]; //字符串命令装换成NSData类型
- (NSData *)convertHexStrToData:(NSString *)str {
if (!str || [str length] == ) {
return nil;
} NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:];
NSRange range;
if ([str length] % == ) {
range = NSMakeRange(, );
} else {
range = NSMakeRange(, );
}
for (NSInteger i = range.location; i < [str length]; i += ) {
unsigned int anInt;
NSString *hexCharStr = [str substringWithRange:range];
NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr]; [scanner scanHexInt:&anInt];
NSData *entity = [[NSData alloc] initWithBytes:&anInt length:];
[hexData appendData:entity]; range.location += range.length;
range.length = ;
}
return hexData;
}
到此为止整个蓝牙设备基础的功能就列举完了 这也是自己这段时间研究小小的成果吧 fighting!
ios蓝牙详解的更多相关文章
- 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)
转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...
- IOS SDK详解
来源:http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html?page=1#42803301 博客专栏>移动开发专栏>I ...
- iOS路由详解
本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...
- IOS 手势详解
在IOS中手势可以让用户有很好的体验,因此我们有必要去了解一下手势. (在设置手势是有很多值得注意的地方) *是需要设置为Yes的点击无法响应* *要把手势添加到所需点击的View,否则无法响应* 手 ...
- IOS SizeClasses 详解
SizeClasses 详解 iOS 8在应用界面的可视化设计上添加了一个新的特性-Size Classes.对于任何设备来说,界面的宽度和高度都只分为三种描述:紧凑,任意和宽松.这样开发者便可以无视 ...
- iOS模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.
Write in the first[写在最前] 对于从事 iOS 开发人员来说,当提到 ** runtime时,我想都可以说出来 「runtime 运行时」和基本使用的方法.相信很多开发者跟我当初一 ...
- iOS 模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.
引导 Copyright © PBwaterln Unauthorized shall not be *copy reprinted* . 对于从事 iOS 开发人员来说,所有的人都会答出「runti ...
- ios学习--详解IPhone动画效果类型及实现方法
详解IPhone动画效果类型及实现方法是本文要介绍的内容,主要介绍了iphone中动画的实现方法,不多说,我们一起来看内容. 实现iphone漂亮的动画效果主要有两种方法,一种是UIView层面的,一 ...
- iOS中 蓝牙2.0详解/ios蓝牙设备详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 整体布局如下: 程序结构如右图: 每日更新关注:http://weibo.com/hanjunqiang ...
随机推荐
- CSS面试复习(一):HTML强化
1. HTML常见元素和理解 head类 meta:字符集.base:路径. a[href,target] img[src,alt] table td[colspan,rowspan] form[ta ...
- 查看linux服务器CPU相关
查看linux服务器CPU相关: 1.查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 2.查看 ...
- 【移动端】解决fixed定位闪动问题
经常我们会把导航按钮固定在页面的最底部位置,比如饿了么的首页 但是导航栏在页面滚动的时候会不断的闪动,这样的用户体验非常不好,那么可以使用下面的CSS样式处理一下 transform: transla ...
- jq中的事件委托:closest,parent,parents,delegate
closest .closest(selector) 从当前元素开始沿 DOM 树向上,获得匹配第一个符合选择器的祖先元素,返回零个或一个元素的 jQuery 对象. .parents() 和 .cl ...
- Python 17 web框架&Django
本节内容 1.html里面的正则表达式 2.web样式简介 3.Django创建工程 Html里的正则表达式 test 用来判断字符串是否符合规定的正则 rep.test('....') ...
- python作业高级FTP
转载自:https://www.cnblogs.com/sean-yao/p/7882638.html 作业需求: 1. 用户加密认证 2. 多用户同时登陆 3. 每个用户有自己的家目录且只能访问自己 ...
- 配置中文分词器 IK-Analyzer-Solr7
先下载solr7版本的ik分词器,下载地址:http://search.maven.org/#search%7Cga%7C1%7Ccom.github.magese分词器GitHub源码地址:http ...
- Workbook导出excel封装的工具类
在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...
- 题解-ZJOI2015地震后的幻想乡
Problem bzoj & 洛谷 题意简述:给定一个\(n\)(\(n\leq 10\))个点\(m\)条边的无向图,每条边的权值为一个\(0\)到\(1\)之间的连续随机变量,求图的最小生 ...
- 关于apache配置映射端口
step1.打开httpd.conf找到Listen 80这一行在后面添加Listen 8080Listen 8001Listen 8002Listen 8003也就是意味着每个项目占用一个端口,就像 ...