iOS开发蓝牙 蓝牙4.0的各种踩过的坑,希望你们少踩点
1.首先建立这个三个参数
@property (nonatomic,strong)CBCentralManager * manager;
@property (nonatomic,strong)CBPeripheral     * peripheral;
@property (nonatomic,strong)CBCharacteristic *writeDataCharacteristic2、初始化CBCentralManager
-(CBCentralManager *)manager
{
    if (!_manager )
    {
        _manager  = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) options:nil];
    }
    return _manager;
}3.开始扫描蓝牙
   [self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}];4.当蓝牙状态改变的时候就会调用这个方法
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    switch (central.state) {
        case CBCentralManagerStateUnknown:
             //设备不支持的状态
            NSLog(@">>>CBCentralManagerStateUnknown");
            {
                dispatch_async(dispatch_get_main_queue(), ^{
                    ALERTVIEW(@"设备不支持");
                });
            }
            break;
        case CBCentralManagerStateResetting:
            //正在重置状态
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                ALERTVIEW(@"正在重置状态");
            })  ;
        }
            NSLog(@">>>CBCentralManagerStateResetting");
            break;
        case CBCentralManagerStateUnsupported:
             //设备不支持的状态
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                ALERTVIEW(@"设备不支持的状态");
            });
        }
            NSLog(@">>>CBCentralManagerStateUnsupported");
            break;
        case CBCentralManagerStateUnauthorized:
            // 设备未授权状态
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                ALERTVIEW(@"设备未授权状态");
            });
        }
            NSLog(@">>>CBCentralManagerStateUnauthorized");
            break;
        case CBCentralManagerStatePoweredOff:
             //设备关闭状态
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                ALERTVIEW(@"设备关闭状态");
            });
        }
            NSLog(@">>>CBCentralManagerStatePoweredOff");
            break;
        case CBCentralManagerStatePoweredOn:
            NSLog(@">>>CBCentralManagerStatePoweredOn");
            //开始扫描周围的外设
            [self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}];
            break;
        default:
            break;
    }
}
5.连接外围设备
- (void)connect:(CBPeripheral *)peripheral
{
    // 连接外围设备
    [self.manager connectPeripheral:peripheral options:nil];
}6.连接玩设备就调用成功的方法,然后开始扫描
//连接到Peripherals-成功 //扫描外设中的服务和特征  连接上外围设备的时候会调用该方法
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@">>>连接到名称为(%@)的设备-成功",peripheral.name);
    //设置的peripheral委托CBPeripheralDelegate
    //@interface ViewController : UIViewController
    [peripheral setDelegate:self];
    //扫描外设Services,成功后会进入方法:-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
    [peripheral discoverServices:nil];
}
//连接到Peripherals-失败
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@">>>连接到名称为(%@)的设备-失败,原因:%@",[peripheral name],[error localizedDescription]);
}7.发现服务和设备的服务设备services
//发现服务
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
    NSLog(@"Discovered services for %@ ", peripheral.name);
    if (![self.dataSourceArray containsObject:peripheral])
    {
        [self.dataSourceArray addObject:peripheral];
        NSLog(@"%@",peripheral);
        dispatch_async(dispatch_get_main_queue(), ^{
            [_tableView reloadData];
        });
    }
}
/**
 *  发现外围设备的服务会来到该方法(扫描到服务之后直接添加peripheral的services)
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    NSLog(@"发现外围设备的服务");
    for (CBService *serivce in peripheral.services) {
        NSLog(@"====%@------%@+++++++",serivce.UUID.UUIDString,self.peripheral.identifier);
        if ([serivce.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_PROPRIETARY_SERVICE]) {
            // characteristicUUIDs : 可以指定想要扫描的特征(传nil,扫描所有的特征)
            [peripheral discoverCharacteristics:nil forService:serivce];
        }
    }
}8.找到了设备的服务然后扫描特征
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    NSLog(@"发现外围设备的特征");
    for (CBCharacteristic *characteristic in service.characteristics) {
        NSLog(@"====%@------+",characteristic.UUID.UUIDString);
        if ([characteristic.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_TRANS_TX]) {
            // 拿到特征,和外围设备进行交互
            [self notifyCharacteristic:peripheral characteristic:characteristic];
        }
    }
    for (CBCharacteristic *characteristic in service.characteristics) {
        NSLog(@"====%@------+",characteristic.UUID.UUIDString);
        if ([characteristic.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_TRANS_RX]) {
            // 拿到特征,和外围设备进行交互   保存写的特征
            self.writeDataCharacteristic = characteristic;
        }
    }
}9.最后一步要写上通知这个一定要写上
//设置通知
-(void)notifyCharacteristic:(CBPeripheral *)peripheral
             characteristic:(CBCharacteristic *)characteristic{
    //设置通知,数据通知会进入:didUpdateValueForCharacteristic方法
    [peripheral setNotifyValue:YES forCharacteristic:characteristic];
    [self.manager stopScan];
}
//取消通知
-(void)cancelNotifyCharacteristic:(CBPeripheral *)peripheral
                   characteristic:(CBCharacteristic *)characteristic{
    [peripheral setNotifyValue:NO forCharacteristic:characteristic];
}
10.大功告成只差一步就是写数据
//写数据
-(void)writeCharacteristic:(CBPeripheral *)peripheral
            characteristic:(CBCharacteristic *)characteristic
                     value:(NSData *)value
{
    //只有 characteristic.properties 有write的权限才可以写
    if(characteristic.properties & CBCharacteristicPropertyWrite){
        /*
         最好一个type参数可以为CBCharacteristicWriteWithResponse或type:CBCharacteristicWriteWithResponse,区别是是否会有反馈
         */
        [peripheral writeValue:value forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
    }else{
        NSLog(@"该字段不可写!");
    }
}11.希望能帮到人,让别人少走点坑。
iOS开发蓝牙 蓝牙4.0的各种踩过的坑,希望你们少踩点的更多相关文章
- iOS开发之蓝牙通讯
		iOS开发之蓝牙通讯 一.引言 蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单.相关的蓝牙操作由专门的CoreBluetooth.framework进行 ... 
- iOS开发之--蓝牙开发实战
		转载自:http://www.cnblogs.com/zyjzyj/p/6029968.html ,感谢英杰 前言 最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文 ... 
- iOS开发系列--Swift 3.0
		概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ... 
- iOS开发之蓝牙
		// // ViewController.m // 13-蓝牙 // // Created by hongqiangli on 2017/7/21. // Copyright © 李洪强. A ... 
- iOS开发之蓝牙业务封装
		因为公司做智能家居开发,有很多蓝牙的智能硬件.因此项目中经常需要和蓝牙打交道.为此为了提高开发效率,就把蓝牙的公共业务进行了封装. 本文将对封装的思路做一个简单的阐述. 首先我们需要一个头文件.在这个 ... 
- iOS开发之蓝牙通信
		一.引言 蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单.相关的蓝牙操作由专门的 CoreBluetooth.framework进行统一管理.通过蓝牙进 ... 
- iOS开发之蓝牙使用-建立连接的
		1.大佬笔记 CSDN 2.代码 github 
- 【零基础学习iOS开发】【02-C语言】10-函数
		前面已经讲完了C语言中的基本语句和基本运算了,这讲呢,介绍C语言中的重头戏---函数.其实函数这个概念,在大部分高级语言中都是非常重要的,我也已经在<第一个C语言程序>一讲中对函数作了一个 ... 
- iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习
		iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习 如果你不希望应用运行时 iPhone 进入锁屏待机状态,加入下面这行代码即可 [[UIApplication share ... 
随机推荐
- javascript的模块开发方法;
			<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- ASP.NET MVC 学习之路-4
			本文在于巩固基础 模型绑定 从URL 获取值 public ActionResult About(int id) { ViewBag.Id = id; return View(); } @{ View ... 
- SQL整理3
			一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ... 
- box-shadow属性
			一.定义和用法 box-shadow属性 向框添加一个或多个阴影. 二.语法 box-shadow: h-shadow v-shadow blur spread color inset; h-shad ... 
- html系列教程--p param progress rp rt ruby script select small source
			<p> 标签:用户段落划分或折行的标签 <param> 标签:param 元素允许您为插入 XHTML 文档的对象规定 run-time 设置,也就是说,此标签可为包含它的 & ... 
- TCP/IP协议族
			1.TCP(传输控制协议)/IP(网际协议)协议族是一个网络通讯模型,以及一整个网络传输协议家族,为互联网的基础通讯架构. TCP/IP四层协议的表示方法: 2.TCP/IP参考模型映射到OSI模型: ... 
- QF——UI之几种常用的隐藏键盘的方法
			怎么在填写完UITextField之后,点击空白处,隐藏软键盘. 下面两个方法都可以隐藏键盘 [tf resignFirstResponder]; 停止textfield的第一响应者 [self.vi ... 
- HTML5 canvas入门
			HTML5 Canvas入门 <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形.在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字. ... 
- codeforces 665D  Simple Subset
			题目链接 给一个数列, 让你选出其中的m个数, 使得选出的数中任意两个数之和都为质数, m尽可能的大. 首先, 除了1以外的任意两个相同的数相加结果都不是质数. 然后, 不考虑1的话, 选出的数的个数 ... 
- mini-httpd源码分析-match.h
			//字符串匹配,匹配返回 1,否则返回 0. //pattern可以通过任意个 | 字符,组合match_one中pattern的功能 int match(const char* pattern, c ... 
