下面是两台iPhone6连接同一台蓝牙设备的结果:

**成功连接**** peripheral: <CBPeripheral: 0x1700f4500, identifier = 50084F69-BA5A-34AC-8A6E-6F0CEADB21CD, name = 555555555588,
state = connected> with UUID: <__NSConcreteUUID 0x17003d980> 50084F69-BA5A-34AC-8A6E-6F0CEADB21CD**
****
****
**成功连接**** peripheral: <CBPeripheral: 0x1742e3000, identifier = 55B7D759-0F1E-6271-EA14-BC5A9C9EEEEC, name = 555555555588,
state = connected> with UUID: <__NSConcreteUUID 0x174036c00> 55B7D759-0F1E-6271-EA14-BC5A9C9EEEEC**

iOS的蓝牙开发很简单,只要包含一个库,创建CBCentralManager实例,实现代理方法,然后就可以直接和设备进行通信。

发现附近的特定蓝牙设备

#import <CoreBluetooth/CoreBluetooth.h>

首先可以定义一些即将使用到的UUID的宏


#define kPeripheralName     @"360qws Electric Bike Service" //外围设备名称
#define kServiceUUID        @"7CACEB8B-DFC4-4A40-A942-AAD653D174DC" //服务的UUID

#define kCharacteristicUUID @"282A67B2-8DAB-4577-A42F-C4871A3EEC4F" //特征的UUID
如果不是把手机作为中心设备的话,这些没有必要设置。

1.设备的UUID以及characteristic,可以把他们写成宏

#define TRANSFER_SERVICE_UUID           @"0000fff0-0000-1000-8000-00206f9c56cad"

#define TRANSFER_CHARACTERISTIC_UUID    @"0000fff7-0000-1000-8000-00806f9c56cad"

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

#import"ViewController.h"

#import<CoreBluetooth/CoreBluetooth.h>

//需要实现协议

@interfaceViewController () <CBCentralManagerDelegate,CBPeripheralDelegate>{}

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

#pragma mark
蓝牙设备

@property (strong,nonatomic)CBCentralManager   *centralManager;
       //接收

@property (strong,nonatomic)CBPeripheral       *discoveredPeripheral;
 //外设

@end

4.开始蓝牙配置

#pragma mark  在初始化界面结束后设置自己为代理

@implementation ViewController

- (void)viewDidLoad {

[superviewDidLoad];

_centralManager = [[CBCentralManageralloc]initWithDelegate:selfqueue:nil];

}

#pragma mark  此处监控一下central的状态值,可以判断蓝牙是否开启/可用

- (void)centralManagerDidUpdateState:(CBCentralManager *)central

{

NSMutableString *stringForCentralManagerState = [NSMutableStringstringWithString:@"UpdateState:"];

switch (central.state) {

caseCBCentralManagerStateUnknown:

[stringForCentralManagerStateappendString:@"Unkown\n"];

break;

caseCBCentralManagerStateUnsupported:

[stringForCentralManagerStateappendString:@"Unsupported\n"];

caseCBCentralManagerStateUnauthorized:

[stringForCentralManagerStateappendString:@"Unauthorized\n"];

caseCBCentralManagerStateResetting:

[stringForCentralManagerStateappendString:@"Resetting\n"];

caseCBCentralManagerStatePoweredOff:

[stringForCentralManagerStateappendString:@"PowerOff\n"];

caseCBCentralManagerStatePoweredOn:

//设备支持BLE并且可用

[stringForCentralManagerStateappendString:@"PoweredOn\n"];

//开始搜索

[selfscan];

break;

default:

[stringForCentralManagerStateappendString:@"none\n"];

break;

}

NSLog(@"%@", stringForCentralManagerState);

}

#pragma mark
扫描

- (void)scan

{           [self.centralManage scanForPeripheralsWithServices:@[[CBUUI 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;

// 连接

[self.centralManagerconnectPeripheral:peripheraloptions:nil];

NSLog(@"Connecting to peripheral
%@", peripheral);

}

}

#pragma mark
未能连接的处理方法

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral
error:(NSError *)error

{

NSLog(@"Failed to connect to %@. (%@)", peripheral, [errorlocalizedDescription]);

}


#pragma mark
当连接上设备

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral

{

NSLog(@"Peripheral Connected");

//已连接上设备,故停止搜索

[self.centralManagerstopScan];

NSLog(@"Scanning stopped");

peripheral.delegate =self;

//寻找指定UUID的Service

[peripheraldiscoverServices:@[[CBUUIDUUIDWithString:TRANSFER_SERVICE_UUID]]];

}

#pragma mark
发现设备上指定Service会回调此处

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

{

if (error) {

NSLog(@"Error discovering services: %@", [errorlocalizedDescription]);

return;

}

//寻找指定UUID的Characteristic

for (CBService *servicein peripheral.services) {

[peripheraldiscoverCharacteristics:@[[CBUUIDUUIDWithString: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: %@", [errorlocalizedDescription]);

return;

}

for (CBCharacteristic *characteristicin service.characteristics) {

if ([characteristic.UUIDisEqual:[CBUUIDUUIDWithString:TRANSFER_CHARACTERISTIC_UUID]])
{

NSLog(@"find the characteristic");

[peripheralsetNotifyValue:YESforCharacteristic:characteristic];

}

}

}

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

{

if (error) {

NSLog(@"Error discovering characteristics: %@", [errorlocalizedDescription]);

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;

// 重新开启搜索

[selfscan];

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

[alert
show];

}

5.蓝牙后台运行

若要实现蓝牙4.0在APP进入后台时仍能工作,传输数据,不用写代码,只需要修改xxx-info.plist文件即可
在Required background modes中加入两项
App shares data using CoreBluetooth  和  App communicates using CoreBluetooth
即可

iOS关于蓝牙连接的简单介绍与使用的更多相关文章

  1. iOS开发数据库篇—SQLite简单介绍

    iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...

  2. iOS开发数据库篇—FMDB简单介绍

    iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...

  3. iOS开发拓展篇-XMPP简单介绍

    iOS开发拓展篇-XMPP简单介绍 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双 ...

  4. 【转】 iOS开发数据库篇—SQLite简单介绍

    开始学SQLite啦, 原文: http://www.cnblogs.com/wendingding/p/3868893.html iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中 ...

  5. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  6. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  7. iOS开发UI篇—Modal简单介绍

    iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...

  8. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

  9. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

随机推荐

  1. 剑指Offer——分治算法

    剑指Offer--分治算法 基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更 ...

  2. 18 UI美化状态集合的位图selector

    当我们某个控件 想在不同状态下显示不同的背景图的需求 如我们需要按钮在正常状态显示一种图 按下显示另一背景图 或者单选框被选中时是一种显示图片 没选中是另一种背景图 例子 按钮在不同状态显示不同的背景 ...

  3. 【Netty源码学习】入门示例

    Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.        也就是说,Netty ...

  4. 11 PopupMenu菜单和代码例子

    PopupMenu 弹出式菜单 API 11以上可用 1. 获取弹出菜单的对象 2. 在res里的menu添加菜单项 3. 将布局里的菜单项 给弹出菜单 4. 进行监听弹出菜单 5. 展示出弹出菜单 ...

  5. Android的oom详解

    Android的oom原因 1.资源对象没关闭造成的内存泄露,try catch finally中将资源回收放到finally语句可以有效避免OOM.资源性对象比如: 1-1,Cursor 1-2,调 ...

  6. Swift基础之实现一个镂空图片的小Demo

    前两天看了别人的文章,涉及到了镂空的展示,所以我在这里把实现的内容写成Swift语言的小Demo,供大家欣赏 首先,需要创建导航视图,然后创建两种展示方式的按钮 let vc = ViewContro ...

  7. Swift中实现Observable机制

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51917539 ...

  8. springMVC 使用ajax 出现No serializer found for class异常

    转自  http://mxdba.iteye.com/blog/668155 google了一下,发现坛子里已经有人解答了 http://godfox.iteye.com/blog/646887 不过 ...

  9. (七十六)CoreLocation(二)获取经纬度、速度、方向,进行区域监听

    上节说明了如何在iOS7和iOS8上完成授权,并且开始获取位置,这一节介绍获取位置信息的方法. [定位精度] 定位精度有多种选择:根据字面意思即可理解 extern const CLLocationA ...

  10. Java与C之间的socket通信

    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...