




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于 Android 的智能家居 基于 Android 的智能家居 三个火枪手 2013 年 5 月 基于 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 页 共 51 页 第第 1 章章 项目概述项目概述 1 1 项目背景项目背景 随着社会电子信息化的不断发展 人们在家居中使用的电器越来越多 由 此带来的安全隐患也有了明显的增多 在这些电器中一旦出现一些异常 便会 给人们带来很大的损失 为了降低电器的不合理使用带来的异常情况 就要求 在异常发生时用户能及时得到信息 并通过实时监控采取一定的操作排除异常 因此 远程监控系统的作用是非常巨大的 90 年代末 随着多媒体技术 视频压缩编码技术 网络通讯技术的发展 数字视频监控系统迅速崛起 现今市场上由两种数字视频监控系统类型 一种 是以数字录像设备为核心的视频监控系统 另一种是以嵌入式视频 web 服务器 为核心的视频监控系统 以数字录像设备为核心的视频监控系统采用 PC 机作 为多媒体监控主机 综合了视频矩阵 图像分割器 录像机等众多的功能 使 系统结构大为简化 采用计算机网络技术 数字多媒体远程网络监控不受距离 限制 采用大容量磁盘阵列存盘器或光盘存储器 可以节省大量的磁盘介质 同时有利于系统实现多媒体信息查询 但随着基于 PC 机的视频监控录像系统 的发展 在实际使用过程中 也暴露出一些不足 主要是系统工作的不稳定性 以嵌入式视频 web 服务器为核心的视频监控系统 采用嵌入式实时多任务 操作系统 摄像头采集到的图片信息经过压缩 通过内部总线送到内置的 web 服务器 网络上的用户可以直接用浏览器观看 web 服务器上的由摄像头采集的 图像 由于把图片采集和 web 功能集中到一个体积很小的设备内 可以直接连 入局域网 用户无需安装任何硬件设备 仅用浏览器即可观看 同时还具有以 下优点 布控区域广阔 嵌入式视频 web 服务器监控系统 web 服务器直接连入网络 没有线缆长度和信号衰减的限制 同时网络是没有距离概念的 彻底抛弃了地 域的概念 扩展布控的区域 系统具有几乎无限的无缝扩展能力 所以设备都 以 IP 地址进行标示 增加设备只是意味着 IP 地址的扩充 性能稳定可靠 无 需专人管理 嵌入式 web 服务器实际上是基于嵌入式微处理器技术 采用嵌入 式实时多任务操作系统 对于用户来讲 上网进行登陆 便可对家中情况进行 监控 除了 WEB 服务器实时控制之外 当前智能手机的发展趋势已经愈加明 显 智能手机 Smartphone 是指 像个人电脑一样 具有独立的操作系统 可以由用户自行安装软件 游戏等第三方服务商提供的程序 通过此类程序来 基于 Android 的智能家居 第 2 页 共 51 页 不断对手机的功能进行扩充 并可以通过移动通讯网络来实现无线网络接入的 这样一类手机的总称 而当前应用在智能手机上的操作系统中 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 的智能家居 第 3 页 共 51 页 第第 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 的智能家居 第 4 页 共 51 页 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 的智能家居 第 5 页 共 51 页 第第 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 的智能家居 第 6 页 共 51 页 3 3所用类定义所用类定义 1 Data 用来存储和处理设备的采集数据 2 NodeCmd 定义操作方法 实现对设备的读操作和控制操作 3 NodeInfo 定义设备的所有采集信息 控制器状态和 WatchDog 4 NodeList 使用链表存储设备信息 5 MyUartService 提供与底层的接口 以读写串口 基于 Android 的智能家居 第 7 页 共 51 页 第第 4 章章 前端前端 A8 模块设计模块设计 4 1 A8 Android Application 层设计层设计 4 1 1数据流分析数据流分析 4 1 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 判断链表是否已经存在该节点 不存在则加入链表并创建 节点 4 1 1 2 NODEINFO 节点信息更新 节点信息更新 1 数据处理流程图 基于 Android 的智能家居 第 8 页 共 51 页 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 通知从界面更新数据 4 1 1 3 RFID 用户登录或退出 用户登录或退出 1 数据处理流程图 Zigbee Zigbee MainReadThread MainHandlerThread SmartHomeActivity Rfid sendBroadcast NodeInfo Cortex A8Cortex M0r 图图 4 34 3RFIDRFID 数据流程图数据流程图 2 数据格式 RFID 数据格式 基于 Android 的智能家居 第 9 页 共 51 页 数据数据格式格式 RFID S11FrI1R103132 3 数据处理详细描述 Cortex M0 开启 通过 Zigbee 发送 NEWNODE 数据给 Cortex A8 程序通 过 MainReadThread 线程读取到数据 交由 MainHandlerThread 线程处理 MainHandlerThread 对 RFID 进行校验 判断是否合法 如果数据无误 通过发 送 Handler 消息交由 SmartHomeActivity 主界面 UI 线程 SmartHomeActivity 发 送 Broadcast 通知从界面 从界面判断是否为自己设备 是则更新数据 4 1 2Application 层详细设计与实现层详细设计与实现 4 1 2 1 类对象详细描述类对象详细描述 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 的智能家居 第 10 页 共 51 页 属性属性类型类型描述描述 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 的智能家居 第 11 页 共 51 页 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 的智能家居 第 12 页 共 51 页 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通过在链表中位置查找到设备节点 4 1 2 2 线程类详细描述线程类详细描述 1 MainReadThread 类 当启动 MainReadThread 线程 执行 run 方法 run 方法先通过 running 判断 是否执行读操作 如果 running 为 true 进行对设备读操作 判断 MainHandlerThread 处理线程是否创建 未创建则创建并将读出的数据传给 MainHandlerThread 并启动线程 循环执行 基于 Android 的智能家居 第 13 页 共 51 页 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 的智能家居 第 14 页 共 51 页 只负责执行设备控制的命令 使用线程可以使程序多次独立线程执行 不 被影响 devControl Run 图图 4 64 6 NodeWriteThreadNodeWriteThread RUNRUN 流程图流程图 4 1 2 3 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 3 updataLayOut a 设置所有节点的看门狗减一 allNodeSetWatchDog b 判断是否有节点看门狗死亡 findNodeDogDie 如果存在 删除 Node 节点链表 delByDevNum 并判断是否进入该节点从界面 如果进入则发送广 播使其退出 最后 向该死亡设备发送确认命令 ISEXIT 如果未死亡 重新发 送添加节点 NewNode 的数据 c 更新适配器 notifyDataSetChanged 4 BackReceiver 广播接受器 a 从节点列表删除从界面返回的节点的原对象 nodeList delByDevNum 基于 Android 的智能家居 第 15 页 共 51 页 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 4 1 2 4 数据库详细描述数据库详细描述 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 的智能家居 第 16 页 共 51 页 id INTEGERprimary key autoincrementID 主键 devIdVARCHARNull设备号 rfIdVARCHARNullRFID 号 4 1 2 5 框架详细描述框架详细描述 MyUartService 类 1 加载库 System loadLibrary uart runtime 2 重写构造函数 调用本地 init 方法 对设备进行初始化 3 通过调用本地方法实现 java 方法 4 2A8 数据传递架构模块数据传递架构模块 4 2 1 层次接口表层次接口表 数据传递数据传递 串口操作串口操作 应用层应用层framework 层层JNI 层层Hal 层层驱动驱动 图图 4 6 14 6 1 接口层次图接口层次图 New MyUartService 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 的智能家居 第 17 页 共 51 页 图图 4 6 24 6 2 结构图结构图 4 2 2 HAL 层层 1 宏 表表 4 104 10 HALHAL 层宏定义表层宏定义表 名称名称内容内容功能功能 UART HARDWARE MODULE ID uart 定义 hal 的模块 id START0 xAA数据包的开始符 NEW0 x01新节点加入发的包 INFO0 x02采集的信息包 RFID0 x04刷卡时发的包 2 全局变量 表表 4 114 11 HALHAL 层全局变量表层全局变量表 名称名称类型类型功能功能 fdint操作设备的文件描述符 3 结构体 表表 4 124 12 HALHAL 层结构体表层结构体表 基于 Android 的智能家居 第 18 页 共 51 页 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 的智能家居 第 19 页 共 51 页 是否有数据 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 的智能家居 第 20 页 共 51 页 表表 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 的智能家居 第 21 页 共 51 页 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 的智能家居 第 22 页 共 51 页 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 的智能家居 第 23 页 共 51 页 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 boolean init 声明jni库可以提供的方法 private static native String uart data update private static native int uart send cmd int n int c 3 uart stub include uart h struct uart module t struct hw module t common HAL 规定不能直接使用hw module t结构 因此需要做这么一个继承 struct uart control device t 自定义的一个针对Uart控制的结构 包含hw device t和支持的API操作 struct hw device t common attributes 基于 Android 的智能家居 第 24 页 共 51 页 supporting control APIs go here int uart read hal struct uart control device t dev char buf int count int uart write hal struct uart control device t dev const char cmd define UART HARDWARE MODULE ID uart 定义一个MODULE ID HAL层 可以根据这个ID找到我们这个HAL stub 4 cn com smarthome uart MyUartService cpp define LOG TAG MyUartService include utils Log h include include include include include include uart stub include uart h static uart control device t sUartDevice 0 static uart module t sUartModule 0 JNINativeMethod是 jni层注册的方法 Framework层可以使用这些方法 init uart read uart write 是在Framework中调用的方法名称 函数的类型 及返回值如下 Z无参数 返回值为bool型 Ljava lang String 无参数 返回值为String型 II I 参数为2个int型 返回值为int型 static const JNINativeMethod gMethods init Z void uart init uart data update Ljava lang String void uart read uart send cmd II I void uart write static int registerMethods JNIEnv env static const char const kClassName cn com smarthome uart MyUartService 注意 必须和Framework层 的service类名相 jclass clazz look up the class clazz env FindClass kClassName 查找被注册的类 if clazz NULL LOGE Can t find class s n kClassName return 1 基于 Android 的智能家居 第 25 页 共 51 页 register all the methods if env RegisterNatives clazz gMethods sizeof gMethods sizeof gMethods 0 JNI OK LOGE Failed registering methods for s n kClassName return 1 向类中注册本SO中Native的接口 接口定义在gMethods数组中 fill out the rest of the ID cache return 0 This is called by the VM when the shared library is first loaded 在Android系统初始化时 就会自动加载该JNI方法调用表 当第一次加载此库时 调用此函数注册本地方法 jint JNI OnLoad JavaVM vm void reserved JNIEnv env NULL jint result 1 LOGI zzs JNI OnLoad if vm GetEnv void goto fail 获取当前的VM的环境 保存在env变量中 assert env NULL if registerMethods env 0 LOGE ERROR PlatformLibrary native registration failed n goto fail 自己写的函数 向当前JAVA环境中注册接口 success return valid version number result JNI VERSION 1 4 fail return result JNI OnLoad 函数完成 1 把虚拟机环境信息保存到本地库的一个结构体 JNIEnv 的实例中 2 建立一个应用层中的UART控制服务与本地库的JNI函数表 3 返回虚拟机本地库使用的JNI版本 基于 Android 的智能家居 第 26 页 共 51 页 5 uart stub module uart c define LOG TAG UartStub include include include include include include include include include uart h include crc16 h define N 6 define START 0 xAA 用于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年苏科版七年级上册数学期末模拟测试卷(常州专用)
- 2025年事业单位招聘考试化工类专业能力测试试卷(化工安全法规修订意见)2025年春季试题库
- 2025年度高端茶饮品牌区域代理合作协议
- 2025年苏州市事业单位教师招聘信息技术专业知识考试试卷
- 2025年高龄老人专属离婚财产分割与子女监护权全面协议书
- 2025年美甲师(实操)技能考核试题
- 2025年西班牙语SIELE考试试卷写作技巧与结构优化试题
- 2025年文化创意产业园区厂房租赁合同知识产权保护追加协议
- 2025年西班牙语DELEI级写作冲刺试卷:科技发展对生活的影响
- 2025年社区工作者招聘考试试卷(逻辑思维能力)
- 供应商欠款起诉书范文
- 农产品自产自销情况说明书格式范文
- 教育机构责任纠纷实证分析及预防
- 对药品不良反应及课件
- 肿瘤治疗药物进展
- 职业技术学院《临床检验基础》课程标准
- 风险辨识分级管控教育培训
- 2025年中国燕麦β-葡聚糖行业市场发展现状及投资规划建议报告
- 2025年三方顶账协议模板
- 三国演义测试题100道带答案
- 导航时频技术原理单选题100道及答案
评论
0/150
提交评论