CoreBluetooth——IOS蓝牙4.0使用心得

原文链接: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即可

时间: 2024-10-08 11:49:23

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

iOS蓝牙4.0

iOS的蓝牙用到了  CoreBluetooth 框架 首先导入框架 #import <CoreBluetooth/CoreBluetooth.h> 我们需要一个管理者来管理蓝牙设备,CBCentralManager 首先创建管理者 self.manager = [[CBCentralManager alloc]initWithDelegate:self queue:nil options:nil]; 这里只需要设置一个代理,队列根据需求来选择,这里用了nil 就是默认在主线程.options

iOS蓝牙4.0协议简单介绍

iOS开发蓝牙4.0的框架是CoreBluetooth,本文主要介绍CoreBluetooth的使用,关于本文中的代码片段大多来自github上的一个demo,地址是myz1104/Bluetooth. 在CoreBluetooth中有两个主要的部分,Central和Peripheral,有一点类似Client Server.CBPeripheralManager 作为周边设备是服务器.CBCentralManager作为中心设备是客户端.所有可用的iOS设备可以作为周边(Peripheral)

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

The easiest way to use Bluetooth (BLE )in ios,even bady can use. 简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和mac osx. 为什么使用它? 1:基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮你更简单地使用CoreBluetooth API. 2:CoreBluetooth所有方法都是通过委托完成,代码冗余且顺序凌乱.BabyBluetooth使用block方法,可以重新按照功能和顺序

iOS 蓝牙4.0相关资料

推酷资料 http://www.tuicool.com/topics/10200246 日本的一个技术博客 http://see.sl088.com/wiki/蓝牙4.0_For_IOS#cite_note-7 http://lynchwong.com http://lynchwong.com/2014/12/15/iOS蓝牙,CoreBluetooth框架简介及入门使用/

iOS 蓝牙4.0学习

周边( Peripheral) 是?成或者保存了数据的设备, 中央( Central) 是使用这些数据的设备. 所有可用的iOS设备可以作为周边(Per ipheral) 也可以作为中央(Central) , 但不可以同时既是周边也是中央. 周边设备: 作为服务端, 向外界提供服务,发送数据给中央设备.中央设备: 作为客户端, 扫描周边设备, 然后连接, 找到周边设备提供的合适的服务和特征, 接收数据. 一 周边设备(Peripheral,服务端) 需要遵循代理方法 <CBPeripheralM

iOS蓝牙4.0开发例子

1建立中心角色 #import <CoreBluetooth/CoreBluetooth.h> CBCentralManager *manager; manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 2扫描外设(discover) [manager scanForPeripheralsWithServices:nil options:options]; 3连接外设(connect) - (void)cen

iOS蓝牙编程指南 -- 核心蓝牙概述

小引 随着穿戴设备和智能家居的热情不断,app蓝牙的开发也很火热,基于iOS蓝牙的开发资料有不少,但是最最值得学习的必然是apple自家的文档啦,我之前的项目基于蓝牙4.0,开发过程中用到Core Bluetooth框架,算是我学习的笔记吧!涉及到几个部分,我打算分开把他们整理出来,本篇文章通过对Core Bluetooth Programming Guide的翻译,为大家介绍iOS蓝牙4.0编程的一些术语和概念,后续文章将会简单介绍下代码的流程.本人实力有限,了解的深度不是很广,还请各位看官轻

IOS学习之蓝牙4.0

转载请注明出处 作者:小马 IOS学习也一段时间了,该上点干货了.前段时间研究了一下IOS蓝牙通讯相关的东西,把研究的一个成果给大家分享一下. 一 项目背景 简单介绍一下做的东西,设备是一个金融刷卡器,通过蓝牙与iphone手机通讯.手机端的app通过发送不同的指令(通过蓝牙)控制刷卡器执行一些动作,比如读磁条卡,读金融ic卡等.上几张图容易理解一些:              看了上面几张图,你应该大概了解这是个什么东东了. 二 IOS 蓝牙介绍 蓝牙协议本身经历了从1.0到4.0的升级演变,

iOS开发 之 可穿戴设备 蓝牙4.0 BLE 开发

1 前言 当前有越来越多的可穿戴设备使用了蓝牙4.0 BLE(Bluetooth Low Energy).对于iOS开发而言,Apple之前专门推出CoreBluetooth的Framework来支持BLE的开发.对于硬件开发有了解的朋友应该知道,在之前使用低版本的蓝牙的设备,要连接到iOS设备上,需要注册MFI,拥有MFI协议才能进行相应的开发.如果大家关注我之前对LEGO EV3的研究,就可以发现,EV3是使用了蓝牙2.1,因此需要MFI协议来进行开发. 本文将一步一步讲解如何使用CoreB