2023年OH竞赛训练营行业使能赛题参赛作品:题目九病床巡检终端。 基于OpenHarmony 3.2Release开发,通过分布式软总线进行设备配对组网,根据蓝牙距离判断需同步设备并进行数据同步。
具体项目文档见仓库内文件README.assets/项目开发设计文档.docx
,附有演示pptREADME.assets/病床巡检终端.pptx
。
hap安装包见仓库发行版界面RoundAssistant 发行版
。
数字化技术正在蓬勃发展,医院的智慧化转型正在加速。物联终端接入、信息化诊疗的普及都在加速医院智慧化升级的步伐。心率、血氧、体温等基础病人数据是医生和护理人员衡量病人状态的关键指标,如何更快速更方便的获取病床上病人的这些数据,也成为智慧化医院所考虑的一项重要工作。
如图所示病房内有多张病床,每张病床配备有端侧设备收集病人的心率、血氧、体温等生理数据。医生手持端侧设备进行病房查房,端侧设备间可通过蓝牙进行连接。当其走到病人A床尾时,由于A端侧设备距离最近,自动通过病人A的端侧设备获取该病人的生理数据,进行检视判断。当其走到病人B床尾时,通过病人B的端侧设备获取该病人的生理数据。现用两台开发板设备模拟不同病人的端侧设备,用另一台开发板模拟医生手持设备实现该功能。
考虑赛题目标,我们在OpenHarmony v3.2Release版本下使用以下模块,来完成了对应目标:
1.使用@ohos.distributedHardware.deviceManager
模块实现了分布式设备管理,完成了设备组网配对的功能
2.使用@ohos.bluetoothManager
模块实现了蓝牙的BLE的扫描、广播功能,完成了依据信号强度判断最近距离设备的功能
3.使用了@ohos.data.distributedDataObject
模块实现了分布式数据对象的协同管理,完成了自动同步设备数据的功能
在此基础上,我们提供了ui界面,将APP分为病床端和医生端:在病床端进行BLE广播,以及数据的输入;在医生端进行设备管理,BLE扫描以及数据同步与显示。除此之外实现了权限的管理,在程序运行开始时会询问用户来获得权限。特别的是,我们还实现了设备切换的防抖动,在距离最近的设备1s内没有发生改变后将当前数据同步设备进行切换,防止了同步设备的频繁切换。
依据病床巡检终端的使用背景、描述以及完成目标,我们将病床巡检终端按需求分为以下几点:
根据以上需求分析我们结合OpenHarmony系统库提出了对应的解决方案:
@ohos.distributedHardware.deviceManager
解决,该模块提供分布式设备管理能力。系统应用可调用接口实现如下功能:
注册和解除注册设备上下线变化监听
发现周边不可信设备
认证和取消认证设备
查询可信设备列表
查询本地设备信息,包括设备名称,设备类型和设备标识
发布设备发现
@ohos.bluetoothManager
解决,该模块提供了基础的传统蓝牙能力以及BLE的扫描、广播等功能。@ohos.data.distributedDataObject
解决,该模块提供管理基本数据对象的相关能力,包括创建、查询、删除、修改、订阅等;同时支持相同应用多设备间的分布式数据对象协同能力。用户使用流程如下图所示
─main
│ module.json5 //配置文件
│
├─ets
│ ├─common
│ │ ListDeviceView.ets //单一设备渲染
│ │ TitleBarComponent.ets //包含设备管理页面入口的标题栏组件
│ │
│ ├─entryability
│ │ EntryAbility.ts //程序入口类
│ │
│ ├─model
│ │ blescanner.ts //ble扫描类
│ │ gattserver.ets //gatt server类
│ │ data_collector.ets //数据接口
│ │ RemoteDeviceModel.ets //分布式设备管理类
│ │
│ ├─pages
│ │ DeviceManager.ets //设备管理页
│ │ Monitor.ets //病床端主页
│ │ Rounder.ets //医生端主页
│ │ welcome.ets //首页
│ │
│ └─util
│ constant.ets //常量
│ Logger.ts //日志类
│
└─resources
├─base
│ ├─element
│ ├─media
│ │
│ └─profile
│ main_pages.json
├─en_US
├─rawfile
└─zh_CN
welcome.ets
;在aboutTOAppear
先进行权限验证;在UI中提供两个按钮实现跳转病床端主页或医生端主页。Monitor.ets
;创建了distributedDataObject
类对象进行数据同步;在aboutTOAppear()
开启了BLE蓝牙广播;在aboutTODisppear()
中进行关闭广播。Rounder.ets
;提供了挑战至设备管理页的按钮;创建了distributedDataObject
类对象进行数据同步;在aboutToAppear()
中进行蓝牙扫描,并对扫描事件进行监听,在信号最强的设备发生改变时更改同步数据的设备,同时实现了防抖动的设计;在UI中使用了标题栏组件,并进行了当前同步数据的显示;在onDestroy()
中进行了remoteDeviceModel
的各监听的停止。DeviceManager.ets
;在aboutToAppear()
中进行了RemoteDeviceModel.ets
的创建,在build()
中实现了发现设备列表的显示,以及已认证设备列表的显示,除此之外,通过该页面上的交互,还可以调用设备管理模型中对应函数,实现允许本机被发现,不允许本机被发现,进行设备发现,停止设备发现,进行设备认证,取消设备认证的操作。RemoteDeviceModel.ets
;导入了分布式设备管理库import deviceManager from '@ohos.distributedHardware.deviceManager'
;
创建了DeviceManager
类对象,trustedDeviceList
保存认证设备列表,discoverList
保存发现设备列表;
主要使用了deviceManager
下的createDeviceManager()
方法,以及DeviceManager
类下的startDeviceDiscovery()
,getTrustedDeviceListSync()
,on('deviceStateChange', ())
,on('deviceFound', ())
,on('discoverFail', ())
,on('serviceDie', ())
,authenticateDevice()
等方法,实现了分布式设备组网。
分布式数据对象模块:在Monitor.ets
,Rounder.ets
都有使用;
导入了分布式数据对象库import distributedDataObject from '@ohos.data.distributedDataObject'
;
创建了DataObject
类对象;
使用了distributedDataObject
的create()
方法,以及DataObject
类下的setSessionId()
,on('change')
,等方法,实现了医生端设备及时与对应的病床端设备进行数据同步。
蓝牙模块:gattserver.ets
,blescanner.ts
;
导入了蓝牙管理库import bluetoothManager from '@ohos.bluetoothManager'
;
在blescanner.ts
中主要使用了bluetoothManager
下BLE
类的startBLEScan()
,on("BLEDeviceFind", ())
方法,实现了BLE蓝牙的扫描,以及扫描事件发生的监听。
在gattserver.ets
中主要使用了bluetoothManager
下BLE
类的createGattServer()
创建了GattServer
类对象,并使用了bluetoothManager
下gattServer
类的startAdvertising()
,stopAdvertising()
方法实现了广播。
Logger.ts
;进行日志的打印。constant.ets
;保存一些常量。本应用界面便于用户交互,有以下特点:
@State
装饰器以及低延迟的数据同步,应用能够实时获取和更新病人的生理数据,并在界面上进行实时刷新。当病人的数据发生变化时,系统应立即更新相应的数据显示,以便医生能够及时获取最新的数据状态。并且实时刷新的速度较快,保证了数据的实时性和准确性。本应用在设计后发现医生端设备在距离多个病床端设备距离相对一致时,容易发生同步设备频繁切换的现象,为了解决这一问题,我们进行了防抖动设计。
在防抖动设计中主要使用了计时器的功能,当检测到距离最近设备与当前设备不一致时,开始打开计时器,准备在1s后进行切换,此时再接收到距离最近设备与准备切换的设备不一致的信息时,就会清空计时器,防止了设备的频繁切换,而如果信号稳定,始终为新的设备,则进行切换。
蓝牙测距功能实现:
设备配置:
广播数据包:
00001889-0000-1000-8000-00805f9b34fb
,即0x1889,对应的serviceValue表示设备的id。医生设备端扫描与过滤:
获取、解析广播报文,确定设备距离:
通过以上步骤,蓝牙测距功能可以实现病床设备端与医生设备端之间的距离测量。
本项目对数据采集提供接口,数据采集模块接口采用依赖注入模式,位于data_c.ets
中,只需根据不同设备实现不同的collector即可。目前实现了模拟采集数据的collector,即随机生成数据的rand_gen()
函数,该函数随机生成数据并返回数据,在Moniter.ets
中该函数被调用。对应的可以在data_collector.ets
中编写函数返回收集到的数据,在Moniter.ets
中调用。数据中主要包括4个key-value对,4个键值分别为heart_beat(心率), oximetry(血氧), temperature(温度), icon_color(图标颜色)
本应用接受广播信号日志如下图所示,1秒内检测最近距离设备约20次。距离刷新率约为20hz。
本应用消耗内存与CPU情况如下图,大约消耗30MB内存。注意当应用在主界面时内存占用较少,进入病床端时内存占用少量增加,当进入医生端时内存消耗达到最高。
1.本应用可以进行了分布式组网的认证调用,通过PIN码来进行认证,保证了设备认证的安全性。
2.本应用在权限管理上实现了应用安装后第一次使用时,申请对应权限,并将其保存,下次启动无需再次给予权限,保证了权限分配的安全性。
支持中文与英文语言。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。