iOS蓝牙交互(4.0)
- 前期准备工作:查看coreBlueTooth框架,查看一些蓝牙名词:Central(中心设备)、Peripheral(外围设备)、advertisementData(广播数据)、-RSSI: 信号强弱值、Services(服务)、Characteristic(特征);
- 实例化对象以及遵守代理
.1设置对象
    @property (strong, nonatomic) CBCentralManager *CBManager;
    @property (strong, nonatomic) CBPeripheral *peripheral;
             遵守对应的代理:CBCentralManagerDelegate,CBPeripheralDelegate
    .2实例化中心设备
    //options 后代表的是是否开启alert提示
    self.CBManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{@"CBCentralManagerOptionShowPowerAlertKey":@NO}];
代理方法实现监控蓝牙开启状态以及连接发送数据
    .1实时监控蓝牙打开状态
    - (void)centralManagerDidUpdateState:(CBCentralManager *)central{
        switch (central.state) {
        case :
    // 第一个参数填nil代表扫描所有蓝牙设备,第二个参数options也可以写nil,调用下方方法后会开始扫描周围蓝牙设备开始调用3.2中代理方法
            [self.CBManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey : [NSNumber numberWithBool:YES]}];
            break;
    }
}
    3.2  开始扫描数据,扫描到对应数据后停止扫描
    -(void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
             //获取广播数据中的名称
             NSString*localName=[advertisementData valueForKey:@"kCBAdvDataLocalName"];
    if ([localName hasPrefix:@"HC"]) {
        _peripheral = peripheral;
      [self.CBManager connectPeripheral:_peripheral options:nil];
        // 扫描到设备之后停止扫描
       [self.CBManager stopScan];
    }
}
    .3连接到当前设备
    //连接外设成功,开始发现服务
    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
        NSLog(@"成功连接 peripheral: %@ with UUID: %@",peripheral,peripheral.identifier);
        // 连接设备之后设置蓝牙对象的代理,扫描服务
        [self.peripheral setDelegate:self];
        [self.peripheral discoverServices:nil];
        NSLog(@"扫描服务");
}
    3.3  发现服务,然后根据服务查找对应的特征
    //已发现服务
    -(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
        NSLog(@"发现服务.");
        for (CBService *s in peripheral.services) {
            if ([s.UUID.UUIDString isEqual:ServicesUUID]) {
                [peripheral discoverCharacteristics:nil forService:s];
        }
}
}
    3.4  根据服务UUID查询对应服务的特征
    -(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
        for (CBCharacteristic *c in service.characteristics) {
            if ([c.UUID.UUIDString isEqual:CharacteristicsUUID]) {
    self.characteristic = c;   
    //把数据进行转NSData编码,转数据成功后写数据给蓝牙外设    
            NSData *data = [self returnDataWithKey:self.BleId];
            [_peripheral setNotifyValue:YES forCharacteristic:c];
            [_peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithoutResponse];
        }
3.5 读取蓝牙外设返回的数据
//获取外设发来的数据,不论是read和notify,获取数据都是从这个方法中读取。
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
    if ([characteristic.UUID.UUIDString isEqual:CharacteristicsUUID]) {
        NSData * data = characteristic.value;       
        ///<d6c8d6c8 40010000 00000000 00000000 00000000>  成功返回数据
        ///<d6c8d6c8 80010000 00000000 00000000 00000000>  校验和错误返回数据
       // 比对data数据是否是返回成功的data数据或者失败的数据 ,成功返回,提示用户开门成功
}
- 遇到的问题:
4.1连接蓝牙设备发送数据,蓝牙设备收不到,具体原因是不清楚需要连接的硬件具体的服务以及服务对应的特征;
4.2 发送数据是需要发送先把当前的16进制数据转byte,然后转NSData类型数据;
4.2.1 获取到门锁上15位ID号,15位ID字符转16进制数据:
- (NSString *)hexStringFromString:(NSString *)string
4.2.2 转换好的15位ID号进行校验和处理,处理后拼接字符串,把拼接好的16进制字符串转byte然后再转NSData类型数据:
- (NSData *)returnDataWithKey:(NSString *)key
4.2.3 NSData数据转NSString类型:
- (NSString *)convertDataToHexStr:(NSData *)data
4.2.4 获取蓝牙外设发送的数据时,每次接收最大为20字节,获取时需要多次获取拼接data,然后再与对应的协议进行对比;
iOS蓝牙交互(4.0)的更多相关文章
- iOS蓝牙开发(4.0)详解
		最近由于项目需要, 一直在研究蓝牙4.0,在这儿分享给大家, 望共同进步. 一.关于蓝牙开发的一些重要的理论概念: 1.当前ios中开发蓝牙所运用的系统库是<CoreBluetooth/Core ... 
- iOS蓝牙BLE4.0通信功能
		概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ... 
- iOS蓝牙4.0开发
		文/starfox寒流(简书作者)原文链接:http://www.jianshu.com/p/974d165f78b5著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. iOS 蓝牙4.0 ... 
- https://github.com/coolnameismy/BabyBluetooth  github上的一个ios 蓝牙4.0的库并带文档和教程
		The easiest way to use Bluetooth (BLE )in ios,even bady can use. 简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和 ... 
- iOS蓝牙开发(二)蓝牙相关基础知识
		原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ... 
- ios 蓝牙相关
		ios蓝牙开发项目实战 -(附小米手环实例) 前言 最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文章实在太多了,成吨成吨的文章出现,但是很遗憾都只是一些皮 ... 
- iOS蓝牙BLE开发
		蓝牙是一个标准的无线通讯协议,具有设备成本低.传输距离近和功耗低等特点,被广泛的应用在多种场合.蓝牙一般分为传统蓝牙和BLE两种模式:传统蓝牙可以传输音频等较大数据量,距离近.功耗相对大:而BLE则用 ... 
- H5与安卓、IOS的交互,判断微信、移动设备、安卓、ios
		一.通过用户代理可以判断网页当前所在的环境 var browser={ versions:function(){ var u = navigator.userAgent, app = navigato ... 
- Unity3D与iOS的交互
		1. 关于Unity3D Unity3D(以下简称U3D)是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开 ... 
随机推荐
- [硬件]_ELVE_VS2015下opencv3.3的配置问题
			0x00 引言 最近想搞一下摄像头,但是我的Windows版本是64位的,opencv3.3貌似也只支持64位系统了,所以就配置一下win10+vs2015+opencv3.3的环境变量,具体下载和 ... 
- Hadoop 新生报道(三) hadoop基础概念
			一.NameNode,SeconderyNamenode,DataNode NameNode,DataNode,SeconderyNamenode都是进程,运行在节点上. 1.NameNode:had ... 
- 如何恢复未释放租约的HDFS文件
			之前有文章介绍过HDFS租约带来的问题,导致spark应用无法正常读取文件,只能将异常文件找出并且删除后,任务才能继续执行. 但是删除文件实在是下下策,而且文件本身其实并未损坏,只是因为已经close ... 
- Spring 并发访问的线程安全性问题
			首先对于spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一 ... 
- 手脱UPX(堆栈平衡原理)
			一开始看到pushad F8执行直到只有esp,eip,变化 在esp处follow in dump 下硬件访问断点 F9运行在硬件断点停下 到达一个长跳转(跳到OEP) 完成 ----------- ... 
- How to execute tons of tasks parallelly with TPL method?
			List<Task> taskList = new List<Task>(); // string currentNoStr = null; cannot define at ... 
- MySQL Linux压缩版安装方法
			在诸多开源数据库中,MySQL是目前应用行业,特别是互联网行业发展最好的一个.借助灵活的架构特点和适应不同应用系统场景的Storage Engine,MySQL在很多方面已经有不次于传统商用数据库的表 ... 
- 《CS:APP》二进制炸弹实验(phase_1-3)
			<深入理解计算机系统>第三章的bomb lab,拆弹实验:给出一个linux的可执行文件bomb,执行后文件要求分别进行6次输入,每一次输入错误都会导致炸弹爆炸,程序终止.需要通过反汇编来 ... 
- 开机后发现Win7桌面上什么都没有该如何恢复
			开机后发现Win7桌面上什么都没有该如何恢复 win7桌面上什么都没有该如何恢复:当我们打开电脑,发现win7桌面上什么都没有,那么该如何恢复呢?下面由我来介绍windows7桌面上图标不显示的解决方 ... 
- Apache Kafka系列(五) Kafka Connect及FileConnector示例
			Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程 ... 
