Android蓝牙健康设备开发:Health Device Profile(HDP)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

最近按导师的要求做了个小项目:用Android手机跟蓝牙血压计通信。在网上查了很多资料,发现有许多文章是讲解Android蓝牙开发,但是在中文社区缺少针对实现HDP profile的蓝牙健康设备的文章,所以整理了相关知识和代码做一个总结。做了一点微小的贡献,谢谢大家。
1、相关概念
HDP:Health Device Profile顾名思义是针对蓝牙健康设备(如蓝牙血压计、蓝牙体重秤)的一个profile,由蓝牙技术联盟(Bluetooth SIG)发布。并不是所有蓝牙设备都可以采用HDP,只有经典蓝牙(BR/EDR)设备才可以。低功耗蓝牙设备,即蓝牙4.0及以上,采用的是GATT等profile。

上图是HDP的协议栈。在通信时,蓝牙健康设备作为source,Android手机作为sink。图中L2CAP、SDP、MCAP是蓝牙通信的底层协议,中间是IEEE11073协议。11073是IEEE发布的一个健康设备的协议簇,其下包含了许多不同种类的健康设备协议,如11073-10407是血压计的协议。在数据传输时,手机与健康设备根据此协议来发送请求、解析数据等。最上层的application在本文中自然指的就是Android app。
Android蓝牙模块:android.bluetooth是蓝牙的开发包,里面包含了所有蓝牙相关的类,无论是经典蓝牙还是低功耗蓝牙。其中,本文重点关注的是BluetoothHealth这个类,还用到了一些蓝牙基础类BluetoothAdapter BluetoothDevice等,在这里就不展开介绍了。BluetoothHealth是在API14时引入的,所以系统版本高于14的Android手机都可以与采用HDP的健康设备通信。BluetoothHealth中包括了与HDP设备建立通信的API,具体请参见官方文档。在官方文档中有一个建立通信的流程:
1、调用getProfileProxy(Context, BluetoothProfile.ServiceListener, int)来获取代理对象的连接。
2、创建BluetoothHealthCallback回调,调用registerSinkAppConfiguration(String, int, BluetoothHealthCallback)注册一个sink端的应用程序配置。
3、将手机与健康设备配对,这一步一般在手机的“设置”中完成。
4、使用connectChannelToSource(BluetoothDevice, BluetoothHealthAppConfiguration)来建立一个与健康设备的通信channel。有的设备会自动建立通信,不需要在代码中调用这个方法。第二步中的回调会指示channel的状态变化。
5、用ParcelFileDescriptor来读取健康设备传来的数据,并根据IEEE 11073来解析数据。
6、通信结束后,关闭通信channel,注销应用程序配置。
看完这个流程是不是一脸懵逼?不要慌,这里官方文档实在太抽象了,必须要配合实际的代码才能看懂。
2、demo代码
项目的目标是与经典蓝牙血压计进行通信,获取血压计测量的数值和日期。这里血压计的型号是A&D UA-767PBT-C。项目中的代码是以github上这个项目为基础,根据需求进行修改而实现的。

项目结构

上图是项目的结构,非常简单,只有一个activity和一个service。activity与用户交互,service绑定在activity中与蓝牙血压计建立通信、交换数据。
首先AndroidManifest.xml中注册蓝牙权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

MainActivity

主要作用是显示血压计传过来的数据,以及绑定服务。
activity的布局如下:

demo.png

上半部分是一个ArrayList,用于显示手机所配对的蓝牙设备的名称和Mac地址。下半部分会显示一次血压测量的参数:收缩压、舒张压、心率、测量时间。

在MainActivity中一些重要私有变量:

private static final int REQUEST_ENABLE_BT = 1;  //用于打开手机蓝牙
private static final int HEALTH_PROFILE_SOURCE_DATA_TYPE = 0x1007;  //IEEE 11073中规定的血压数据类型
private BluetoothAdapter mBluetoothAdapter;
private Messenger mHealthService;  //用于与service通信
private boolean mHealthServiceBound; //用于判断service是否与此activity绑定

打开蓝牙:


       if (!mBluetoothAdapter.isEnabled()) {
            Intent enableIntent = new Intent(
                    BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        } else {
            initialize();
        }

启动服务:

            // Sets up communication with HDPService.
            private ServiceConnection mConnection = new ServiceConnection() {
                public void onServiceConnected(ComponentName name, IBinder service) {
                    mHealthServiceBound = true;
                    Message msg = Message.obtain(null,
                            HDPService.MSG_REG_CLIENT);
                    msg.replyTo = mMessenger;
                    mHealthService = new Messenger(service);
                    try {
                        mHealthService.send(msg);
                        //register blood pressure data type
                        sendMessage(HDPService.MSG_REG_HEALTH_APP,
                                HEALTH_PROFILE_SOURCE_DATA_TYPE);
                    } catch (RemoteException e) {
                        Log.w(TAG, "Unable to register client to service.");
                        e.printStackTrace();
                    }
                }

                public void onServiceDisconnected(ComponentName name) {
                    mHealthService = null;
                    mHealthServiceBound = false;
                }
            };
    private void initialize() {
        // Starts health service.
        Intent intent = new Intent(this, HDPService.class);
        //startService(intent);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

用handler和message来实现activity与service的通信:

    private Handler mIncomingHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
              ......
            }
        }
    };

    private final Messenger mMessenger = new Messenger(mIncomingHandler);

HDPService

这个service是核心部分,手机与蓝牙血压计的通信就是在此实现的。
service中部分重要私有变量:

    private BluetoothHealthAppConfiguration mHealthAppConfig; //BluetoothHealthAppConfiguration
    private BluetoothAdapter mBluetoothAdapter;  //BluetoothAdapter
    private Bluetoo
蓝牙HDP协议源码解析 1,概述 1.1 HDP协议 HDP协议: Health Device Profile健康设备协议 使用场景:支持各种蓝牙健康设备和手机进行通信 市场产品:广泛应用于各种智能穿戴设备,比如蓝牙健康手环,蓝牙血压计,蓝牙温度计,蓝牙电子称等各种健康设备。   1.2 代码路径 客户端: frameworks\base\core\java\android\bluetooth   Blu 阅读详情

相关推荐

蓝牙-电子血压计

实现目标: 1,连接血压计,获取到血压数值 2,连接任意的血压计,可以读取数据 原理:步骤: 1)添加权限 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission androi

m0_37618318的博客 2658

蓝牙协议详解.pdf

蓝牙协议详解,感觉需要了解蓝牙通讯的童鞋可以一看,缺点就是内容有点老了。

Android 蓝牙语音通话调试

顺便贴上可以测试蓝牙sco得apk,源码路径在Android12_R10\frameworks\base\media\tests\ScoAudioTest\src\com\android\scoaudiotest。10、A2DP_SINK 音频接收规范,用于接收传输来的音频数据并进行解码,还原出音频;2、A2DP (advanced audio distribution profile)高级音频及立体声规范,包括A2DP SINK和A2DP SOURCE。还可以通过腾讯会议测试进行语音通话。

hxHardway的博客 534

蓝牙协议规范2.1 3.0 4.0 4.1

本资源不同版本的蓝牙协议规范,包括蓝牙 2.1 BR/EDR 3.0 High Speed 4.0 BLE 4.1 I0T 希望这些规范文档对朋友们开发蓝牙驱动协议栈及应用有所帮助

Android蓝牙

Android平台提供了对蓝牙网络协议栈的支持,它允许设备通过无线的方式与其它设备进行数据交换。应用程序框架通过Android Bluetooth APIs提供了对蓝牙功能的访问。这些API允许应用以无线的方式连接其它蓝牙设备,启用点对点或者多点对多点的无线功能。使用蓝牙的API,Android应用程序可以执行以下工作: * 扫描其它蓝牙设备 * 查询本地蓝牙适配器以配对蓝牙设备 * 建

琴弦第七 4916

android蓝牙协议名词解释 OPP HFP HDP A2DP PAN

各种蓝牙协议的全称: OPP:对象存储规范(Object Push Profile),最为常见的,文件的传输都是使用此协议。 HFP:(Hands-free Profile),让蓝牙设备能够控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。 HDPHDP (Health Device Profile) 蓝牙医疗设备模...

aoe41606的博客 752

Hadoop学习笔记(HDP)-Part.01 关于HDP

Ambari是一种基于Web的工具,支持Apache Hadoop集群的创建、管理和监控。Ambari已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、Hbase、Zookeeper、Sqoop和Hcatalog等。Apache Ambari支持HDFS、MapReduce、Hive、Pig、Hbase、Zookeepr、Sqoop和Hcatalog等的集中管理。也是5个顶级hadoop管理工具之一。

glisten0317的博客 1389

Android的联通性---Bluetooth(七)

健康设备配置 Android4.0(APILevel 14)中引入了对Bluetooth Health Device ProfileHDP)支持,这回让你创建跟支持蓝牙健康设备进行蓝牙通信的应用程序,如心率监护仪、血压测量仪、体温计、体重秤等。Bluetooth Health API包含了BluetoothHealth、BluetoothHealthCallbackhe和Blueto

Gavin 1325

Android开发——蓝牙设备连接(四)

讲述蓝牙设备连接的方法,设备的自动连接,怎么区分蓝牙设备返回的数据,实现蓝牙信息和返回结果进行持久化等。

Mr_Four 1万+

蓝牙各个profile的功能

Android蓝牙、Framework

luyu22的博客 1111

Android 蓝牙协议配置讲解

本文的蓝牙介绍无关蓝牙版本是2.0还是5.0,是关于蓝牙某个功能使能的一个介绍。比如是否能接收文件,是否能接收/发送音频。本文内容可能对大部分普通蓝牙应用开发用处不大,但是对于拿到原厂板子开发,或者进行Android设备定制开发是要有一定帮助和值得了解的。...

wenzhi的博客 5733

蓝牙血压计android实现思路,蓝牙血压计方案

蓝牙血压计方案规格参数开机方式:按键开机显示精度:1mmHg(0.1Kpa)测量方法:示波法/降压式/升压式测量方式:上臂式/腕式压力传感器:电容式/电阻式数据传输方式:蓝牙单位:mmHg、Kpa记忆功能:2人各90组测量结果记忆(1-90-1),可根据Flash大小调整功耗:关机平均电流小于35uA关机时间:在开机状态下无任何操作1min自动关机低压检测:一点或两点检测按键种类:轻触、触摸、拨动...

weixin_42458128的博客 840

android 血压计开发,android 怎么用代码实现血压的测量

满意答案zxc0423682018.04.20采纳率:45%等级:12已帮助:9834人血压测量,手机应该没有配有这样的传感器吧。要测量血压,最起码需要相应的测量传感器。要测量血压只能使用手机连接外部设备再进行运行和显示,手机暂时不能单独做血压测量。FYI在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用。#define SENSOR_TYPE...

weixin_42525672的博客 738

蓝牙服务&功能

这阵子用到蓝牙比较多,想写一个专栏专门讲解蓝牙协议及其应用,本篇是第二篇文章,讲解蓝牙服务。参考网上各大神文章,及瑞萨的文章,参考GPT,并且加入了一些本人的理解。图片部分源自网络,侵删。有纰漏请指出,转载请说明。学习交流请发邮件 1280253714@qq.com。

weixin_45817947的博客 3333

Android蓝牙开发(一),两年Android开发经验

看到这篇文章的人不知道有多少是和我一样的Android程序员。35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。

m0_58269520的博客 532

Android】Bluetooth(蓝牙)连接与数据传输(一)

蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术(使用2.4~2.485GHz的ISM波段的UHF无线电波)连接。......

宾有为的博客 2万+
下一篇: CoreBluetooth连接蓝牙健康设备
Michael930905
博客等级 码龄9年 5粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值