最近智能家居比较火,好多公司开始开发通过蓝牙对智能家居进行连接控制!下面,我就把自己总结的蓝牙方面的知识分享一下!求吐槽!!!!O(∩_∩)O。。。

1.导入头文件#import <CoreBluetooth/CoreBluetooth.h>

2.设置中心及外设的属性

@property(nonatomic,strong)CBCentralManager*cbCentralMgr;//中心(发起连接)

@property(nonatomic,strong)CBPeripheral*myPeripheral;//外部设备(被动连接)

3.继承代理方法<CBCentralManagerDelegate,CBPeripheralDelegate>

4.创建中心设备的实例并设置代理

self.cbCentralMgr= [[CBCentralManageralloc]initWithDelegate:selfqueue:nil];

5.中心设备设置delegate后会自动调用本机蓝牙状态的方法

- (void)centralManagerDidUpdateState:(CBCentralManager*)central

{

switch(central.state)

{

caseCBCentralManagerStateUnsupported:

NSLog(@"The platform/hardware doesn't support Bluetooth Low Energy.");

break;

caseCBCentralManagerStateUnauthorized:

NSLog(@"The app is not authorized to use Bluetooth Low Energy.");

break;

caseCBCentralManagerStatePoweredOff:

NSLog(@"Bluetooth is currently powered off.");

break;

caseCBCentralManagerStatePoweredOn:

{

NSLog(@"CBCentralManagerStatePoweredOn");

}

break;

caseCBCentralManagerStateUnknown:

default:

break;

}

}

6.在状态为CBCentralManagerStatePoweredOn的时候可以通过中心设备扫描周边的设备

[self.cbCentralMgr    scanForPeripheralsWithServices:niloptions:@{CBCentralManagerScanOptionAllowDuplicatesKey: [NSNumbernumberWithBool:YES]}];

7.一旦扫描到设备就会自动调用代理方法

//发现蓝牙设备,可能发现不止一个蓝牙设备,所以该方法可能被调用多次

- (void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber*)RSSI{}

8.在扫描到一个设备时,我们可以进行外部设备和中心的连接

//连接某个蓝牙,一个中心设备可以连接多个周围的蓝牙设备,苹果最多连接10个外设

[self.cbCentralMgr connectPeripheral:peripheral options:[NSDictionary dictionaryWithObject:[NSNumbernumberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];

9.在连接的时候同时可以关闭中心的扫描

[self.cbCentralMgrstopScan];

10.在中心和外部设备的连接过程中,可能会调用以下几个方法:

a.当连接成功时调用

//当连接上某个蓝牙之后,CBCentralManager会通知代理处理

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

b.当连接失败时调用

//当连接蓝牙失败的时候会调用

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

c.当连接断开时调用

//当中心主动与外设断开或外设主动和中心断开成功时调用

- (void)centralManager:(CBCentralManager*)central didDisconnectPeripheral:(CBPeripheral*)peripheral error:(nullableNSError*)error{}

11.中心主动断开与外设的连接

[self.cbCentralMgrcancelPeripheralConnection:peripheral];

12.连接成功后,需要设置外设代理并且查询所有蓝牙服务或蓝牙某一个服务

//因为在后面我们要从外设蓝牙那边再获取一些信息并与之通讯,这些过程会有一些事件可能要处理,所以要给这个外设设置代理

peripheral.delegate=self;

//查询所有蓝牙服务,或查询蓝牙外设上的指定服务

[self.myperipheraldiscoverServices:nil];

13.查询所有服务时会调用外设的方法

//返回的蓝牙服务通知通过代理实现

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

{

for(CBService* serviceinperipheral.services){

[peripheraldiscoverCharacteristics:nilforService:service];

}

}

14.在这个方法里会进行扫描所有特征值,进而调用外设查询特征值的代理方法

//返回的蓝牙特征值通知通过代理实现

- (void)peripheral:(CBPeripheral*)peripheral didDiscoverCharacteristicsForService:(CBService*)service error:(NSError*)error{

}

15.在上面的方法中可以获取到已经与中心连接的外设内有哪些特征值,并且可以通过打开通知来读取特征值内数据的变化

[peripheralsetNotifyValue:YESforCharacteristic:characterstic];

16.特征值内数据变化时会调用外设的代理方法

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

17.在该方法里面读取的特征值内容是NSData类型,我们也可以转换为字节数组进行判断

NSData*data = characteristic.value;

//data转byte数组

Byte*testByte = (Byte*)[databytes];

for(inti=0;i<[datalength]; i++){

if((testByte[1] ==2)&&(testByte[0] ==2)) {

//做简单的演示判断

}

}

18.与此同时,我们也可以向某一个特征发送信息,只需要调用下面的方法

//根据蓝牙对象和特性发送数据

-(void)sendDatawithperipheral:(CBPeripheral*)peripheral characteristic:(NSString*)characteristicStr service:(NSString*) service data:(NSData*)data {

for(int i=0; i<service.characteristics; i++)

if([peripheral.services[i].UUIDisEqual:[CBUUIDUUIDWithString:service]]) {

for(CBCharacteristic*characteristicin[[peripheral.servicesobjectAtIndex:i]characteristics]){

//找到通信的的特性

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

[peripheralwriteValue:dataforCharacteristic:characteristictype:CBCharacteristicWriteWithoutResponse];

}

}

}

}

}

19.那么,我们该如何读取中心和外部设备的信号值?信号值越小说明信号越弱

a.当未连接时,我们可以通过扫描外设获取- (void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber*)RSSI{}方法里的RSSI值

b.当连接时,我们可以通过 [peripheralreadRSSI]来调用 - (void)peripheral:(CBPeripheral*)peripheral didReadRSSI:(NSNumber*)RSSI error:(NSError*)error{}方法获取RSSI值

文/爱吃苹果的兔子(简书作者)
原文链接:http://www.jianshu.com/p/1461ebb498ab
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

蓝牙-b的更多相关文章

  1. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  2. 2、利用蓝牙定位及姿态识别实现一个智能篮球场套件(二)——CC2540/CC2541基于广播的RSSI获得

    CC2541一拖多例程中RSSI获得是通过一个事件回调函数实现的,前提是需要连接上蓝牙设备. 这个对于多点定位来说是不可行的,由于主机搜索蓝牙设备过程中也能获得当前蓝牙设备的RSSI等信息,因此可基于 ...

  3. 1、利用蓝牙定位及姿态识别实现一个智能篮球场套件(一)——用重写CC2541透传模块做成智能手环

    一.预言 要实现一个智能篮球场套件,需要设计一个佩戴在篮球运动员手臂上的可以检测投篮.记步的手环,以及一套可以根据RSSI定位运动员的蓝牙定位装置.下面是大致需要的步骤: 首先,需要用CC2541透传 ...

  4. 蓝牙Bluetooth技术小知识

    蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...

  5. 蓝牙协议中的SBC编码

    一.从信息的传输说起  上图是一个典型的蓝牙耳机应用场景.手机上的音频信息经过编码以后通过蓝牙协议被蓝牙耳机接收,经过解码以后,蓝牙耳机成功获取手机上的音频信息,然后再转化为振动被人耳识别.这是一个 ...

  6. 蓝牙4.0(BLE)开发

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/26740237 作者:小马 IOS学习也一段时间了,该上点干货了.前段时间研究了一下 ...

  7. BluetoothChat用于蓝牙串口通信的修改方法

    本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...

  8. (转)android 蓝牙通信编程

    转自:http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样 ...

  9. 蓝牙协议分析(7)_BLE连接有关的技术分析

    转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connec ...

  10. Android端简易蓝牙聊天通讯App(原创)

    欢迎转载,但请注明出处!谢谢.http://www.cnblogs.com/weizhxa/p/5792775.html 最近公司在做一个蓝牙串口通讯的App,有一个固定的蓝牙设备,需要实现手机连接相 ...

随机推荐

  1. hdu 4607 Park Visit (dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先如果k小于等于直径长度,那么答案为k−1.如果k大于直径长度,设直径长度为r,那么答案为r− ...

  2. 关闭ES动态创建type

    虽说ES的默认设置已经够我们使用了,但是总有些情景需要我们修改一些配置. 由于ES 2.*不能单独删除某个type,只能将整个index删除.这无疑非常让人苦恼. 所以我们需要关闭动态创建type以减 ...

  3. php中应该哪怕被打断腿都要记得的几个函数

    php中应该哪怕被打断腿都要记得的几个函数: substr() 截取字符串 : explode() 使用一个字符串分割另一个字符串 : implode() 将数组用预定的字符连接成字符串: 下面有一个 ...

  4. 10th day

    貌似有几天没写博客了额.... 现在学习MySQL数据库,难度并不是很大,只是需要记忆的知识点比较多,好多语法之类的,比较容易混淆,而且老师讲课的速度还是蛮快的,虽然部分同学觉得听起来有点吃力,不过我 ...

  5. winform combobox控件绑定 分类: WinForm 2014-04-17 14:34 118人阅读 评论(0) 收藏

    想要达到的效果:把数据库中的一列数据绑定到combobox控件中. 数据库表:T_Task//任务表 列名:Task_Name//名称 主键:Task_ID combobox控件名称:cbName 解 ...

  6. Struts2自己定义拦截器实例—登陆权限验证

    版本号:struts2.1.6 此实例实现功能:用户须要指定username登陆,登陆成功进入对应页面运行操作,否则返回到登陆页面进行登陆,当直接訪问操作页面(登陆后才干訪问的页面)时则不同意,须返回 ...

  7. android AppWidgwtProvider学习

    实现AppWidgwtProvider: onUpdate() //在达到制定的更新时间之后或者当用户向桌面添加   App Widget时会调用该方法. onDeleted() //当App Wid ...

  8. web系统架构的演进变化很形象

    随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只需一个应用, ...

  9. Android 开源项目android-open-project解析之(三) ScrollView,TimeView,TipView,FlipView

    九.ScrollView Discrollview 支持滚动时Item淡入淡出,平移,缩放效果的ScrollView 项目地址:https://github.com/flavienlaurent/di ...

  10. 用PHP迭代器来实现一个斐波纳契数列(转)

    斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...