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 ...
随机推荐
- Python转义字符&字符串运算符
Python转义字符 在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符.如下表: 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a ...
- t-sql对被除数为0&除数小于被除数结果为0&除法保留2位小数的处理
SELECT round(CAST(12 AS FLOAT)/nullif(13,0),2,1) FROM TB
- ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常
在ASP.NET MVC中,通过应用程序生命周期中的Application_Error事件可以捕获到网站引发的所有未处理异常.本文作为学习笔记,记录了使用Global.asax文件的Applicati ...
- Maven项目配置logback
首先,在pom.xml中加入maven依赖 <!-- log start --> <dependency> <groupId>org.slf4j</group ...
- JSR
JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求.任何人 ...
- mysql 案例 ~超时时间设置
一 简介:今天咱们来谈谈mysql的连接时间与会话关系二 分类 mysql会话分类 1 程序连接session(最主要的) 2 binlog连接session(复制+canal消费) 3 ro ...
- Android插件化技术简介
https://blog.csdn.net/io_field/article/details/79084630 可以通过反射 事先定义统一接口的方式,访问插件中的类和方法 还可以在AndroidMan ...
- 【转载】使用python库--Graphviz为论文画出漂亮的示意图
原文: Drawing Graphs using Dot and Graphviz 1 License Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018 ...
- JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
https://blog.csdn.net/u012882327/article/details/69525166
- windows系统下简单nodejs安装及环境配置
相信对于很多关注javascript发展的同学来说,nodejs已经不是一个陌生的词眼,这里不想谈太多的nodejs的相关信息.只说一下,windows系统下简单nodejs环境配置 相信 ...