




已阅读5页,还剩76页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于 Android 的智能家居 基于 Android 的智能家居 基于 Android 的智能家居 目目 录录 第 1 章项目概述.1 1.1项目背景.1 1.2术语定义.2 第 2 章技术方案.3 2.1系统描述.3 2.2功能描述.3 2.3项目功能图.4 2.4所涉及的系统、工具.4 第 3 章前端数据中心(A8)总体设计5 3.1程序设计流程图.5 3.2线程定义.5 3.3所用类定义.6 第 4 章前端 A8 模块设计7 4.1A8-ANDROID APPLICATION层设计7 4.1.1数据流分析7 4.1.2Application 层详细设计与实现9 4.2A8-数据传递架构模块.16 4.2.1层次接口表16 4.2.2HAL 层.17 4.2.3JNI 层.19 4.2.4Framework 层.20 4.2.5整体流程21 4.2.6关键代码分析22 4.3传输协议模块设计.32 4.3.1A8 接收数据格式32 4.3.2M0 接收命令数据结构 .33 第 5 章终端 M0 模块设计.35 5.1终端设备方案描述.35 5.2终端设备工作流程.35 5.3功能模块描述.36 5.3.1温湿度传感器 DHT10.36 5.3.2ZigBee 通信部分.37 5.3.3RFID 读卡模块40 5.3.4IIC 接口部分41 第 6 章系统测试.45 6.1项目演示.45 基于 Android 的智能家居 AcE team 第 1 页 共 52 页 第第 1 章章 项目概述项目概述 1.1 项目背景项目背景 随着社会电子信息化的不断发展,人们在家居中使用的电器越来越多,由 此带来的安全隐患也有了明显的增多。在这些电器中一旦出现一些异常,便会 给人们带来很大的损失。为了降低电器的不合理使用带来的异常情况,就要求 在异常发生时用户能及时得到信息,并通过实时监控采取一定的操作排除异常。 因此,远程监控系统的作用是非常巨大的。 90 年代末,随着多媒体技术、视频压缩编码技术、网络通讯技术的发展, 数字视频监控系统迅速崛起,现今市场上由两种数字视频监控系统类型,一种 是以数字录像设备为核心的视频监控系统,另一种是以嵌入式视频 web 服务器 为核心的视频监控系统。以数字录像设备为核心的视频监控系统采用 PC 机作 为多媒体监控主机,综合了视频矩阵、图像分割器、录像机等众多的功能,使 系统结构大为简化,采用计算机网络技术,数字多媒体远程网络监控不受距离 限制,采用大容量磁盘阵列存盘器或光盘存储器,可以节省大量的磁盘介质, 同时有利于系统实现多媒体信息查询。但随着基于 PC 机的视频监控录像系统 的发展,在实际使用过程中,也暴露出一些不足,主要是系统工作的不稳定性。 以嵌入式视频 web 服务器为核心的视频监控系统,采用嵌入式实时多任务 操作系统。摄像头采集到的图片信息经过压缩,通过内部总线送到内置的 web 服务器,网络上的用户可以直接用浏览器观看 web 服务器上的由摄像头采集的 图像。由于把图片采集和 web 功能集中到一个体积很小的设备内,可以直接连 入局域网,用户无需安装任何硬件设备,仅用浏览器即可观看。同时还具有以 下优点: 布控区域广阔,嵌入式视频 web 服务器监控系统 web 服务器直接连入网络, 没有线缆长度和信号衰减的限制,同时网络是没有距离概念的,彻底抛弃了地 域的概念,扩展布控的区域。系统具有几乎无限的无缝扩展能力。所以设备都 以 IP 地址进行标示,增加设备只是意味着 IP 地址的扩充。性能稳定可靠,无 需专人管理。嵌入式 web 服务器实际上是基于嵌入式微处理器技术,采用嵌入 式实时多任务操作系统,对于用户来讲,上网进行登陆,便可对家中情况进行 监控。除了 WEB 服务器实时控制之外,当前智能手机的发展趋势已经愈加明 显。智能手机(Smartphone),是指“像个人电脑一样,具有独立的操作系统, 可以由用户自行安装软件、游戏等第三方服务商提供的程序,通过此类程序来 基于 Android 的智能家居 不断对手机的功能进行扩充,并可以通过移动通讯网络来实现无线网络接入的 这样一类手机的总称” 。而当前应用在智能手机上的操作系统中 Android 操作系 统占有相当大的比例。 Android( 中文名:安卓) 是基于 Linux 平台开源手机操作系统名称,该平 台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打 造的真正开放和完整的移动软件。随着 Android 应用的更见广泛,了解并能使 用 Android 来完成我们对智能家居的控制已经显得愈加重要。 现在监控系统发展到第三代,前端一体化、视频十字化、监控网络化、系 统集成化成为视频监控系统公认的发展方向,它以网络为依托,以数字视频的 压缩、传输、存放和播放为核心,以智能实用的图像分析为特点,并为报警系 统、门禁系统完美的整合到一个使用平台上,引发了视频控制行业的一次技术 革命。 1.2 术语定义术语定义 Android: Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于 便携设备。 HAL:硬件抽象层。 JNI:JNI 是 Java Native Interface 的缩写,中文为 JAVA 本地调用。 RFID:射频识别即 RFID(Radio Frequency IDentification)技术,又称电子 标签、无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读 写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。 A8: ARM Cortex-A8 处理器是第一款基于 ARMv7 架构的应用处理器,并且 是有史以来 ARM 开发的性能最高、最具功率效率的处理器。 M0:Cortex-M0 处理器,是市场上现有的最小、能耗最低、最节能的 ARM 处理器。 基于 Android 的智能家居 第第 2 章章 技术方案技术方案 2.1 系统描述系统描述 Android 是一个开放源码的操作系统专门为移动电话而设计的系统。 Android 手机将开辟新的应用,使家居智能化运用于普通家庭。 Android 界面显示(Cortex_A8)来自于 Cortex_m0 模拟量,并可对 Cortex_m0 进行控制或操作。 本系统做为裁减项目,实现了 M0 采集房间信息,通过无线方式发送到 A8 进行监控、控制。A8 即可作为移动终端设备(如 phone、pad 等),亦可作中央监 控服务器设备。本项目采用后者方案,即作中央监控。若需作移动设备,只需 将程序移植到移动设备上,再在中央端移植 web 服务器,移动设备登陆服务器 即可查看房屋信息。 2.2 功能描述功能描述 1.检测室内温度、湿度、光感、电压情况(通过 Cortex_m0 采集的信息) 。 2.通过温度、湿度的情况来对应调节风扇开关(控制 Cortex_m0) 。 3.根据光敏传感器情况对应调节 led 灯亮灭(控制 Cortex_m0) 。 4.根据三轴加速度情况对应调节蜂鸣器开关(控制 Cortex_m0) 。 5.显示 Rfid 信息等功能(通过 Cortex_m0 采集) 。 基于 Android 的智能家居 2.3 项目功能图项目功能图 图图 2.12.1 项目功能图项目功能图 2.4 所涉及的系统所涉及的系统、工具、工具 表表 2.12.1 系统与工具系统与工具 系统名称系统名称系统版本系统版本备注备注 Linux 内核Linux3.0.8 Android 文件系统Android4.0 版本 工具链arm-none-linux-gnueabi-gcc Android 程序开发Eclipse 基于 Android 的智能家居 第第 3 章章 前端数据中心(前端数据中心(A8)总体设计)总体设计 3.1 程序设计流程图程序设计流程图 SmartHomeActivity MainReadThread NodeWriteThread 是否触发按键 是否在从界面Y MainHandlerThread 循环 Handler devControl UartDataUpdate MyUartService UartSendCmd NodeInfoActivity Application Layer _uart_data_update _uart_send_cmd JNI Layer FrameWork Layer 图图 3.13.1 程序设计流程图程序设计流程图 3.2 线程定义线程定义 1. SmartHomeActivity,程序主 Activity 界面,打开程序首先运行。 2. NodeInfoActivity,从界面 Activity,用来显示详细设备采集信息和控制 按键。 3. MainReadThread,读数据主线程,该线程只负责对通过 Zigbee 获取的数 据转发给读进程,不进行数据操作。 4. MainHandlerThread,处理数据线程,该线程对从读进程传来的数据进行 数据校验并转发。 5. NodeWriteThread,控制线程,该线程负责处理由用户对设备的操作。 基于 Android 的智能家居 3.3所用类定义所用类定义 1. Data,用来存储和处理设备的采集数据。 2. NodeCmd,定义操作方法,实现对设备的读操作和控制操作。 3. NodeInfo,定义设备的所有采集信息,控制器状态和 WatchDog。 4. NodeList,使用链表存储设备信息。? 5. MyUartService:提供与底层的接口,以读写串口。 基于 Android 的智能家居 第第 4 章章 前端前端 A8 模块设计模块设计 4.1 A8-Android Application 层设计层设计 4.1.1数据流分析数据流分析 NEWNODE,新节点加入,新节点加入 1. .数据处理流程图 Zigbee Zigbee MainReadThread MainHandlerThread SmartHomeActivity addNewNode() updataLayOutAdd() addItem() NewNode Cortex-A8Cortex-M0 nodeList.insertNode() n 图图 4.14.1NEWNODENEWNODE 数据流程图数据流程图 2.数据格式 NEWNODE 数据格式 数据数据格式格式 NEWNODE S4FnI1 3.数据处理详细描述 Cortex-M0 开启,通过 Zigbee 发送 NEWNODE 数据给 Cortex-A8,程序通 过 MainReadThread 线程读取到数据,交由 MainHandlerThread 线程处理。 MainHandlerThread 对 NOEWNODE 进行校验,判断是否合法,如果数据无误, 通过发送 Handler 消息交由 SmartHomeActivity 主界面 UI 线程, SmartHomeActivity 判断链表是否已经存在该节点,不存在则加入链表并创建 节点。.? NODEINFO,节点信息更新。,节点信息更新。 1.数据处理流程图 基于 Android 的智能家居 Zigbee Zigbee MainReadThread MainHandlerThread SmartHomeActivity getNodeInfo() updataLayOut() sendBroadcast() NodeInfo Cortex-A8Cortex-M0 nodeList.findByDevNum() i 图图 4.24.2NODEINFONODEINFO 数据流程图数据流程图 2.数据格式 NODEINFO 数据 数据数据格式格式 NODEINFO S23FiI1T24H30L6V220X1Y1Z60 3.数据处理详细描述 Cortex-M0 开启,通过 Zigbee 发送 NEWNODE 数据给 Cortex-A8,程序通 过 MainReadThread 线程读取到数据,交由 MainHandlerThread 线程处理。 MainHandlerThread 对 NODEINFO 进行校验,判断是否合法,如果数据无误, 通过发送 Handler 消息交由 SmartHomeActivity 主界面 UI 线程, SmartHomeActivity 判断链表是否已经存在该节点,存在则更新该链表信息, 并判断是否进入该节点从界面,如果进入发送 Broadcast 通知从界面更新数据。 RFID,用户登录或退出。,用户登录或退出。 1.数据处理流程图 Zigbee Zigbee MainReadThread MainHandlerThread SmartHomeActivity Rfid() sendBroadcast() NodeInfo Cortex-A8Cortex-M0r 图图 4.34.3RFIDRFID 数据流程图数据流程图 2.数据格式 RFID 数据格式 基于 Android 的智能家居 数据数据格式格式 RFID S11FrI1R103132 3.数据处理详细描述 Cortex-M0 开启,通过 Zigbee 发送 NEWNODE 数据给 Cortex-A8,程序通 过 MainReadThread 线程读取到数据,交由 MainHandlerThread 线程处理。 MainHandlerThread 对 RFID 进行校验,判断是否合法,如果数据无误,通过发 送 Handler 消息交由 SmartHomeActivity 主界面 UI 线程,SmartHomeActivity 发 送 Broadcast 通知从界面,从界面判断是否为自己设备,是则更新数据。 4.1.2Application 层详细设计与实现层详细设计与实现 类对象详细描述类对象详细描述 1 .Data 类,负责对接受来数据进行处理 表表 4.14.1 DataData 成员属性表成员属性表 属性属性类型类型描述描述 serialVersionUIDlong 序列化时保持版本的兼容性,即在版本升级时反 序列化仍保持对象的唯一性。 dataString存储从串口的数据 表表 4.24.2 DataData 成员方法表成员方法表 方法方法参数参数返回值返回值描述描述 getDataSize VoidString从传来的数据获取数据大小 isValidDataVoidboolean数据有效性校验,包括数据是为为空,完整等 getDataTypeVoidint从传来的数据获取数据类型 getDataTargetVoidString从传来的数据获取数据的设备号 getRfidVoidString从传来的数据获取 Rfid 信息 getTemperatureVoidString从传来的数据获取温度 getHumidityVoidString从传来的数据获取湿度 getLightVoidString从传来的数据获取光感 getAdVoidString传来的数据获取 AD 值 getXVoidString从传来的数据获取三轴加速度 x 值 getYVoidString从传来的数据获取三轴加速度 y 值 getZVoidString从传来的数据获取三轴加速度 z 值 2 .NodeCmd 类,负责与底层进行交互,实现对硬件设备读,写操作。 表表 4.34.3 NodeCmdNodeCmd 成员属性表成员属性表 基于 Android 的智能家居 属性属性类型类型描述描述 DevCmd enum 使用枚举将命令声明一组命名的常数,方便函数 调用。 myUartServiceMyUartService串口操作所使用框架 表表 4.44.4 NodeCmdNodeCmd 成员方法表成员方法表 方法方法参数参数返回值返回值描述描述 devControlint, DevCmd String向串口发送数据 readNodeVoidString从串口获取数据 3 .NodeInfo 类,负责存储一个设备的信息。 表表 4.54.5 NodeInfoNodeInfo 成员属性表成员属性表 属性属性类型类型描述描述 serialVersionUID long 序列化时保持版本的兼容性,即在版本升级时反 序列化仍保持对象的唯一性。 temperatureString存储节点对象的温度值 humidityString存储节点对象的湿度 lightString存储节点对象的光感值 xString存储节点对象的三轴加速度 x 值 yString存储节点对象的三轴加速度 y 值 zString存储节点对象的三轴加速度 z 值 adString存储节点对象的 ad 值 ledint存储节点对象的 led 灯状态(0,灭;1,亮) funint 存储节点对象的风扇状态(0,关;1,开;2, 加速) beepint存储节点对象的报警器状态(0,关;1,开) nixietubint存储节点对象的数码管状态(0,关;1,开) rfidrfid存储节点对象的 rfid 信息 devNumint存储节点对象的设备号 nextNodeInfo便于生成链表 watchDogint看门狗,监控节点生命值 表表 4.64.6 NodeInfoNodeInfo 成员方法表成员方法表 方法方法参数参数返回值返回值描述描述 NodeInfo voidvoid构造函数,初始化节点对象 NodeInfovoidint有参数构造函数,参数为节点设备号 getNextvoidNodeInfo 获取下一个节点并返回节点信息 setNextNodeInfovoid 基于 Android 的智能家居 getTemperaturevoidString获取该对象温度值 setTemperatureStringvoid设置该对象温度值 getHumidityvoidString获取该对象湿度值 setHumidityStringvoid设置该对象湿度值 getLightvoidString获取该对象光感值 setLightStringvoid设置该对象光感值 getAdvoidString获取该对象 AD 值 setAdStringvoid设置该对象 AD 值 getXvoidString获取该对象三轴加速度 x 值 setXStringvoid设置该对象三轴加速度 x 值 getYvoidString获取该对象三轴加速度 y 值 setYStringvoid设置该对象三轴加速度 y 值 getZvoidString获取该对象三轴加速度 z 值 setZStringvoid设置该对象三轴加速度 z 值 getLedvoidint获取该对象 Led 状态值 setLedintvoid设置该对象 Led 状态值 getFunvoidint获取该对象 Fun 状态值 setFunintvoid设置该对象 Fun 状态值 getBeepvoidint获取该对象 Beep 状态值 setBeepintvoid设置该对象 Beep 状态值 getNixietubvoidint获取该对象 Nixietub 状态值 setNixietubintvoid设置该对象 Nixietub 状态值 getDevNumvoidint获取该对象 DevNum 值 setDevNumintvoid设置该对象 DevNum 值 getRfidvoidString获取该对象 Rfid 值 setRfidStringvoid设置该对象 Rfid 值 getWatchDogvoidint获取该对象 WatchDog 值 setWatchDogintvoid设置该对象 WatchDog 值 ledOnvoidvoid开灯 ledOffvoidvoid关灯 funOnvoidvoid开风扇 FunOn1voidvoid风扇加速 funOffvoidvoid关风扇 beepOnvoidvoid开蜂鸣器 beepOffvoidvoid关蜂鸣器 nixietubeOnvoidvoid开数码管 nixietubeOffvoidvoid关数码管 基于 Android 的智能家居 4 .NodeList 类,存储所有连接设备的信息,便于进行界面节点的更新,删 除和添加操作。 表表 4.74.7 NodeListNodeList 成员属性表成员属性表 属性属性类型类型描述描述 head NodeInfo链表头结点 lenLong链表长度 表表 4.84.8 NodeListNodeList 成员方法表成员方法表 方法方法参数参数返回值返回值描述描述 getHead NodeInfovoid获取链表头结点 setHeadvoidNodeInfo设置链表头结点 createNodeListvoidvoid创建设备节点链表 insertNodeNodeInfovoid插入节点 delNodeNodeInfovoid删除节点 allNodevoidvoid遍历链表所有节点 findByDevNumintNodeInfo通过设备号找到节点 nodeIsNotExistedintboolean通过设备号查找节点是否存在于链表 delByDevNumintvoid通过设备号删除节点 allNodeSetWatchDogvoidString所有设备节点看门狗减一 oneNodeFeedWatchDogintvoid通过设备号找到设备节点并喂狗 findNodeDogDievoidint 遍历设备节点,查看是否有节点生命结 束 getLenvoidint得到链表长度 findNodeByPosintNodeInfo通过在链表中位置查找到设备节点 线程类详细描述线程类详细描述 1 . MainReadThread 类 当启动 MainReadThread 线程,执行 run 方法,run 方法先通过 running 判断 是否执行读操作,如果 running 为 true,进行对设备读操作,判断 MainHandlerThread 处理线程是否创建,未创建则创建并将读出的数据传给 MainHandlerThread,并启动线程,循环执行。 基于 Android 的智能家居 running False mhtIsExist Ture False new MainHandler Thread b be eg gi in n True s sl le ee ep p r re ea ad dN No od de e 图图 4.44.4 MainReadThreadMainReadThread RUNRUN 流程图流程图 2 . MainHandlerThread 类 当 MainReadThread 线程将读取的数据传到 MainHandlerThread 后,先对数 据进行有效性认证,如果数据有误,使用 handler 传递发送给 SmartHomeActivity 即主界面 UI 线程,进行处理;如果数据无误,判断数据类 型并使用 handler 传递,发送给 SmartHomeActivity 进行处理。 isValidDataTure getDataType N sendMessage(0,obj) sendMessage(3) I sendMessage(1,obj) R Obj = data sendMessage(2,obj) False 图图 4.54.5 MainHandlerThreadMainHandlerThread RUNRUN 流程图流程图 3 . NodeWriteThread 类 基于 Android 的智能家居 只负责执行设备控制的命令,使用线程可以使程序多次独立线程执行,不 被影响。 devControl Run 图图 4.64.6 NodeWriteThreadNodeWriteThread RUNRUN 流程图流程图 UI 类详细描述类详细描述 1 . SmartHomeActivity 类 (1) onCreate a) 初始化节点列表 nodeList。 b) 设置从界面标题,setTitle。 c) 设置视图,setContentView。 d) 获取主界面控件的引用,findViewById。 e) 设置 GridView 和使用的适配器 BaseAdapter。 f) 设置选项被单击的监听器,setOnItemClickListener。 g) 设置线程的 Handler,重写 handleMessage 方法。 h) 打开程序读线程。 i) 注册返回广播接收器。 (2) onDestroy a) 卸载广播接收器,unregisterReceiver。 b) 关闭读线程,mainReadThread.stop。 c)关闭主界面 Activity,this.finish。 a) 设置所有节点的看门狗减一,allNodeSetWatchDog。 b) 判断是否有节点看门狗死亡,findNodeDogDie。如果存在,删除 Node 节点链表,delByDevNum,并判断是否进入该节点从界面,如果进入则发送广 播使其退出。最后,向该死亡设备发送确认命令 ISEXIT,如果未死亡,重新发 送添加节点 NewNode 的数据。.? c) 更新适配器 notifyDataSetChanged。? (4)BackReceiver 广播接受器 a) 从节点列表删除从界面返回的节点的原对象,nodeList.delByDevNum() 基于 Android 的智能家居 b) 向节点列表插入从界面返回的新节点对象,nodeList.insertNode() c) 关闭从界面 Activity ,finishActivity()。 2 . NodeInfoActivity 类 (1) onCreate a) 创建从节点对象 NodeInfo。 b) 设置视图,setContentView。 c) 获取从界面控件的引用,findViewById。 d) 通过 Intent 对象,获取从主界面传来的 nodeInfo 对象并赋给从界面对象。 e) 设置从界面标题,setTitle。 f)将主界面获取的 nodeInfo 对象反馈到界面,setText。 g) 注册广播接收器 h) 设置返回键监听器 i)设置风扇监听器,设置 Led 监听器,设置蜂鸣器监听器,设置数码管监 听器 (2) onDestroy 卸载广播接收器,unregisterReceiver。 数据库详细描述数据库详细描述 1 . RfidRecordDBHelper 类 继承 SQLiteOpenHelper 类,重写 onCreate 方法。 表新建 使用 SQLiteDatabase 对象的 execSQL 方法去添加表。命令如下: create table if not exists rfidTable (id INTEGER primary key autoincrement, devId varchar, rfId varchar) 增加 使用 SQLiteDatabase 对象的 execSQL 方法去增加数据。命令如下: insert into rfidTable(devId, rfId) values (?,?) 删除 使用 SQLiteDatabase 对象的 execSQL 方法去删除数据。命令如下: delete from rfidTable where rfId = ? 2 . 数据库表设计 表表 4.94.9 rfidTablerfidTable 数据库表数据库表 字段名字段名类型类型属性属性描述描述 基于 Android 的智能家居 id INTEGERprimary key autoincrementID 主键 devIdVARCHARNull设备号 rfIdVARCHARNullRFID 号 框架详细描述框架详细描述 MyUartService 类 1 .加载库,System.loadLibrary(“uart_runtime“) 2 .重写构造函数,调用本地 _init 方法,对设备进行初始化。 3. 通过调用本地方法实现 java 方法 4.2A8-数据传递架构模块数据传递架构模块 4.2.1 层次接口表层次接口表 数据传递数据传递(串口操作串口操作) 应用层应用层framework 层层JNI 层层Hal 层层驱动驱动 图图 .1 接口层次图接口层次图 New Uart_read Open Uart_device_open Uart_init _init UartDataUpdate _uart_data_update Uart_read_drv _uart_send_cmd Read UartSendCmd Uart_write Uart_write_drv Write Uart_read_halUart_write_hal 基于 Android 的智能家居 图图 .2 结构图结构图 4.2.2 HAL 层层 1、 宏 表表 4.104.10 HALHAL 层宏定义表层宏定义表 名称名称内容内容功能功能 UART_HARDWARE_MODULE_ID“uart“定义 hal 的模块 id START0xAA数据包的开始符 NEW0x01新节点加入发的包 INFO0x02采集的信息包 RFID0x04刷卡时发的包 2、 全局变量 表表 4.114.11 HALHAL 层全局变量表层全局变量表 名称名称类型类型功能功能 fdint操作设备的文件描述符 3、 结构体 表表 4.124.12 HALHAL 层结构体表层结构体表 基于 Android 的智能家居 struct uart_module_t 成员名成员名类型类型功能功能 commonstruct hw_module_t记录本 stub 的基本信息和入 口 struct uart_control_device_t 成员名成员名类型类型功能功能 commonstruct hw_device_t记录本 stub 操作设备时需要 包括的接口 uart_read_hal函数指针指向实际读串口的函数 uart_write_hal函数指针指向实际写串口的函数 4、流程图 基于 Android 的智能家居 是否有数据 N Y 是否为开始位 开始接收 Y N 是否结束 N CRC检验是否正确 Y N Y Read() 填充读buf Uart_read_drv() 上层读串口上层写串口 将数据打包,加 入CRC校验 写 成功 N 读 Uart_write_drv() Write() 图图 4.74.7 HALHAL 层结构图层结构图 4.2.3 JNI 层层 1、 宏 表表 4.134.13 JNIJNI 层宏定义表层宏定义表 名称名称内容内容功能功能 UART_HARDWARE_MODULE_ID“uart“定义 HAL 的模块 ID 2、 全局变量 基于 Android 的智能家居 表表 4.144.14 JNIJNI 层全局变量表层全局变量表 名称名称类型类型功能功能 sUartDeviceuart_control_device_t *保存通过调用 stub 中的 open 接口 后得到的 devices handle sUartModuleuart_module_t*保存通过调用 Android HAL 标准函 数 hw_get_module,传入 UART_HARDWARE_MODULE_I D 后得到的 UART stub 的句柄 3、 流程图 JNI 层主要实现了 Java 与 c/c+之间的过渡,不涉及复杂的逻辑,只根据规 则为上层函数调用相应的下层接口,参见整体流程。 4.2.4 Framework 层层 表表 4.154.15 FrameworkFramework 层类表层类表 public class MyUartService 方法方法功能功能 System.loadLibrary装载编译好的 JNI 层的共享库 public MyUartService构造函数,打开并初始化串口 public String UartDataUpdate读取当前串口信息数据包 public int UartSendCmd向串口传送命令数据包 基于 Android 的智能家居 4.2.5 整体流程整体流程 MyUartService static System.load(“/system/lib/ libuart_runtime.so“);/加载jni的动态库 JNI_OnLoad() /Framework层加载jni库时调用 registerMethods() /注册自己的JNINativeMethod “_init“, “()Z“, (void*)uart_init “_uart_data_update“, “()Ljava/lang/String;“, (void*)uart_read “_uart_send_cmd“, “(II)I“, (void*)uart_write Env-RegisterNatives() /注册上述方法,至此装载JNI 库工作完成 MyUartService() _init() /构造串口服务时调用初始化函数 UartDataUpdate() /公有方法,读取串口数据 UartSendCmd() /公有方法,向串口发送命令 根据Method找到对应的 JNI层接口 Uart_init()Uart_read() Hw_get_module() / / 根据LED_HARDWARE_MODULE_ID 找到hw_module_t Uart_control_open() module-methods-open(module, LED_HARDWARE_MODULE_ID, (struct hw_device_t*)device); / 这个过程非常重要,jni通过LED_HARDW ARE_MODULE_ID找到对应的stub sUartDevice- uart_read_hal(sUartDevice, s_buf, sizeof(s_buf); /调用hal层注册的读方法 Uart_write() sUartDevice- uart_write_hal(sUartDevice, command); /调用hal层注册的写方法 下续:hal 层 基于 Android 的智能家居 const struct uart_module_t HAL_MODULE_INFO_SYM = common: Id:UART_HARDWARE_MODULE_ID, /模块ID,上层的Service通过这个ID应用当前Stub methods: 定一个hw_module_methods_t结构体,关联入口函数 Uart_device_open() 初始化上层传入的device变 量,并关联操作接口 Dev.uart_read_hal = uart_read_drv; Dev.uart_write_hal = uart_write_drv; *device = JNI层调hal层的 open Open() 真正调用驱动接 口,打开串口 初始化串口,如波 特率等 打开成功 JNI层调hal层的 Uart_read_hal read() 真正调用驱动接 口,读串口 Uart_read_drv() JNI层调hal层的 Uart_read_hal write() 真正调用驱动接 口,写串口 Uart_write_drv() 图图 4.84.8 整体流程图整体流程图 4.2.6 关键代码分析关键代码分析 1 NodeCmd.java 基于 Android 的智能家居 static MyUartService myUartService = new MyUartService(); /新建对象,初始化 String s = myUartService.UartDataUpdate(); /更新采集数据 myUartService.UartSendCmd(1, LED_ON); /点亮1号设备的灯 2 MyUartService.java package .smarthome.uart; import android.util.Log; public class MyUartService /* * load native service. */ static System.loadLibrary(“uart_runtime“); /装载库 public MyUartService() _init(); /注册本地方法,打开串口并初始化 /* * uart native methods. */ public String UartDataUpdate() String s = _uart_data_update(); return s;v /更新采集的数据 public int UartSendCmd(int n, int c) _uart_send_cmd(n, c); return 0; /发送命令控制M0板 private static native boole
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 测量员试题及答案
- 家电公司研发管理办法
- 家电公司年终奖金管理规章
- 物业双证考试试题及答案
- 净水员考试题及答案
- edg考试题及答案
- 鸟巢素描试题及答案
- 尿失禁考试题及答案
- 家庭用药考试题及答案
- 2026届山东省济宁市微山县化学高二第一学期期末考试试题含答案
- 旧房整修工程施工组织设计
- 建筑工程安全文明标准化示范工地管理办法
- 药品不良反应的临床应对措施考试试题及答案
- 鼻饲的注意事项及护理要点
- 高危妊娠5色分级管理
- 2024慢性鼻窦炎诊断和治疗指南解读课件
- 员工自愿自己缴纳社保协议书范本
- 临时场地租赁协议书范本
- HRBP工作总结与计划
- 心理危机干预中的伦理问题探讨-深度研究
- 中国大唐集团公司基建工程质量标准及工艺要求(安装部分)
评论
0/150
提交评论