Android移动医疗应用开发 课件 第5-12章 打包解包小工具设计实验- 心电监测与显示实验_第1页
Android移动医疗应用开发 课件 第5-12章 打包解包小工具设计实验- 心电监测与显示实验_第2页
Android移动医疗应用开发 课件 第5-12章 打包解包小工具设计实验- 心电监测与显示实验_第3页
Android移动医疗应用开发 课件 第5-12章 打包解包小工具设计实验- 心电监测与显示实验_第4页
Android移动医疗应用开发 课件 第5-12章 打包解包小工具设计实验- 心电监测与显示实验_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

安卓移动医疗应用开发打包解包小工具设计实验05Contents.1实验内容2实验原理3代码分析主从机交互简介打包解包框架图PCT通信协议简介PCT通信协议之打包过程PCT通信协议之解包过程相对布局管理器1.实验内容

学习PCT通信协议,以及Android中的部分控件,如文本表示框(TextView)、文本编辑框(EditText)和按钮(Button)等。设计一个打包解包小工具,在文本编辑框中输入模块ID、二级ID以及6字节数据后,通过“打包”按钮实现打包操作,并将打包结果显示到打包结果显示区。另外,还可以根据用户输入的10字节待解包数据,通过“解包”按钮实现解包操作,并将解包结果显示到解包结果显示区。2.实验原理2.1主从机交互简介从机:常常被作为执行单元,用于处理一些具体的事务主机与从机交互示意图主机:如Windows平台、Linux平台、Android平台和emWin平台等用于与从机进行交互,向从机发送命令,或处理来自从机的数据2.实验原理2.2打包解包框架图主机向从机发送命令的具体过程是:主机对待发命令进行打包;主机通过通信模块,如串口、USB、蓝牙、Wi-Fi等将打包好的命令发送出去;从机在接收到命令之后,对命令进行解包;从机按照相应的命令执行任务。

从机向主机发送数据的具体过程是:从机对待发数据进行打包;从机通过通信模块,如串口、USB、蓝牙、Wi-Fi等将打包好的数据发送出去;主机在接收到数据之后,对数据进行解包;主机对接收到的数据进行处理,如计算、显示等2.实验原理2.3PCT通信协议简介PCT通信协议规定:(1)一个数据包由1字节模块ID+1字节数据头+1字节二级ID+6字节数据+1字节校验和构成,共计10个字节;(2)一个数据包中有6个数据,每个数据为1字节;(3)模块ID的最高位bit7固定为0,取值范围为0x00-0x7F,最多128种类型;2.实验原理2.3PCT通信协议简介PCT通信协议规定:(4)数据头的最高位bit7固定为1,数据头的低7位按照从最低位到最高位顺序,依次存放二级ID的最高位bit7、数据1的最高位bit7、数据2的最高位bit7、数据3的最高位bit7、数据4的最高位bit7、数据5的最高位bit7和数据6的最高位bit7;(5)二级ID、数据1、数据2、数据3、数据4、数据5、数据6和校验和的最高位bit7固定为1;(6)校验和低七位为模块ID+数据头+二级ID+数据1+数据2+...+数据6求和的结果(取低7位)。2.实验原理2.4PCT通信协议之打包过程第1步:准备原始数据。原始数据由模块ID(0x00~0x7F)、二级ID、数据1、数据2、数据3、数据4、数据5和数据6组成,如下图所示。其中,模块ID的取值范围为0x00~0x7F,二级ID和数据的取值范围为0x00~0xFF。PCT通信协议的打包过程分为4步:2.实验原理2.4PCT通信协议之打包过程第2步:计算数据头。依次取出二级ID、数据1、数据2、数据3、数据4、数据5和数据6的最高位bit7,将其存放于数据头的低7位,按照从最低位到最高位的顺序依次存放二级ID、数据1、数据2、数据3、数据4、数据5和数据6的最高位bit7,如下图所示。2.实验原理2.4PCT通信协议之打包过程第3步:计算校验和。对模块ID、数据头、二级ID、数据1、数据2、数据3、数据4、数据5和数据6的低7位求和,取求和结果的低7位,将其存放于校验和的低7位,如下图所示。2.实验原理2.4PCT通信协议之打包过程第4步:最高位置1。将数据头、二级ID、数据1、数据2、数据3、数据4、数据5、数据6和校验和的最高位置为1,如下图所示。2.实验原理2.5PCT通信协议之解包过程第1步:准备解包前的数据包。原始数据包由模块ID、数据头、二级ID、数据1、数据2、数据3、数据4、数据5、数据6和校验和组成,如下图所示。其中,模块ID的最高位为0,其余字节的最高位均为1。PCT通信协议的解包过程也分为4步:2.实验原理2.5PCT通信协议之解包过程第2步:数据校验。对模块ID、数据头、二级ID、数据1、数据2、数据3、数据4、数据5和数据6的最低7位求和,如下图所示,取求和结果的低7位与数据包的校验和低7位对比,如果两个值的结果相等,则说明校验正确。2.实验原理2.5PCT通信协议之解包过程第3步:计算二级ID和最终数据。数据头的最低位bit0与二级ID的低7位拼接之后作为最终的二级ID,数据头的bit1与数据1的低7位拼接之后作为最终的数据1,数据头的bit2与数据2的低7位拼接之后作为最终的数据2,以此类推,如下图所示。2.实验原理2.5PCT通信协议之解包过程第4步:得到解包后的数据。下图即为解包之后的结果,由模块ID、二级ID、数据1、数据2、数据3、数据4、数据5和数据6组成。其中,模块ID的取值范围为0x00~0x7F,二级ID和数据的取值范围为0x00~0xFF。2.实验原理2.6相对布局管理器XML布局文件中定义相对布局管理器的基本语法格式为:<RelativeLayoutxmlns:android="/apk/res/android"属性列表></RelativeLayout>XML属性描述android:layout_alignLeft属性值为其他控件的ID,指定该控件与哪个控件左边界对齐android:layout_alignRight属性值为其他控件的ID,指定该控件与哪个控件右边界对齐android:layout_below属性值为其他控件的ID,指定该控件位于哪个控件的下方android:layout_above属性值为其他控件的ID,指定该控件位于哪个控件的上方android:layout_toLeftOf属性值为其他控件的ID,指定该控件位于哪个控件的左侧android:layout_toRightOf属性值为其他控件的ID,指定该控件位于哪个控件的右侧android:layout_marginTop设置顶外边距,与上方控件的距离android:layout_marginLeft设置左外边距,与左侧控件的距离RelativeLayout.LayoutParams中常用的XML属性如下表:3.代码分析3.1设计框图3.代码分析3.2PackUnpack.java文件方法说明publicPackUnpack()构造方法,对模块进行初始化publicvoidpackData(int[]packet)packet数组长度为10,待打包的数据必须是8字节,模块ID必须是0x00到0x7FpublicbooleanunPackData(intdata)通过该方法逐个对数据进行解包和判断,接收到完整的数据包返回true。解包后的数据通过getUnPackResult()方法获取publicint[]getUnPackResult()返回值为获得解包后的数据包安卓移动医疗应用开发蓝牙通讯小工具设计实验06Contents.1实验内容2实验原理3代码分析线性布局管理器经典蓝牙通讯流程蓝牙权限BluetoothAdapter类的用法BluetoothDevice类的用法蓝牙套接字Android中的IO反射Handler内存泄露的处理Bundle用法synchronized的用法增强for循环遍历set集合中的元素StringBuilder的用法1.实验内容学习蓝牙通讯使用到的相关知识点,了解蓝牙通讯过程,然后通过AndroidStudio完成蓝牙应用的界面布局,并依据本章完善蓝牙通讯程序,设计出一个蓝牙通讯App。扫描设备数据收发蓝牙主界面蓝牙使用界面2.实验原理2.1线性布局管理器线性布局(LinearLayout)指将控件按照垂直或水平方向布局,控件一个紧挨着一个排列XML属性描述android:orientation指定布局管理器内控件的排列方式,可选horizontal(水平排列)和vertical(垂直排列)android:background指定控件的背景,可以是背景图片或颜色。android:visible指定控件是否可见,true可见,false不可见android:paddingLeft属性值为距离值,指定距离父布局左边界的距离android:textColor指定控件字体颜色,可使用android:textColor=“@color/colort_white”蓝牙通讯工程布局中的XML属性对比相对布局?线性布局整齐相对布局复杂2.实验原理2.2经典蓝牙通讯流程声明蓝牙权限:Android6.0(API23)开始需要使用位置权限获取蓝牙适配器并打开蓝牙搜索设备:BluetoothAdapter类,BluetoothDevice类定义广播接收:扫描状态、发现蓝牙设备、蓝牙设备连接状态蓝牙设备的配对/绑定:反射建立连接:BluetoothSocket类;客户端,服务端数据通讯:AndroidIO(InputStream和OutputStream类)客户端(安卓APP)服务端(人体生理参数监测系统)扫描蓝牙完成的广播:BluetoothAdapter.ACTION_DISCOVERY_FINISHED发现一个可用蓝牙设备的广播:BluetoothDevice.ACTION_FOUND蓝牙设备连接状态改变的广播:BluetoothDevice.ACTION_BOND_STATE_CHANGED蓝牙相关广播:2.实验原理2.3蓝牙权限权限权限名权限等级使用说明作用蓝牙权限BLUETOOTHnormal级在Manifest里面声明请求/接收连接数据传输BLUETOOTH_ADMIN初始化设备查找控制蓝牙设置位置权限ACCESS_COARSE_LOCATIONdangerous级6.0及后续版本除了蓝牙权限还需申请位置权限位置权限除了需要在Manifest里声明之外,还需要在代码中进行动态申请通过WiFi或移动基站获取粗略定位(误差在30~1500米)ACCESS_FINE_LOCATIONGPS精确定位(精度10米以内)2.实验原理2.4BluetoothAdapter类的用法BluetoothAdapter类的介绍:

本地蓝牙适配器,是所有蓝牙交互操作的入口点,表示蓝牙设备自身的一个蓝牙设备适配器,整个系统只有一个蓝牙适配器。通过它可以发现其他蓝牙设备,查询绑定配对设备的列表,使用已知的Mac地址实例化BluetoothDevice以及创建BluetoothServerSocket用来侦听来自其他设备的通信。BluetoothAdapter类中蓝牙操作的相关方法:获取本地蓝牙适配器:getDefaultAdapter(

)启动扫描设备:startDiscovery(

)取消扫描设备:cancelDiscovery(

)获取已配对设备:getBondedDevices(

)通过mac蓝牙地址获取蓝牙设备:getRemoteDevice(Stringaddress)创建一个监听连接(作为服务端连接):listenUsingRfcommWithServiceRecord(

)2.实验原理2.5BluetoothDevice类的用法BluetoothDevice对象的获取途径:

调用BluetoothAdapter的getRemoteDevice(address)方法获取物理地址对应的该类对象调用BluetoothAdapter的getBoundedDevices()方法,可以获取已经配对的蓝牙设备集合BluetoothDevice类的相关方法:获取设备名称:getName()获取设备地址:getAddress()绑定/配对设备:createBond()获取绑定状态:getBondState()通过UUID获取一个BluetoothSocket对象:BluetoothSocketcreateRfcommSocketToServiceRecord(UUID)BluetoothDevice类的介绍:

表示远程的蓝牙设备,利用它可以通过BluetoothSocket请求与某个远程设备建立连接,或查询有关该设备的信息,例如设备的名称、地址、绑定状态等。2.实验原理2.6蓝牙套接字客户端(APP)获取BluetoothSocket端口发起连接通过socket的connect()方法打开数据流通过socket获取InputStream和OutputStream类,使用输入输出流对应的方法与其他蓝牙设备进行通讯服务端(监测系统)获取BluetoothServerSocket端口侦听连接请求通过socket的accept()方法接受连接,然后返回已连接的BluetoothSocket。打开数据流BluetoothSocket:表示蓝牙套接字接口。BluetoothServerSocket:表示用于侦听传入请求的蓝牙服务器套接字。蓝牙串口服务的通用唯一识别码UUID注意:connect()和accept()是阻塞调用,因此应始终在主Activity(界面)线程以外的线程中执行此步骤允许应用使用InputStream和OutputStream与其他蓝牙设备交换数据的连接点。2.实验原理2.7Android中的IOAndroid的网络通信、文字读写都会用到输入输出流(IO流)来进行操作。IO流的根类: 输入流—InputStream,其中包含read(byte[])方法 输出流—OutputStream,其中包含write(byte[])方法注意:read(byte[])和write(byte[])方法都是阻塞调用。read(byte[])方法将会阻塞,直至从数据流中读取数据。write(byte[])方法通常不会阻塞,但若远程设备调用read(byte[])方法的速度不够快,进而导致中间缓冲区已满,则该方法可能会保持阻塞状态以实现流量控制。IO流按流向分类:输入流和输出流 输入流—用于读文件或外部设备,并将读到的数据暂存到内存 输出流—用于写文件或外部设备,并将内存中的数据存入到文件或外设IO流传输方式: 字节流(用于读写二进制数据、任何类型文件及外设数据),以字节为读写单位2.实验原理2.8反射使用class对象之获取某个成员方法:获取指定名称的方法: MethodgetMethod(Stringname,类<?>...parameterTypes)

参数介绍:name-方法名;parameterTypes-参数类型的类执行方法:

ObjectMethod.invoke(Objectobj,Object...args)

参数介绍:obj-对象名;args-参数使用场景:使用反射调用createBond()方法。API19(Android4.4)之前该方法为@hide的,代表编译时不对外公开该方法,但是运行时可以访问到,这种情况使用反射可以调用createBond()方法。反射的概念:在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。好处:在程序运行过程中,操作这些对象。解决版本兼容的问题,可以低版本SDK开发的代码中访问不对外公开的方法。获取class对象的方式:类名.class,通过类名的属性class获取2.实验原理2.9Handler内存泄露的处理内存泄露的原因:GC垃圾回收机制不会回收还存在引用的Activity。导致本该被回收的Activity停留在内存中,产生内存泄露。在java中非静态内部类和匿名内部类都会隐式持有当前类的外部引用;Handler是非静态内部类,所以其持有当前Activity的隐式引用;GC垃圾回收机制不会回收还存在引用的Activity。当Activity不再使用需要被回收时,如果Handler没有被释放,会导致本该被回收的Activity停留在内存中,产生内存泄露。解决方案:方法一:通过程序逻辑来进行保护。在Activity被销毁时,在onDestroy()中调用Handler的removeCallbacksAndMessages()方法,把消息对象从消息队列移除。方法二:将Handler声明为静态类。静态的内部类不会持有外部类的引用,但当handler不再持有外部类对象的引用时,导致程序不允许在handler中操作Activity中的对象,需要在handler中增加一个对Activity的弱引用。2.实验原理2.10Bundle用法Bundle介绍:Bundle经常使用在Activity之间或者线程间传递数据。它保存的数据,是以key-value(键值对)的形式存在的。传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。以传递字符串类型数据为例:Messagemsg=myHandler.obtainMessage(intwhat);Bundlebundle=newBundle();bundle.putString("key1","value1");bundle.putString("key2","value2");msg.setData(bundle);myHandler.sendMessage(msg);HandlermyHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseMESSAGE_TOAST_1:

Toast.makeText(getApplicationContext(),msg.getData().getString("key1"),Toast.LENGTH_LONG);break;default:break;}}}Bundle提供putString()和getString()方法用来读写基本数据类型Message提供setData()和getData()方法用来发送和获取bundle对象2.实验原理2.11synchronized的用法synchronized介绍:synchronized是Java中的关键字,是一种同步锁,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;修饰一个普通方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;

synchronized(this){//同步代码块}修饰代码块:修饰符synchronized返回值

方法名(){//方法体}修饰普通方法:2.实验原理2.12增强for循环遍历set集合中的元素Android中List、Set、Map数据结构数据结构特点List有序集合,允许元素重复Set无序集合,不能有相同的元素Map使用键值对的方式来存储数据,键不能有重复,值可以重复for(数据类型变量:集合){//这里写要遍历的元素,或者所需要的代码即可}增强for循环的语法结构:2.实验原理2.13StringBuilder的用法String,StringBuffer与StringBuilder的区别类型分类特点使用场景推荐String字符串常量String的值不可变单次操作字符串StringBuffer字符串变量可对字符串进行修改,是线程安全的,速度慢多线程操作字符串StringBuilder字符串变量可对字符串进行修改,是线程不安全的,速度快单线程操作字符串StringBuilder的相关方法追加字符串:publicStringBuilder

append(Stringstr);返回String对象:publicStringtoString();3.代码分析3.1设计框图3.代码分析3.2BluetoothService.java文件方法说明publicBluetoothService(Contextcontext,Handlerhandler)构造方法,模块间传递数据publicsynchronizedintgetState()获取蓝牙连接状态publicsynchronizedvoidconnect(BluetoothDevicedevice)作为客户端连接蓝牙设备publicsynchronizedvoidstart()开始服务端监听线程publicvoidwrite(byte[]out)发送数据publicsynchronizedvoidstop()停止连接线程和数据流线程安卓移动医疗应用开发人体生理参数监测系统软件平台布局实验07Contents.1实验内容2实验原理3代码分析嵌套布局android:layout_weight的介绍图像资源的介绍更改Layout预览设置1.实验内容

布局方式有线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)、表格布局(TableLayout),本章主要要求熟练掌握常用的线性布局与相对布局的用法,然后基于文档完成人体生理参数监测平台的界面布局。2.实验原理2.1嵌套布局主界面使用相对布局管理器,再嵌套参数显示线性布局、波形显示线性布局。新增XML属性XML属性描述android:layout_alignParentRight属性值为ture或false,设置控件的右边缘和父控件的右边缘对齐android:gravity设置控件内容的对齐规则,即文本内容显示在控件中的位置android:layout_weight设置控件的比例,通常是在线性布局下使用该属性嵌套布局2.实验原理2.2android:layout_weight的介绍控件权重

weight1:weight2:weight3=1:2:3条件:水平(horizontal)摆放的控件控件宽度的layout_width属性为wrap_content效果:系统首先会给控件分配宽度值(足以包含控件文本内容)然后会把剩下的屏幕空间按照weight1:weight2:weight3比例分配给控件2.实验原理2.2android:layout_weight的介绍条件:水平(horizontal)摆放的控件控件宽度的layout_width属性为match_parent计算控件比例:剩余空间=1个parent_width-3个parent_width=-2个parent_width第一个TextView的实际所占宽度:parent_width+1/5(所占剩余空间的权重比例)×剩余空间大小(-2parent_width)=3/5parent_width第二个TextView的实际所占宽度:parent_width+2/5(所占剩余空间的权重比例)×剩余空间大小(-2parent_width)=1/5parent_width第三个TextView的实际所占宽度也为1/5parent_width控件权重weight1:weight2:weight3=1:2:2实际显示出来的控件比例3:1:12.实验原理2.3图像资源的介绍图像资源drawable将扩展名为.png、.jpg和.gif的图片资源复制到res/drawable目录中,可以用作屏幕或按钮的背景。示例:使用drawable资源作按钮背景 android:background=“@drawable/图片名称”drawable资源与mipmap资源的使用建议建议把App的启动图标放到mipmap目录中,把其他图片资源放在drawable目录下2.实验原理2.4更改Layout预览设置预览主题选择无标题的主题:切换主题为NoTitleBar代码也需要进行同步修改,以保持实际效果跟预览一致。想要删除Android手机上的标题栏,需要修改App引用的styles.xml文件中的主题,在style标签中添加:

<itemname="android:windowNoTitle">true</item>2.实验原理2.4更改Layout预览设置预览方式改为横向:代码也需要进行同步修改,以保持实际效果跟预览一致。需要在AndroidManifest.xml文件中进行配置,将activity的属性设置为横屏,在activity的属性位置添加:android:screenOrientation="landscape"3.代码分析3.1设计框图3.代码分析3.2实验步骤新建工程完善color.xml文件复制图标更改预览设置:选主题、更改预览方式为横向完善配置文件:删除标题栏、设置横屏显示完善布局文件3.代码分析3.3五参界面介绍心电参数:主要包括心率、导联状态和心跳信息。其中,心率是解析得到的心率值,心电导联包括RA、LA、LL和V,若某一导联脱落,则显示红色,反之显示绿色,心跳控件为心形图标,每1s闪烁一次。体温参数:主要包括体温通道1和通道2的体温值和导联信息。其中,体温值是解析得到的体温计算结果,导联信息指示体温探头与人体生理参数监测系统是否连接,若探头未连接,显示红色T1脱落或T2脱落,反之则显示白色的T1导联或者T2导联。3.代码分析3.3五参界面介绍血氧参数:主要包括血氧饱和度、脉率和手指导联信息。其中,血氧饱和度是解析得到的血氧饱和度结果,脉率是解析得到的脉率值,手指导联信息指示手指是否脱落,若手指脱落,显示红色OFF,反之则显示蓝色ON。血压参数:主要包括收缩压、舒张压、平均压、脉率和实时袖带压。其中,收缩压、平均压和舒张压是解析得到的三压值,脉率是解析得到的脉率值,实时袖带压是解析得到的动态袖带压力值,在测量过程中会实时进行显示。另外,启动/停止血压测量按钮在界面上是一个血压测量图标,用户可以通过单击该图标启动和停止血压测量。呼吸参数:主要包括呼吸率,呼吸率是解析得到的呼吸率值。安卓移动医疗应用开发体温监测与显示实验08Contents.1实验内容2实验原理3代码分析常见体温计PCT协议-体温使用Runable创建线程定时线程池1.实验内容

了解体温数据处理过程,学习体温数据包的PCT协议和AndroidStudio中的部分函数和命令,然后完善处理体温数据的底层代码,最后通过安卓手机对系统进行验证。单击bt按钮,连接蓝牙,连接成功后蓝牙按钮变成绿色。将人体生理参数监测系统硬件平台设置为输出体温数据,单击start按钮开始监测,即可看到体温值和导联状态。2.实验原理2.1常见体温计水银体温计价格便宜易破裂(水银有毒)准确度高测温时间长热敏电阻电子体温计价格较高测量安全测量精度高读数方便体积小测温时间长非接触式红外体温计价格较高测量安全准确度不高读数方便稳定性好使用方便快速测量2.实验原理2.2PCT协议-体温位解释说明7:2保留1体温通道2:0-体温探头接上;1-体温探头脱落0体温通道1:0-体温探头接上;1-体温探头脱落体温探头状态的解释说明体温数据为16位有符号数,有效数据范围为0~500,数据扩大10倍,单位是摄氏度。例如,368代表36.8℃,-100代表无效数据2.实验原理2.3使用Runable创建线程Java创建线程有两个方法,一种是继承Thread类,一种是实现Runnable接口//定义实现Runable接口classMyRunnableimplementsRunnable{

@Overridepublicsynchronizedvoidrun(){//重写run方法

//执行任务}}//创建Runnable实例对象MyRunnablemyRunnable=newMyRunnable();

//用该实例作为Thread的参数来创建Thread对象Threadthread=newThread(myRunnable);//调用start()方法启动线程thread.start();

2.实验原理2.4定时线程池使用线程池的好处重用已经创建好的线程,避免频繁创建进而导致的频繁垃圾回收控制线程并发数,合理使用系统资源,提高应用性能可以有效的控制线程的执行,比如定时执行,取消执行等核心线程和非核心线程核心线程:固定线程数,可闲置,没有任务时不会被销毁非核心线程:有存活时间,超过最大闲置时间会被回收线程池的简要介绍2.实验原理2.4定时线程池定时线程池(ScheduledThreadPool)的介绍:一个具有定时定期执行任务功能的线程池参数说明:command指定任务initialDelay为延迟时间period为周期unit为时间单位使用说明:第一次执行任务的时间点为initialDelay第二次为initialDelay+period第三次为initialDelay+period+period,以此类推。添加延迟定时执行任务:scheduleAtFixedRate(Runnablecommand,longinitialDelay,longperiod,TimeUnitunit);

定时线程池的创建:使用ScheduledThreadPoolExecutor类创建定时线程池,在构造方法中传入核心线程的数量,但是非核心线程是无限制,当非核心线程闲置时,则会被回收。构造方法:publicScheduledThreadPoolExecutor(intcorePoolSize)3.代码分析3.1设计框图安卓移动医疗应用开发血压监测与显示实验09Contents.1实验内容2实验原理3代码分析血压介绍血压测量原理:柯式音法血压测量原理:示波法PCT协议-血压1.实验内容将人体生理参数监测系统硬件平台设置为输出血压数据,单击start按钮开始监测,最后单击血压测量图标,即可看到动态变化的袖带压,以及最终的收缩压、舒张压、平均压和脉率

了解血压数据处理过程,学习血压数据包的PCT协议和AndroidStudio中的部分函数和命令,然后完善处理血压数据的底层代码,最后通过安卓手机对系统进行验证。2.实验原理2.1血压介绍血压的含义:是指血液在血管内流动时作用于血管壁单位面积的侧压力,它是推动血液在血管内流动的动力,通常所说的血压是指体循环的动脉血压。常见血压计:电子血压计水银血压计正常成人安静状态下血压测量范围新生儿血压范围收缩压90-139mmHg70-100mmHg舒张压60-89mmHg34-45mmHg测量范围:血压测量方法直接测量法:有创就,一般只用于危重病人间接测量法:无创,有柯式音法、示波法等2.实验原理2.2血压测量原理:柯式音法80120舒张压:人体心脏舒张时动脉血管弹性回缩,这时产生的压力称为舒张压,又叫做低压收缩压:当人的心脏收缩时血液从心脏泵出,对血管内壁产生的压力称为收缩压,也叫做高压将袖带压上升到听不到肱动脉的声音,水银柱再上升20-30mmHg,缓慢放气听到第一声声响的数值为收缩压,声音消失的数值为舒张压2.实验原理2.3血压测量原理:示波法2.实验原理2.4PCT协议-血压(接收数据)无创血压实时数据包无创血压测量结束数据包无创血压测量结果1数据包无创血压测量结果2数据包2.实验原理2.4PCT协议-血压(发送命令)无创血压启动测量命令包无创血压终止测量命令包3.代码分析3.1设计框图安卓移动医疗应用开发呼吸监测与显示实验10Contents.1实验内容2实验原理3代码分析呼吸介绍呼吸测量原理PCT协议-呼吸SurfaceView画图画图相关方法介绍1.实验内容将人体生理参数监测系统硬件平台设置为输出呼吸数据,单击start按钮开始监测,即可看到动态显示的呼吸波形以及呼吸率了解呼吸数据处理过程,学习呼吸数据包的PCT协议和AndroidStudio中的部分方法和命令,并学习如何通过AndroidStudio画呼吸波形图,然后完善处理呼吸数据的底层代码,最后通过安卓手机对系统进行验证。2.实验原理2.1呼吸介绍呼吸的含义:呼吸是人体得到氧气输出二氧化碳,调解酸碱平衡的一个新陈代谢过程。常见测量方法:呼吸频率范围:成人12~18次/分钟;新生儿60~70次/分钟热敏式呼吸测量阻抗式呼吸测量2.实验原理2.2呼吸测量原理:阻抗式呼吸测量法生物组织阻抗模型Re细胞外液电阻Ri细胞内液电阻Cm细胞膜等效电容

人体中血液、骨骼、脂肪、肌肉、皮肤等组织具有不同的导电性,阻抗最小的是血液和体液,阻抗最大的是骨骼和空气。阻抗式呼吸检测方法是将胸腔测量区域等效为一个介质均匀、阻抗均匀分布的整体。引起胸阻抗变化的主要因素是呼吸运动,人体呼吸时空气会进入或排出肺泡,引起人体胸腔容积增大或缩小,由此导致人体胸阻抗的大小发生变化。因此基于此原理检测人体胸阻抗的变化规律,就可以间接监测人体呼吸。2.实验原理2.3PCT协议-呼吸呼吸波形数据包呼吸率数据包2.实验原理2.4SurfaceView画图SurfaceView的使用原理Surface:管理数据的地方SurfaceView:展示数据的地方SurfaceHolder:是一个接口,其作用就像一个关于Surface的监听器,提供访问和控制SurfaceView背后的Surface相关的方法。它通过三个回调方法,让我们可以感知到Surface的创建、销毁或者改变。在SurfaceView中有一个方法getHolder,可以很方便地获得SurfaceView背后的Surface所对应的SurfaceHolder。2.实验原理2.4SurfaceView画图Surface、SurfaceView和SurfaceHolder之间的关系2.实验原理2.4SurfaceView画图SurfaceView的使用步骤获取到SurfaceView对应的SurfaceHolder,然后给SurfaceHolder添加一个SurfaceHolder.callback对象,里面包含Surface创建、更改、销毁时的回调方法。创建绘制线程对象。在绘制线程中开始在Surface上面绘制图形,因为SurfaceView没有对我们暴露Surface,而只是暴露了接口SurfaceHolder,所以使用SurfaceHolder的lockCanvas()获取Surface上面指定区域的Canvas,在该Canvas上绘制图形,绘制结束后,使用SurfaceHolder的unlockCanvasAndPost()方法解锁Canvas,并让UI线程把Surface上面的内容绘制到主窗口。2.实验原理2.4SurfaceView画图画图示意图初始化:

画笔

初始化参数

基线/左/右 x轴坐标画标尺画波形2.实验原理2.4SurfaceView画图SurfaceView的使用框架SurfaceViewsurfaceView=findViewById(R.id.sfv_wave_layout);//创建SurfaceView对象SurfaceHoldermSurfaceHolder=surfaceView.getHolder();//初始化SurfaceHolder//注册SurfaceHolder的回调方法mSurfaceHolder.addCallback(newSurfaceHolder.Callback(){

@OverridepublicvoidsurfaceCreated(SurfaceHolderholder){

//当Surface第一次创建后会立即调用该函数。可以在该函数中做些和绘制界面相关的初始化工作,但不要在这个函数中绘制Surface。

}

@OverridepublicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){//当Surface的状态(大小和格式)发生变化的时候会调用该函数,比如横竖屏切换}@OverridepublicvoidsurfaceDestroyed(SurfaceHolderholder){//当Surface被摧毁前会调用该函数,该函数被调用后就不能继续使用Surface了,一般在该函数中来清理使用的资源,比如停止子线程绘制surface}});2.实验原理2.4SurfaceView画图SurfaceView的使用框架//子线程内画波形mExecutorService.scheduleAtFixedRate(newRunnable(){

@Override

publicvoidrun(){Canvascanvas=holder.lockCanvas(Rect);//锁住该区域画布

if(canvas==null){

return;

}

canvas.drawLine();//绘制holder.unlockCanvasAndPost(canvas);//释放画布,更新显示

}},0,8,TimeUnit.MILLISECONDS);2.实验原理2.5画图相关方法介绍LinkedList:基于双向链表实现的有序序列,可在任意位置进行高效的插入和移除操作LinkedList.poll()获取并移除队列头部元素,如果队列为空,则返回nullLinkedList.offer(Ee)将对象e插入队列尾部,成功返回true,失败(没有空间)返回falsepublicvoiddrawLine(floatstartX,floatstartY,floatstopX,floatstopY,Paintpaint)

参数说明startX:起始端点的X坐标startY:起始端点的Y坐标stopX:终止端点的X坐标stopY:终止端点的Y坐标paint:绘制直线所使用的画笔3.代码分析3.1设计框图安卓移动医疗应用开发血氧监测与显示实验11Contents.1实验内容2实验原理3代码分析血氧介绍血氧测量原理PCT协议-血氧1.实验内容将人体生理参数监测系统硬件平台设置为输出血氧数据,单击start按钮开始监测,即可看到动态显示的血氧波了解血氧数据处理过程,学习血氧数据包的PCT协议和AndroidStudio中的部分函数和命令,并学习如何通过AndroidStudio画血氧波形图,然后完善处理血氧数据的底层代码,最后通过安卓手机对系统进行验证。2.实验原理2.1血氧介绍血氧的含义:血氧饱和度(SpO2)即血液中血氧的浓度。即血液中氧合血红蛋白(HbO2)的容量占所有可结合的血红蛋白(HbO2+Hb)即氧合血红蛋白和还原血红蛋白容量的百分比:常见测量方法:血氧饱和度的范围:临床上,一般认为SpO2正常值不能低于94%,低于94%以下被认为供氧不足。指套式光电传感器透射式2.实验原理2.2血氧测量原理脉搏波PPG信号:主动脉瓣关闭(潮汐)心室舒张,室内压力低于主动脉脉压光电传感器输出信号成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论