智能设备 和 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. centos6.5用户管理

    一.centOS6.5用户管理命令 useradd 新增用户 userdel  删除用户 passwd  修改用户密码 二.命令的使用 useradd useradd admin userdel us ...

  2. Bad apple for CSharp

    前言:记得10年的时候我还在上学,有一天逛csdn看到了字符版的badapple,感觉这东西好NB啊,然后就下载了一份,最近整理博客就把他整理博客,原作者是谁真心不知道,这是在果壳看到的. Bad A ...

  3. Python3基础 使用技巧:把代码的字体变大

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  4. BZOJ 2668 交换棋子(费用流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2668 题意:有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子中的棋子,最终达到目标状 ...

  5. Cheatsheet: 2014 12.01 ~ 12.31

    .NET Some Thoughts on the new .Net Introducing .NET Core Running ASP.NET on a Raspberry Pi with Mono ...

  6. C# Ini配置文件

    public class INIUserAccound { static IniFile Ini = new IniFile(AppDomain.CurrentDomain.BaseDirectory ...

  7. [Java解惑]异常

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

  8. iOS添加广告的主要方法

    //用户取消正在执行的广告时 调用 - (void)cancelBannerViewAction { NSLog(@"Banner was cancelled!"); self.a ...

  9. zoj 1199 几何公式推导

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=199 Point of Intersection Time Limit:  ...

  10. Get started with Gazebo in ROS

    Run Gazebo These three steps will run Gazebo with a default world. Install Gazebo. Open a terminal. ...