CoreBluetooth连接蓝牙健康设备

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

引言

CoreBluetooth是iOS下用于蓝牙设备连接的模块,支持蓝牙4.0及以上的设备。蓝牙设备五花八门,本文的主角是蓝牙健康设备,目标是在iPhone上获取蓝牙健康设备测量到的数据(android手机请看这篇文章)。
本文使用的蓝牙健康设备是日本A&D公司生产的蓝牙血压计(UA-651BLE)和体温计(UT-201BLE)。使用这两个型号的健康设备是因为它们是康体佳联盟(continua health alliance)认证的,接口是标准化的,没有进行加密。

原理

在CoreBluetooth中,拥有数据的蓝牙设备被称为peripheral,向外发送数据;获取数据的设备称为central,一般是手机或电脑。本文中central就是我们的手机。
蓝牙通信结构

peripheral会不断广播很小的数据包,包含设备的名称、主要服务等,让外界知道自己的存在。如果有一个central在扫描,就可以获得这个数据包,从而能够去连接这个设备。
发送广告

peripheral中最关键的信息就是其包含的service,一个peripheral可以有一个或多个service,每个service下有一个或多个characteristic,用来具体描述这个service。例如,下图是一个心率的service,包含了两个characteristic,分别是心率数值,传感器位置。
peripheral结构

流程

了解原理后就可以实践了。我们的手机作为central,在ViewController要实现CBCentralManagerDelegate,之后要操作peripheral,因此也需要实现CBPeripheralDelegate。
* 初始化

@property (strong, nonatomic) CBCentralManager *centralManager;

self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];```

* 扫描设备 第一个array的参数如果填nil就会扫描所有蓝牙设备,推荐用设备包含的服务来过滤(如血压服务)。

NSString * const BLOOD_PRESSURE_UUID = @”1810”; //血压服务的UUID

[self.centralManager scanForPeripheralsWithServices:[NSArray arrayWithObjects:[CBUUID UUIDWithString:BLOOD_PRESSURE_UUID], nil] options:nil];“`

  • 扫描到符合要求的蓝牙设备后会调用CBCentralManagerDelegate中下面这个方法
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{
    if (!peripheral || !peripheral.name || ([peripheral.name isEqualToString:@""])) {
        return;
    }
    NSLog(@"name:%@",peripheral.name);
    NSLog(@"ad:%@",advertisementData);
    [self stopDiscover];  //停止扫描节约电量
    self.peripheral = peripheral;
    peripheral.delegate = self;
    [self.centralManager connectPeripheral:peripheral options:nil]; //尝试连接此设备
}```

* 如果连接成功,会调用CBCentralManagerDelegate的这个方法,在这里去获取此设备的服务。
  • (void)centralManager:(CBCentralManager )central didConnectPeripheral:(CBPeripheral )peripheral{
    if (!peripheral) {
    return;
    }
    NSLog(@”did connect peripheral”);
    [self.peripheral discoverServices:nil]; //尝试发现这个设备的服务
    }“`

  • 成功获取peripheral的服务,就会调用CBPeripheralDelegate的这个方法

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
    for (CBService *service in peripheral.services) {  //遍历服务
        NSLog(@"discover service: %@", service);
        if ([service.UUID isEqual:[CBUUID UUIDWithString:BLOOD_PRESSURE_UUID]] ) {
            [peripheral discoverCharacteristics:nil forService:service];  //如果是血压服务,就尝试发现这个服务的characteristic
            break;
        }
    }
}```

* 成功发现characteristic后,调用CBPeripheralDelegate的这个方法
  • (void)peripheral:(CBPeripheral )peripheral didDiscoverCharacteristicsForService:(CBService )service error:(NSError *)error{
    for (CBCharacteristic *character in service.characteristics) {
    NSLog(@”discover characteristic: %@”,character);
    if ([character.UUID isEqual:[CBUUID UUIDWithString:BLOOD_PRESSURE_MEASUREMENT_UUID]]) {
    //监听我们关注的characteristic,一旦这个//发生变化就会得到通知
    [peripheral setNotifyValue:YES forCharacteristic:character];
    }
    if ([character.UUID isEqual:[CBUUID UUIDWithString:BLOOD_PRESSURE_FEATURE_UUID]]) {
    //读取characteristic的值
    [peripheral readValueForCharacteristic:character];
    }
    if ([character.UUID isEqual:[CBUUID UUIDWithString:DATE_TIME_UUID]]) {
    [peripheral readValueForCharacteristic:character];
    }

    }
    }“`

  • 设备测量完成后会发送数据,获得数据后调用CBPeripheralDelegate的这个方法

“`
- (void)peripheral:(CBPeripheral )peripheral didUpdateValueForCharacteristic:(CBCharacteristic )characteristic error:(NSError *)error{
if (error) {
NSLog(@”%@”,[error localizedDescription]);
}else{
NSData *data = characteristic.value; //获取raw data
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:BLOOD_PRESSURE_MEASUREMENT_UUID]] && data) {
const uint8_t *reportData = [data bytes]; //转换一个字节对应一个整数的序列
NSInteger sys = reportData[1]; //收缩压
NSInteger dia = reportData[3]; //舒张压
NSInteger pul = reportData[7]; //心率
NSLog(@”sys:%ld”,(long)sys);
NSLog(@”dia:%ld”,(long)dia);
NSLog(@”pul:%ld”,(long)pul);
if (sys == 255) {
self.sysTextField.text = @”error”;
self.diaTextField.text = @”error”;
self.pulTextField.text = @”error”;
}else{
self.sysTextField.text = [NSString stringWithFormat:@”%ld”,sys];
self.diaTextField.text = [NSString stringWithFormat:@”%ld”,dia];
self.pulTextField.text = [NSString stringWithFormat:@”%ld”,pul];
}

    }else{
        NSLog(@"data value: %@ UUID:%@",data, characteristic.UUID);
    }
}

}“`

运行截图

血压测量界面

体温测量界面

源码

Github项目地址

iOS蓝牙开发避坑指南:CoreBluetooth连接小米手环的5个常见问题 本文深入解析了使用iOSCoreBluetooth框架连接小米手环等智能穿戴设备时,开发者常遇到的五大核心难题:权限配置、UUID匹配、数据解析、连接稳定性与后台模式处理。文章提供了Swift/Objective-C实战代码,旨在帮助开发者避开技术深坑,实现稳定高效的蓝牙通信。 阅读详情

相关推荐

C#实现蓝牙检测及蓝牙设备信息获取 (附完整源码)

C#实现蓝牙检测及蓝牙设备信息获取 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1077

CoreBluetooth的中心模式查找全部蓝牙设备

程序通过真机运行起来后,可以将所有正在进行广播的蓝牙设备显示出来。帮助刚开始接触iOSCoreBluetooth来进行蓝牙开发的新手更好的学习,通过代码更快更好的进入蓝牙开发领域。

macOS CoreBluetooth外围设备开发指南

iOS开发中,苹果提供的CoreBluetooth框架为开发者提供了一系列API来管理蓝牙低功耗(BLE)设备的通信。BLE是一种适用于低功率数据传输的无线技术,它为智能手机、平板电脑、健康监测设备等移动设备之间提供了一种高效、便捷的数据交换方式。CoreBluetooth框架使得iOS应用能够以中心角色与外围蓝牙设备进行交互,如健康监测手环、蓝牙耳机等。通过这个框架,开发者可以完成以下核心功能:- 使用CBCentralManager类管理中心角色的连接和广播;

weixin_35732273的博客 941

健康在线蓝牙报文交互协议

健康在线蓝牙报文交互协议,android开发蓝牙外接设备

用 c sharp 写一个检测蓝牙设备电量的脚本

你好!这是一个在 C# 中检测蓝牙设备电量的示例脚本。 首先,你需要在你的项目中添加一个引用 to the System.Management namespace。然后,你可以使用下面的代码来检测蓝牙设备电量: using System.Management; // Replace "BluetoothDeviceName" with the actual name of your Bluet...

weixin_42610010的博客 346

c# 写一个检测蓝牙设备电量的脚本

c 语言是一种通用的、高效的编程语言,广泛用于系统编程、应用开发以及其他各种领域。它是一种面向过程的编程语言,支持高级数据类型、函数、指针以及其他多种编程功能。由于其简洁、高效和可移植性,c 语言被广泛使用,并成为许多其他语言的基础。 ...

weixin_42610010的博客 334

C#连接蓝牙设备

C#连接蓝牙设备,避免踩坑

啊鹏的博客 1万+

IOS/Android 读取蓝牙设备电量信息

IOS/Android 读取蓝牙设备电量信息                                  ◼︎ 使用系统API扫描到蓝牙设备IOS:使用      1.CoreBluetooth/CoreBluetooth.h Android:使用      1.android.bluetooth.BluetoothAdapter      2.andro

罗函 1万+

RxBluetoothKit 使用教程

RxBluetoothKit 是一个基于 RxSwift 的蓝牙库,由 Polidea 开发并维护。它提供了一套简洁的 API,使得开发者能够更方便地与蓝牙设备进行交互。RxBluetoothKit 支持 iOS 和 macOS 平台,并且充分利用了 RxSwift 的响应式编程特性,使得蓝牙操作更加流畅和易于管理。 ## 项目快速启动 ### 安装 RxBluetoothKit 首先,在

gitblog_00671的博客 658

CoreBluetooth

硬體週邊Tips Contents  [hide]  1 藍牙 1.1 BLE(CoreBluetooth) 1.1.1 Discover/Connect 1.1.1.1 CBCentralManager1.1.1.2 centralManagerDidUpdateState1.1.1.3 scanForPeriphera

jimoduwu的专栏 6588

BabyBluetooth多设备管理:如何同时连接和控制多个蓝牙外设

BabyBluetooth是一个简单易用的iOS蓝牙库,基于CoreBluetooth框架封装,让开发者能够轻松实现蓝牙设备管理和控制。即使是对蓝牙开发不熟悉的新手,也能快速上手使用这个强大的蓝牙管理工具。 ## 为什么需要蓝牙设备管理? 在现代物联网应用中,单一设备连接已经无法满足复杂场景的需求。比如智能家居系统中需要同时控制多个灯光设备健康监测应用需要连接多个传感器设备、工业控制场景

gitblog_00234的博客 338

探索WEBlueToothManager:一款高效实用的蓝牙管理工具

探索WEBlueToothManager:一款高效实用的蓝牙管理工具 项目简介 在如今的物联网时代,蓝牙技术无处不在,而就是一款专为iOS平台设计的开源蓝牙管理框架,它简化了蓝牙设备连接与数据交换过程,让开发者能够更专注于应用的核心功能开发,而非底层蓝牙协议的实现。 技术分析 1. CoreBluetooth支持 WEBlueToothManager基于Apple的CoreBluetooth框架...

gitblog_00067的博客 513

Introduction to Core Bluetooth: Building a Heart Rate Monitor

This post is also available in: Spanish Learn how to use Core Bluetooth on a real-world device! The Core Bluetooth framework lets your iOS and Mac apps communicate with Bluetooth low energ

nogodoss的专栏 2051

【亲测免费】 探秘iOS下的蓝牙BLE开发:以小米手环2为例

探秘iOS下的蓝牙BLE开发:以小米手环2为例 在移动应用开发领域,蓝牙低功耗(Bluetooth Low Energy, BLE)技术的应用越来越广泛,尤其在智能穿戴设备和物联网(IoT)产品中。今天,我们要向大家隆重介绍一个极具实践价值的开源项目——iOS-BLE。该项目通过实现与小米手环2的通讯示例,为iOS开发者打开了一扇探索蓝牙通信奥秘的大门。 项目介绍 iOS-BLE是一个简洁明了的i...

gitblog_00001的博客 814

IOS系统之蓝牙外接设备

  Ios系统对于蓝牙外接设备在iphone4以前都是蓝牙2.0的时候,需要通过苹果的审核,据统计通过率仅有2%左右,现在蓝牙2.0基本上处于淘汰状态,所以在这里就不考虑了。   现在iphone4s以后的设备(包括iphone4s、iPhone5、iphone5s、iphone6、iphone6s)的设备中都使用的是蓝牙4.0,所以我们讲一下蓝牙4.0的外接设备的使用。   蓝牙4.0的设备...

weixin_34283445的博客 163

iOS中的蓝牙

iOS中的蓝牙 概述 iOS中提供了4个框架用于实现蓝牙连接 1.GameKit.framework(用法简单) 只能用于iOS设备之间的同个应用内连接,多用于游戏(eg.拳皇,棋牌类),从iOS7开始过期 2.MultipeerConnectivity.framework(代替1) 只能用于iOS设备之间的连接,从iOS7开始引入,主要用于非联网状态下,通过wifi或者蓝牙进行文件共享(...

weixin_30617561的博客 89

蓝牙4.0 For IOS

转自:http://see.sl088.com/wiki/%E8%93%9D%E7%89%994.0_For_IOS 目录   [隐藏]  1 发现2 调试用APP3 困扰4 NRF80025 一些研究 5.1 官方Demo 6 CC2570官方源码7 经验8 IOS蓝牙4.0支持9 IOS库支持10 官方文档说法11 其他研究12 

geeklyc 1121

iOS开发coreBluetooth框架相关

BLE(Bluetooth Low Energy),也称为蓝牙低功耗技术,是蓝牙标准的一个子集,设计用于支持低功耗、短距离无线通信的设备和应用。它主要用于电池供电的小型设备,并在保持连接时消耗极低的能量,适合于物联网(IoT)设备、穿戴式设备健康监测器、智能家居设备等应用场景。本文仅仅简单介绍了coreBluetooth框架的应用和前后台模式下的差异,如有错误,欢迎指出。

m0_43416443的博客 1690
上一篇: Android蓝牙健康设备开发:Health Device Profile(HDP)
下一篇: python文本相似度计算
Michael930905
博客等级 码龄9年 5粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值