原文链接:http://m.blog.csdn.net/article/details?plg_nld=1&id=51014318&plg_auth=1&plg_uin=1&plg_usr=1&plg_vkey=1&plg_nld=1&plg_d

文章出处http://blog.csdn.net/xgcyangguang

所做的东西是通过手机/pad与蓝牙4.0的设备进行连接,之后设备上按对应的按键我们会收到对应的数值。首先需要和做蓝牙4.0的同事沟通好通信协议,具体的数据解析部分就不过多赘述了,主要写一下蓝牙接收数据的部分



1.和做蓝牙的同事沟通好设备的UUID以及特点,可以把他们写成宏



#define TRANSFER_SERVICE_UUID           @"0000fff0-0000-1000-8000-00805f9b34fb"
#define TRANSFER_CHARACTERISTIC_UUID    @"0000fff7-0000-1000-8000-00805f9b34fb"

2.在.H文件中导入两个头文件,并在接口中实现两个协议



#import "ViewController.h"
#import <CoreBluetooth/CoreBluetooth.h>
#import "UUID.h"

//需要实现协议
@interface ViewController () < CBCentralManagerDelegate, CBPeripheralDelegate>
{

}

3.创建两个蓝牙设备属性,一个相当于主机,一个相当于外设从机

#pragma mark 蓝牙设备
@property (strong, nonatomic) CBCentralManager      *centralManager;         //接收
@property (strong, nonatomic) CBPeripheral          *discoveredPeripheral;   //外设

@end
4.开始蓝牙配置
#pragma mark 在初始化界面结束后设置自己为代理
- (void)viewDidLoad {
    [super viewDidLoad];

   _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}

#pragma mark 此处监控一下中央的状态值,可以判断蓝牙是否开启/可用
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    NSMutableString *stringForCentralManagerState = [NSMutableString stringWithString:@"UpdateState:"];

    switch (central.state) {
        case CBCentralManagerStateUnknown:
            [stringForCentralManagerState appendString:@"Unkown\n"];
            break;
        case CBCentralManagerStateUnsupported:
            [stringForCentralManagerState appendString:@"Unsupported\n"];
        case CBCentralManagerStateUnauthorized:
            [stringForCentralManagerState appendString:@"Unauthorized\n"];
        case CBCentralManagerStateResetting:
            [stringForCentralManagerState appendString:@"Resetting\n"];
        case CBCentralManagerStatePoweredOff:
            [stringForCentralManagerState appendString:@"PowerOff\n"];
        case CBCentralManagerStatePoweredOn:
            //设备支持BLE并且可用
            [stringForCentralManagerState appendString:@"PoweredOn\n"];

            //开始搜索
            [self scan];
            break;
        default:
            [stringForCentralManagerState appendString:@"none\n"];
            break;
    }
    NSLog(@"%@", stringForCentralManagerState);

}

#pragma mark 扫描
- (void)scan
{

    //第一个参数如果设置为nil,会寻找所有service
    [self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]
     options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];

     NSLog(@"Scanning started");
}

#pragma mark 发现设备,连接
//一旦符合要求的设备被发现,就会回调此方法
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{

    NSLog(@"Discovered %@ at %@", peripheral.name, RSSI);

    if (self.discoveredPeripheral != peripheral) {

        self.discoveredPeripheral = peripheral;

        // 连接
        NSLog(@"Connecting to peripheral %@", peripheral);
        [self.centralManager connectPeripheral:peripheral options:nil];
    }
}

#pragma mark 未能连接的处理方法
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"Failed to connect to %@. (%@)", peripheral, [error localizedDescription]);
//    [self cleanup];
}

#pragma mark 当连接上设备
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@"Peripheral Connected");

    // 已连接上设备,故停止搜索
    [self.centralManager stopScan];
    NSLog(@"Scanning stopped");
    // Make sure we get the discovery callbacks
    peripheral.delegate = self;

    // 寻找指定UUID的Service
    [peripheral discoverServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]];
}

#pragma mark 发现设备上指定Service会回调此处
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    if (error) {
        NSLog(@"Error discovering services: %@", [error localizedDescription]);
        return;
    }

    // 寻找指定UUID的Characteristic
    for (CBService *service in peripheral.services) {
        [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]] forService:service];
    }
}
#pragma mark 找到指定UUID的Characteristic会回调此处
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    if (error) {
        NSLog(@"Error discovering characteristics: %@", [error localizedDescription]);

        return;
    }

    for (CBCharacteristic *characteristic in service.characteristics) {
        if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]]) {
            NSLog(@"find the characteristic");

            [peripheral setNotifyValue:YES forCharacteristic:characteristic];

        }
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
    if (error) {

               NSLog(@"Error discovering characteristics: %@", [error localizedDescription]);
        return;
    }

    NSLog(@"value --> %@",characteristic.value);

#pragma mark 把接收到的数据进行截取
//此处我们就可以拿到value值对其进行数据解析了
    NSData *data = characteristic.value;

 }
#pragma mark 蓝牙断开后自动重连
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error

{

    NSLog(@"Peripheral Disconnected");
    self.discoveredPeripheral = nil;
    [self scan];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"蓝牙连接状态" message:@"连接已断开" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:@"关闭", nil];
    [alert show];

}

5.蓝牙后台运行


若要实现蓝牙4.0在APP进入后台时仍能工作,传输数据,不用写代码,只需要修改xxx-info.plist文件即可

在所需的背景模式中加入两项

使用CoreBluetooth应用程序共享数据  和  应用程序进行通信使用CoreBluetooth即可

CoreBluetooth——IOS蓝牙4.0使用心得的更多相关文章

  1. iOS蓝牙BLE4.0通信功能

    概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...

  2. iOS蓝牙4.0开发

    文/starfox寒流(简书作者)原文链接:http://www.jianshu.com/p/974d165f78b5著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. iOS 蓝牙4.0 ...

  3. [iOS 基于CoreBluetooth的蓝牙4.0通讯]

    一.首先大致介绍下蓝牙4.0的模式,中心和周边: 一般情况下,iPhone作为中心,接收来自周边传感器(比如手环等)采集的数据. 二.那整一个数据通讯的协议是怎样的呢? 为什么要一层层搞这么复杂呢?据 ...

  4. iOS蓝牙4.0

    iOS的蓝牙用到了  CoreBluetooth 框架 首先导入框架 #import <CoreBluetooth/CoreBluetooth.h> 我们需要一个管理者来管理蓝牙设备,CB ...

  5. iOS 蓝牙4.0开发

    背景: 1.iOS的蓝牙不能用来传输文件.2.iOS与iOS设备之间进行数据通信,使用gameKit.framework3.iOS与其他非iOS设备进行数据通信,使用coreBluetooth.fra ...

  6. iOS蓝牙4.0协议简单介绍

    iOS开发蓝牙4.0的框架是CoreBluetooth,本文主要介绍CoreBluetooth的使用,关于本文中的代码片段大多来自github上的一个demo,地址是myz1104/Bluetooth ...

  7. https://github.com/coolnameismy/BabyBluetooth github上的一个ios 蓝牙4.0的库并带文档和教程

    The easiest way to use Bluetooth (BLE )in ios,even bady can use. 简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和 ...

  8. iOS蓝牙4.0开发(BLE)

    智能设备 和 app 通过 BLE通讯的两种模型 模型一:设备提供数据,app 展示数据: 比如小米手环 模型二:app提供数据,设备接收: 模型与corebluetooth的对应关系: 模型一:智能 ...

  9. iOS蓝牙4.0开发例子

    1建立中心角色 1 2 3 #import <CoreBluetooth/CoreBluetooth.h>  CBCentralManager *manager;  manager = [ ...

随机推荐

  1. Aforge.net之旅——开篇:从识别验证码开始

    时间过得真快啊,转眼今年就要过去了,大半年都没有写博客了,要说时间嘛,花在泡妹子和搞英语去了,哈哈...前几天老大问我 怎么这么长时间都没写博客了,好吧,继续坚持,继续分享我的心得体会. 这个系列我们 ...

  2. 第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList();

    list.add(new Student("Tom", 18, 100, "class05")); list.add(new Student("Jer ...

  3. 0004 plsql的安装

    PL/SQL是Oracle开发的主要工具,安装很简单,在官网 “https://www.allroundautomations.com/plsqldev.html” 选择合适的版本,也有多国语言包,下 ...

  4. js 数组删除指定元素

    Array.prototype.remove = function(obj) { for (var i = 0; i < this.length; i++) { var temp = this[ ...

  5. Python序列化之json与pickle

    1.json介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Progra ...

  6. Linux IPC System V 共享内存

    模型 #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> ftok() //获取key值 s ...

  7. android EditText光标位置(定位到最后)

    方法:edittext.setSelection(int); et.setText(content);//设置EditText控件的内容et.setSelection(content.length() ...

  8. Can't load AMD 64-bit .dll on a IA 32-bit platform

    主要谈谈在win8.1(64bit)下搭建环境的经历. 安装win8.1(64bit)后,配置java环境是费了我一番心思的,所以想记录下来,成为经验.64位系统下比较理想的配置应该是 64位jdk ...

  9. 《硝烟中的Scrum和XP》:作者主导Scrum过程的实战经验,四星推荐

    本书作者是开发团队Leader,本书记录了他带领团队实施Scurm过程中的经验教训.全书短小精悍,言简意赅. 以下是书中一些观点信息的摘抄: 1:Nokia总结出的迭代开发的基本要求:1.1:迭代要有 ...

  10. [转]pyhon之Tkinter实例化学习

    本文转自:http://www.cnblogs.com/kaituorensheng/p/3287652.html 阅读目录 1. 产品介绍 2. 设计规划 3. 相关知识 4. 源码附件 Tkint ...