智能设备 和 app 通过 BLE通讯的两种模型

模型一:设备提供数据,app 展示数据; 比如小米手环

模型二:app提供数据,设备接收;

模型与corebluetooth的对应关系;

模型一:智能设备,对应 peripheral;app对应central

模型二:智能设备作为central ; app作为 peripheral

这里主要讨论模型一,这也是当前大多数手环设备和iOS 交互的方式;开发流程

1. 创建工程,导入CoreBluetooth.framework

2. 初始化 CBCentralManager 并准备扫描周围蓝牙设备

//初始化    
theManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; //初始化完成会调用如下代理,返回当前手机的蓝牙状态

//当前蓝牙主设备状态

-(void)centralManagerDidUpdateState:(CBCentralManager *)central{

if (central.state==CBCentralManagerStatePoweredOn) {

self.title = @"蓝牙已就绪";

self.connectBtn.enabled = YES;

}else

{

self.title = @"蓝牙未准备好";

[self.activeID stopAnimating];

switch (central.state) {

case CBCentralManagerStateUnknown:

NSLog(@">>>CBCentralManagerStateUnknown");

break;

case CBCentralManagerStateResetting:

NSLog(@">>>CBCentralManagerStateResetting");

break;

case CBCentralManagerStateUnsupported:

NSLog(@">>>CBCentralManagerStateUnsupported");

break;

case CBCentralManagerStateUnauthorized:

NSLog(@">>>CBCentralManagerStateUnauthorized");

break;

case CBCentralManagerStatePoweredOff:

NSLog(@">>>CBCentralManagerStatePoweredOff");

break;

default:

break;

}

}

}

3. 当蓝牙状态一切正常时,这时可以开始搜索周边设备了,比如手环

//开始连接action
- (IBAction)startConnectAction:(id)sender { if (theManager.state==CBCentralManagerStatePoweredOn) {
NSLog(@"主设备蓝牙状态正常,开始扫描外设...");
self.title = @"扫描小米手环...";
//nil表示扫描所有设备
[theManager scanForPeripheralsWithServices:nil options:nil];
[self.activeID startAnimating];
self.connectBtn.enabled = NO;
self.resultTextV.text = @""; } }

4. 在扫描到设备的代理里面,连接我们找到的智能设备

//扫描到设备会进入方法
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
NSLog(@"扫描连接外设:%@ %@",peripheral.name,RSSI);
[central connectPeripheral:peripheral options:nil];
if ([peripheral.name hasSuffix:@"MI"]) {
thePerpher = peripheral;
[central stopScan];
[central connectPeripheral:peripheral options:nil];
self.title = @"发现小米手环,开始连接...";
self.resultTextV.text = [NSString stringWithFormat:@"发现手环:%@\n名称:%@\n",peripheral.identifier.UUIDString,peripheral.name];
}
}

5. 连接成功之后,去扫描设备的服务;扫描到服务之后,紧接着去扫描设备的特征;好比一个类提供的接口,只有知道这些,我们才能操作智能设备

//扫描到特征
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
if (error)
{
NSLog(@"扫描外设的特征失败!%@->%@-> %@",peripheral.name,service.UUID, [error localizedDescription]);
self.title = @"find characteristics error.";
[self.activeID stopAnimating];
self.connectBtn.enabled = YES;
return;
} NSLog(@"扫描到外设服务特征有:%@->%@->%@",peripheral.name,service.UUID,service.characteristics);
//获取Characteristic的值
for (CBCharacteristic *characteristic in service.characteristics){
{
[peripheral setNotifyValue:YES forCharacteristic:characteristic]; //步数
if ([characteristic.UUID.UUIDString isEqualToString:kMI_STEP])
{
[peripheral readValueForCharacteristic:characteristic];
} //电池电量
else if ([characteristic.UUID.UUIDString isEqualToString:kMI_BUTERY])
{
[peripheral readValueForCharacteristic:characteristic];
} else if ([characteristic.UUID.UUIDString isEqualToString:kMI_SHAKE])
{
//震动
theSakeCC = characteristic;
} //设备信息
else if ([characteristic.UUID.UUIDString isEqualToString:kMI_DEVICE])
{
[peripheral readValueForCharacteristic:characteristic];
} }
} } //扫描到服务
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
if (error)
{
NSLog(@"扫描外设服务出错:%@-> %@", peripheral.name, [error localizedDescription]);
self.title = @"find services error.";
[self.activeID stopAnimating];
self.connectBtn.enabled = YES; return;
}
NSLog(@"扫描到外设服务:%@ -> %@",peripheral.name,peripheral.services);
for (CBService *service in peripheral.services) {
[peripheral discoverCharacteristics:nil forService:service];
}
NSLog(@"开始扫描外设服务的特征 %@...",peripheral.name); } #pragma mark 设备扫描与连接的代理
//连接到Peripherals-成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
self.title = @"连接成功,扫描信息...";
NSLog(@"连接外设成功!%@",peripheral.name);
[peripheral setDelegate:self];
[peripheral discoverServices:nil];
NSLog(@"开始扫描外设服务 %@...",peripheral.name); }
//连接外设失败
-(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"连接到外设 失败!%@ %@",[peripheral name],[error localizedDescription]);
[self.activeID stopAnimating];
self.title = @"连接失败";
self.connectBtn.enabled = YES; } //与外设断开连接
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
NSLog(@"与外设备断开连接 %@: %@", [peripheral name], [error localizedDescription]);
self.title = @"连接已断开";
self.connectBtn.enabled = YES;
}

6. 当我们对设备发送一些指令时,会在如下代理里面响应到设备返回的数据

#pragma mark 设备信息处理
//扫描到具体的值
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error
{
if (error) {
NSLog(@"扫描外设的特征失败!%@-> %@",peripheral.name, [error localizedDescription]);
self.title = @"find value error.";
return;
}
NSLog(@"%@ %@",characteristic.UUID.UUIDString,characteristic.value);
if ([characteristic.UUID.UUIDString isEqualToString:kMI_STEP]) {
Byte *steBytes = (Byte *)characteristic.value.bytes;
int steps = TCcbytesValueToInt(steBytes);
NSLog(@"步数:%d",steps);
self.resultTextV.text = [NSString stringWithFormat:@"%@步数:%d\n",self.resultTextV.text,steps];
}
else if ([characteristic.UUID.UUIDString isEqualToString:kMI_BUTERY])
{
Byte *bufferBytes = (Byte *)characteristic.value.bytes;
int buterys = TCcbytesValueToInt(bufferBytes)&0xff;
NSLog(@"电池:%d%%",buterys);
self.resultTextV.text = [NSString stringWithFormat:@"%@电量:%d%%\n",self.resultTextV.text,buterys]; }
else if ([characteristic.UUID.UUIDString isEqualToString:kMI_DEVICE])
{
Byte *infoByts = (Byte *)characteristic.value.bytes;
//这里解析infoByts得到设备信息 } [self.activeID stopAnimating];
self.connectBtn.enabled = YES;
self.title = @"信息扫描完成"; }

7. 完整的代码工程;

https://github.com/cocoajin/BLE-miband

iOS蓝牙4.0开发(BLE)的更多相关文章

  1. iOS蓝牙4.0开发

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

  2. iOS 蓝牙4.0开发

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

  3. iOS蓝牙4.0开发例子

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

  4. 蓝牙4.0——Android BLE开发官方文档翻译

    ble4.0开发整理资料_百度文库 http://wenku.baidu.com/link?url=ZYix8_obOT37JUQyFv-t9Y0Sv7SPCIfmc5QwjW-aifxA8WJ4iW ...

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

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

  6. 蓝牙4.0(BLE)开发

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

  7. Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)

    段时间,公司项目用到了手机APP和蓝牙设备的通讯开发,这里也正好对低功耗蓝牙(蓝牙4.0及以后标准)的开发,做一个总结. 蓝牙技术联盟在2010年6月30号公布了蓝牙4.0标准,4.0标准在蓝牙3.0 ...

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

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

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

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

随机推荐

  1. java提高篇---HashTable

    在java中与有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,value)方法保存起来,然后通过get(key)方法获取相 ...

  2. HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用?

    X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的.通过在meta中设置X-UA-Compatible的值,可以指定网页的兼容性模式设置. 在网页中指定的模式优 ...

  3. git log 查看 提交历史

    在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 Git log 命令查看. 接下来的例子会用我专门用于演示的 simplegit 项目,运行下面的命令获取该项目源代码: git ...

  4. IIS网站部署注意点

    在IIS上部署网站时,除了在添加网站时配置好相关程序池,主目录,安全性,选择.Netframwork版本这些步骤外, 容易忘记的是有些网站需要打开web服务扩展.

  5. [Java解惑]字符串

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. Codeforces Round #260 (Div. 2)AB

    http://codeforces.com/contest/456/problem/A A. Laptops time limit per test 1 second memory limit per ...

  7. CSS3 transition/transform

    Transition 1.简写属性transition,可以包括四个属性,这四个属性的顺序按照下面介绍的顺序书写,即transition:property duration timing-functi ...

  8. Android下利用SQLite数据库实现增删改查

    1: 首先介绍如何利用adb查看数据库 1: adb shell 2: cd /data/data/包名/databases 3:  sqlite3 数据库 4   接下来就可以进行数据库的sql语法 ...

  9. E2 2014.08.05 更新日志

    增加功能 增加手机.平板兼容模块,用手机平板也能正常登陆和使用软件 介绍  演示 对数据库全面优化,全面提升数据量很大时统计分析的性能 完善功能 销售分析增加按商品分类分析 完善客户明细窗口的客户信息 ...

  10. 使用BAPI_ACC_DOCUMENT_POST,创建会计凭证,用BADI扩展字段(转)

    业务需求:和银行做一个接口,要通过银行流水产生会计凭证,会计凭证的事务码是F-02,查到了BAPI方法BAPI_ACC_DOCUMENT_POST.昨天测试发现,有一些参数在BAPI_ACC_DOCU ...