1.首先建立这个三个参数

  1. @property (nonatomic,strong)CBCentralManager * manager;
  2. @property (nonatomic,strong)CBPeripheral * peripheral;
  3. @property (nonatomic,strong)CBCharacteristic *writeDataCharacteristic

2、初始化CBCentralManager

  1. -(CBCentralManager *)manager
  2. {
  3. if (!_manager )
  4. {
  5. _manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) options:nil];
  6. }
  7. return _manager;
  8. }

3.开始扫描蓝牙

  1. [self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}];

4.当蓝牙状态改变的时候就会调用这个方法

  1. - (void)centralManagerDidUpdateState:(CBCentralManager *)central
  2. {
  3. switch (central.state) {
  4. case CBCentralManagerStateUnknown:
  5. //设备不支持的状态
  6. NSLog(@">>>CBCentralManagerStateUnknown");
  7. {
  8. dispatch_async(dispatch_get_main_queue(), ^{
  9. ALERTVIEW(@"设备不支持");
  10. });
  11. }
  12. break;
  13. case CBCentralManagerStateResetting:
  14. //正在重置状态
  15. {
  16. dispatch_async(dispatch_get_main_queue(), ^{
  17. ALERTVIEW(@"正在重置状态");
  18. }) ;
  19. }
  20. NSLog(@">>>CBCentralManagerStateResetting");
  21. break;
  22. case CBCentralManagerStateUnsupported:
  23. //设备不支持的状态
  24. {
  25. dispatch_async(dispatch_get_main_queue(), ^{
  26. ALERTVIEW(@"设备不支持的状态");
  27. });
  28. }
  29. NSLog(@">>>CBCentralManagerStateUnsupported");
  30. break;
  31. case CBCentralManagerStateUnauthorized:
  32. // 设备未授权状态
  33. {
  34. dispatch_async(dispatch_get_main_queue(), ^{
  35. ALERTVIEW(@"设备未授权状态");
  36. });
  37. }
  38. NSLog(@">>>CBCentralManagerStateUnauthorized");
  39. break;
  40. case CBCentralManagerStatePoweredOff:
  41. //设备关闭状态
  42. {
  43. dispatch_async(dispatch_get_main_queue(), ^{
  44. ALERTVIEW(@"设备关闭状态");
  45. });
  46. }
  47. NSLog(@">>>CBCentralManagerStatePoweredOff");
  48. break;
  49. case CBCentralManagerStatePoweredOn:
  50. NSLog(@">>>CBCentralManagerStatePoweredOn");
  51. //开始扫描周围的外设
  52. [self.manager scanForPeripheralsWithServices:nil options:@{CBCentralManagerRestoredStateScanOptionsKey:@(YES)}];
  53. break;
  54. default:
  55. break;
  56. }
  57. }

5.连接外围设备

  1. - (void)connect:(CBPeripheral *)peripheral
  2. {
  3. // 连接外围设备
  4. [self.manager connectPeripheral:peripheral options:nil];
  5. }

6.连接玩设备就调用成功的方法,然后开始扫描

  1. //连接到Peripherals-成功 //扫描外设中的服务和特征 连接上外围设备的时候会调用该方法
  2. - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
  3. {
  4. NSLog(@">>>连接到名称为(%@)的设备-成功",peripheral.name);
  5. //设置的peripheral委托CBPeripheralDelegate
  6. //@interface ViewController : UIViewController
  7. [peripheral setDelegate:self];
  8. //扫描外设Services,成功后会进入方法:-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
  9. [peripheral discoverServices:nil];
  10. }
  11. //连接到Peripherals-失败
  12. -(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
  13. {
  14. NSLog(@">>>连接到名称为(%@)的设备-失败,原因:%@",[peripheral name],[error localizedDescription]);
  15. }

7.发现服务和设备的服务设备services

  1. //发现服务
  2. - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
  3. NSLog(@"Discovered services for %@ ", peripheral.name);
  4. if (![self.dataSourceArray containsObject:peripheral])
  5. {
  6. [self.dataSourceArray addObject:peripheral];
  7. NSLog(@"%@",peripheral);
  8. dispatch_async(dispatch_get_main_queue(), ^{
  9. [_tableView reloadData];
  10. });
  11. }
  12. }
  13. /**
  14. * 发现外围设备的服务会来到该方法(扫描到服务之后直接添加peripheral的services)
  15. */
  16. - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
  17. {
  18. NSLog(@"发现外围设备的服务");
  19. for (CBService *serivce in peripheral.services) {
  20. NSLog(@"====%@------%@+++++++",serivce.UUID.UUIDString,self.peripheral.identifier);
  21. if ([serivce.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_PROPRIETARY_SERVICE]) {
  22. // characteristicUUIDs : 可以指定想要扫描的特征(传nil,扫描所有的特征)
  23. [peripheral discoverCharacteristics:nil forService:serivce];
  24. }
  25. }
  26. }

8.找到了设备的服务然后扫描特征

  1. - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
  2. {
  3. NSLog(@"发现外围设备的特征");
  4. for (CBCharacteristic *characteristic in service.characteristics) {
  5. NSLog(@"====%@------+",characteristic.UUID.UUIDString);
  6. if ([characteristic.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_TRANS_TX]) {
  7. // 拿到特征,和外围设备进行交互
  8. [self notifyCharacteristic:peripheral characteristic:characteristic];
  9. }
  10. }
  11. for (CBCharacteristic *characteristic in service.characteristics) {
  12. NSLog(@"====%@------+",characteristic.UUID.UUIDString);
  13. if ([characteristic.UUID.UUIDString isEqualToString:UUIDSTR_ISSC_TRANS_RX]) {
  14. // 拿到特征,和外围设备进行交互 保存写的特征
  15. self.writeDataCharacteristic = characteristic;
  16. }
  17. }
  18. }

9.最后一步要写上通知这个一定要写上

  1. //设置通知
  2. -(void)notifyCharacteristic:(CBPeripheral *)peripheral
  3. characteristic:(CBCharacteristic *)characteristic{
  4. //设置通知,数据通知会进入:didUpdateValueForCharacteristic方法
  5. [peripheral setNotifyValue:YES forCharacteristic:characteristic];
  6. [self.manager stopScan];
  7. }
  8. //取消通知
  9. -(void)cancelNotifyCharacteristic:(CBPeripheral *)peripheral
  10. characteristic:(CBCharacteristic *)characteristic{
  11. [peripheral setNotifyValue:NO forCharacteristic:characteristic];
  12. }

10.大功告成只差一步就是写数据

  1. //写数据
  2. -(void)writeCharacteristic:(CBPeripheral *)peripheral
  3. characteristic:(CBCharacteristic *)characteristic
  4. value:(NSData *)value
  5. {
  6. //只有 characteristic.properties 有write的权限才可以写
  7. if(characteristic.properties & CBCharacteristicPropertyWrite){
  8. /*
  9. 最好一个type参数可以为CBCharacteristicWriteWithResponse或type:CBCharacteristicWriteWithResponse,区别是是否会有反馈
  10. */
  11. [peripheral writeValue:value forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
  12. }else{
  13. NSLog(@"该字段不可写!");
  14. }
  15. }

11.希望能帮到人,让别人少走点坑。

iOS开发蓝牙 蓝牙4.0的各种踩过的坑,希望你们少踩点的更多相关文章

  1. iOS开发之蓝牙通讯

    iOS开发之蓝牙通讯 一.引言 蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单.相关的蓝牙操作由专门的CoreBluetooth.framework进行 ...

  2. iOS开发之--蓝牙开发实战

    转载自:http://www.cnblogs.com/zyjzyj/p/6029968.html ,感谢英杰 前言 最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文 ...

  3. iOS开发系列--Swift 3.0

    概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...

  4. iOS开发之蓝牙

    // //  ViewController.m //  13-蓝牙 // //  Created by hongqiangli on 2017/7/21. //  Copyright © 李洪强. A ...

  5. iOS开发之蓝牙业务封装

    因为公司做智能家居开发,有很多蓝牙的智能硬件.因此项目中经常需要和蓝牙打交道.为此为了提高开发效率,就把蓝牙的公共业务进行了封装. 本文将对封装的思路做一个简单的阐述. 首先我们需要一个头文件.在这个 ...

  6. iOS开发之蓝牙通信

    一.引言 蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单.相关的蓝牙操作由专门的 CoreBluetooth.framework进行统一管理.通过蓝牙进 ...

  7. iOS开发之蓝牙使用-建立连接的

    1.大佬笔记 CSDN 2.代码 github

  8. 【零基础学习iOS开发】【02-C语言】10-函数

    前面已经讲完了C语言中的基本语句和基本运算了,这讲呢,介绍C语言中的重头戏---函数.其实函数这个概念,在大部分高级语言中都是非常重要的,我也已经在<第一个C语言程序>一讲中对函数作了一个 ...

  9. iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习

    iOS开发 - 不进入待机(屏幕保持唤醒)---UIApplication学习 如果你不希望应用运行时 iPhone 进入锁屏待机状态,加入下面这行代码即可 [[UIApplication share ...

随机推荐

  1. 帮助中心 7D-我的私家设计师 设计师品牌服饰集成网 7D服装定制!

    帮助中心 7D-我的私家设计师 设计师品牌服饰集成网 7D服装定制! 关于我们

  2. VirtualBox详细教程

    转自:http://bbs.kafan.cn/thread-358294-1-1.html 1.Sun xVM VirtualBox简介 VirtualBox官方网站:http://www.virtu ...

  3. 利用rman进行异机还原(目录相同)

    利用rman进行异机还原(目录相同) 源始库:192.168.201.2 目标库:192.168.201.3 --192.168.201.2 --rman [oracle@db01 ~]$ rman ...

  4. [UI]抽屉菜单DrawerLayout分析(二)

    继续分析DrawerLayout的手势分发部分 谈到手势分发,这本身就是个好话题,DrawerLayout作为继承自ViewGroup得布局他可以拦截手势也可以分发给子view,也就是在 onInte ...

  5. mysql数据库日期是varchar类型的时间比较查询

     单纯的字符串比较结果不精确. select * from 表明 where times> '2088/12/8 10:02:40' (×) 转换函数如下(数据库为varchar): selec ...

  6. T-SQL变量

    T-SQL中变量分为全局变量和局部变量,分别使用@@和@前缀. 全局变量 常用的全局变量有@@VERSION .@@IDENTITY.@@ERROR.@@ROWCOUNT 用法 select @@VE ...

  7. UpdatePanel局部刷新用法

    AjaxTest.aspx代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&qu ...

  8. C# - 重定义一个接口的实现

    using System;using System.Collections.Generic;using System.Text; namespace MyTester{    public inter ...

  9. sqlplus查看服务名

    查看服务名: show parameter service 查看实例名: select * from v$instance; 查看数据库名: select name from v$database; ...

  10. start.sh

    JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "JAVA_MEM_OPTS=" ...