下面是两台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. dubbo安装

    dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,分享牛系列,分享牛专栏,分享牛.但管控台是否正常对 Dubbo 服务没有影响,管控台也不需要高可用,因此可以单节 ...

  2. Apache shiro集群实现 (五)分布式集群系统下的高可用session解决方案

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  3. 【伯乐在线】Java线程面试题 Top 50

    本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特 ...

  4. [mysql]创建数据库并指定编码

    现在用orm比较多,很多mysql表啊都不用自己创建,但是数据库还是要自己创建,记录下sql, 备忘. CREATE DATABASE `mydb` CHARACTER SET utf8 COLLAT ...

  5. Java之继承深刻理解

    1.关于私有成员变量 无论父类中的成员变量是私有的.共有的.还是其它类型的,子类都会拥有父类中的这些成员变量.但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protecte ...

  6. 21 ViewPager RadioGroup

    结构 MainActivity.java package com.qf.day21_viewpagerfragmentrg_demo4; import java.util.ArrayList; imp ...

  7. Effective C++ ——资源管理

    条款13:以对象来管理资源 在C++中我们经常会涉及到资源的申请与申请,一般都是由关键字new 和 delete来操作的,两者都是成对存在的,缺一不可,否则会出现意想不到的问题,例如: class I ...

  8. 5.Qt自定义Button按钮的实现

     1.编写自定义按钮 MyButton.h #ifndef MYBUTTON_H #define MYBUTTON_H #include <QWidget> /** * @brief ...

  9. Python Skelve 库

    在Python中有一个简单的轻量级的类似于Key-value的存储型数据库,那就是Skelve.下面就来一起看一看这个库的简单的使用吧. 小例子 我本人比较喜欢从例子出发,然后再来研究这些内部的行为. ...

  10. scala for spark

    写了点scala的内容,方便看spark源码,估计一两天就能看完,内容比较粗浅. 下载地址: http://download.csdn.net/detail/lsshlsw/7983541