《Android智能家居详细设计52.docx》由会员分享,可在线阅读,更多相关《Android智能家居详细设计52.docx(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于Android的智能家居基于Android的智能家居三个火枪手2013年5月目 录第 1 章项目概述11.1项目背景11.2术语定义2第 2 章技术方案32.1系统描述32.2功能描述32.3项目功能图42.4所涉及的系统、工具4第 3 章前端数据中心(A8)总体设计53.1程序设计流程图53.2线程定义53.3所用类定义6第 4 章前端A8模块设计74.1A8-Android Application层设计74.1.1数据流分析74.1.2Application层详细设计与实现94.2A8-数据传递架构模块164.2.1层次接口表164.2.2HAL层174.2.3JNI层194.2.4F
2、ramework层204.2.5整体流程214.2.6关键代码分析224.3传输协议模块设计324.3.1A8接收数据格式324.3.2M0接收命令数据结构33第 5 章终端M0模块设计355.1终端设备方案描述355.2终端设备工作流程355.3功能模块描述365.3.1温湿度传感器DHT10365.3.2ZigBee通信部分375.3.3RFID读卡模块405.3.4IIC接口部分41第 6 章系统测试456.1项目演示45第 1 章 项目概述1.1 项目背景随着社会电子信息化的不断发展,人们在家居中使用的电器越来越多,由此带来的安全隐患也有了明显的增多。在这些电器中一旦出现一些异常,便会
3、给人们带来很大的损失。为了降低电器的不合理使用带来的异常情况,就要求在异常发生时用户能及时得到信息,并通过实时监控采取一定的操作排除异常。因此,远程监控系统的作用是非常巨大的。90年代末,随着多媒体技术、视频压缩编码技术、网络通讯技术的发展,数字视频监控系统迅速崛起,现今市场上由两种数字视频监控系统类型,一种是以数字录像设备为核心的视频监控系统,另一种是以嵌入式视频web服务器为核心的视频监控系统。以数字录像设备为核心的视频监控系统采用PC机作为多媒体监控主机,综合了视频矩阵、图像分割器、录像机等众多的功能,使系统结构大为简化,采用计算机网络技术,数字多媒体远程网络监控不受距离限制,采用大容量
4、磁盘阵列存盘器或光盘存储器,可以节省大量的磁盘介质,同时有利于系统实现多媒体信息查询。但随着基于PC机的视频监控录像系统的发展,在实际使用过程中,也暴露出一些不足,主要是系统工作的不稳定性。以嵌入式视频web服务器为核心的视频监控系统,采用嵌入式实时多任务操作系统。摄像头采集到的图片信息经过压缩,通过内部总线送到内置的web服务器,网络上的用户可以直接用浏览器观看web服务器上的由摄像头采集的图像。由于把图片采集和web功能集中到一个体积很小的设备内,可以直接连入局域网,用户无需安装任何硬件设备,仅用浏览器即可观看。同时还具有以下优点:布控区域广阔,嵌入式视频web服务器监控系统web服务器直
5、接连入网络,没有线缆长度和信号衰减的限制,同时网络是没有距离概念的,彻底抛弃了地域的概念,扩展布控的区域。系统具有几乎无限的无缝扩展能力。所以设备都以IP地址进行标示,增加设备只是意味着IP地址的扩充。性能稳定可靠,无需专人管理。嵌入式web服务器实际上是基于嵌入式微处理器技术,采用嵌入式实时多任务操作系统,对于用户来讲,上网进行登陆,便可对家中情况进行监控。除了WEB服务器实时控制之外,当前智能手机的发展趋势已经愈加明显。智能手机(Smartphone),是指“像个人电脑一样,具有独立的操作系统,可以由用户自行安装软件、游戏等第三方服务商提供的程序,通过此类程序来不断对手机的功能进行扩充,并
6、可以通过移动通讯网络来实现无线网络接入的这样一类手机的总称”。而当前应用在智能手机上的操作系统中Android操作系统占有相当大的比例。Android( 中文名:安卓) 是基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。随着Android应用的更见广泛,了解并能使用Android来完成我们对智能家居的控制已经显得愈加重要。现在监控系统发展到第三代,前端一体化、视频十字化、监控网络化、系统集成化成为视频监控系统公认的发展方向,它以网络为依托,以数字视频的压缩、传输、存放和播放为核心,以智能实用的图像分析
7、为特点,并为报警系统、门禁系统完美的整合到一个使用平台上,引发了视频控制行业的一次技术革命。1.2 术语定义Android: Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。HAL:硬件抽象层。JNI:JNI是Java Native Interface的缩写,中文为JAVA本地调用。RFID:射频识别即RFID(Radio Frequency IDentification)技术,又称电子标签、无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。A8: ARM Cortex-A8处理器是第一款基于
8、ARMv7架构的应用处理器,并且是有史以来ARM开发的性能最高、最具功率效率的处理器。M0:Cortex-M0处理器,是市场上现有的最小、能耗最低、最节能的ARM处理器。第 2 章 技术方案2.1 系统描述Android是一个开放源码的操作系统专门为移动电话而设计的系统。Android手机将开辟新的应用,使家居智能化运用于普通家庭。Android 界面显示(Cortex_A8)来自于Cortex_m0模拟量,并可对Cortex_m0进行控制或操作。本系统做为裁减项目,实现了M0采集房间信息,通过无线方式发送到A8进行监控、控制。A8即可作为移动终端设备(如phone、pad等),亦可作中央监控
9、服务器设备。本项目采用后者方案,即作中央监控。若需作移动设备,只需将程序移植到移动设备上,再在中央端移植web服务器,移动设备登陆服务器即可查看房屋信息。2.2 功能描述1.检测室内温度、湿度、光感、电压情况(通过Cortex_m0采集的信息)。2.通过温度、湿度的情况来对应调节风扇开关(控制Cortex_m0)。3.根据光敏传感器情况对应调节led灯亮灭(控制Cortex_m0)。4.根据三轴加速度情况对应调节蜂鸣器开关(控制Cortex_m0)。5.显示Rfid信息等功能(通过Cortex_m0采集)。2.3 项目功能图图2.1 项目功能图2.4 所涉及的系统、工具表2.1 系统与工具系统
10、名称系统版本备注Linux内核Linux3.0.8Android文件系统Android4.0版本工具链arm-none-linux-gnueabi-gccAndroid程序开发Eclipse第 3 章 前端数据中心(A8)总体设计3.1 程序设计流程图图3.1 程序设计流程图3.2 线程定义1. SmartHomeActivity,程序主Activity界面,打开程序首先运行。2. NodeInfoActivity,从界面Activity,用来显示详细设备采集信息和控制按键。3. MainReadThread,读数据主线程,该线程只负责对通过Zigbee获取的数据转发给读进程,不进行数据操作。
11、 4. MainHandlerThread,处理数据线程,该线程对从读进程传来的数据进行数据校验并转发。 5. NodeWriteThread,控制线程,该线程负责处理由用户对设备的操作。3.3 所用类定义1. Data,用来存储和处理设备的采集数据。2. NodeCmd,定义操作方法,实现对设备的读操作和控制操作。3. NodeInfo,定义设备的所有采集信息,控制器状态和WatchDog。4. NodeList,使用链表存储设备信息。5. MyUartService:提供与底层的接口,以读写串口。第 4 章 前端A8模块设计4.1 A8-Android Application层设计4.1.
12、1 数据流分析4.1.1.1 NEWNODE,新节点加入1.数据处理流程图图4.1NEWNODE数据流程图2.数据格式NEWNODE数据格式数据格式NEWNODES4FnI13.数据处理详细描述Cortex-M0开启,通过Zigbee发送NEWNODE数据给Cortex-A8,程序通过MainReadThread线程读取到数据,交由MainHandlerThread线程处理。MainHandlerThread对NOEWNODE进行校验,判断是否合法,如果数据无误,通过发送Handler消息交由SmartHomeActivity主界面UI线程,SmartHomeActivity 判断链表是否已经
13、存在该节点,不存在则加入链表并创建节点。4.1.1.2 NODEINFO,节点信息更新。1.数据处理流程图图4.2NODEINFO数据流程图2.数据格式NODEINFO数据数据格式NODEINFOS23FiI1T24H30L6V220X1Y1Z603.数据处理详细描述Cortex-M0开启,通过Zigbee发送NEWNODE数据给Cortex-A8,程序通过MainReadThread线程读取到数据,交由MainHandlerThread线程处理。MainHandlerThread对NODEINFO进行校验,判断是否合法,如果数据无误,通过发送Handler消息交由SmartHomeActiv
14、ity主界面UI线程,SmartHomeActivity 判断链表是否已经存在该节点,存在则更新该链表信息,并判断是否进入该节点从界面,如果进入发送Broadcast通知从界面更新数据。4.1.1.3 RFID,用户登录或退出。 1.数据处理流程图图4.3RFID数据流程图2.数据格式RFID数据格式数据格式RFIDS11FrI1R1031323.数据处理详细描述Cortex-M0开启,通过Zigbee发送NEWNODE数据给Cortex-A8,程序通过MainReadThread线程读取到数据,交由MainHandlerThread线程处理。MainHandlerThread对RFID进行校
15、验,判断是否合法,如果数据无误,通过发送Handler消息交由SmartHomeActivity主界面UI线程,SmartHomeActivity发送Broadcast通知从界面,从界面判断是否为自己设备,是则更新数据。4.1.2 Application层详细设计与实现4.1.2.1 类对象详细描述1 .Data类,负责对接受来数据进行处理表4.1 Data成员属性表属性类型描述serialVersionUIDlong序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。dataString存储从串口的数据表4.2 Data成员方法表方法参数返回值描述getDataSizeVoi
16、dString从传来的数据获取数据大小isValidDataVoidboolean数据有效性校验,包括数据是为为空,完整等getDataTypeVoidint从传来的数据获取数据类型getDataTargetVoidString从传来的数据获取数据的设备号getRfidVoidString从传来的数据获取Rfid信息getTemperatureVoidString从传来的数据获取温度getHumidityVoidString从传来的数据获取湿度getLightVoidString从传来的数据获取光感getAdVoidString传来的数据获取AD值getXVoidString从传来的数据获取三
17、轴加速度x值getYVoidString从传来的数据获取三轴加速度y值getZVoidString从传来的数据获取三轴加速度z值2 .NodeCmd类,负责与底层进行交互,实现对硬件设备读,写操作。表4.3 NodeCmd成员属性表属性类型描述DevCmdenum使用枚举将命令声明一组命名的常数,方便函数调用。myUartServiceMyUartService串口操作所使用框架表4.4 NodeCmd成员方法表方法参数返回值描述devControlint, DevCmdString向串口发送数据readNodeVoidString从串口获取数据3 .NodeInfo类,负责存储一个设备的信息
18、。表4.5 NodeInfo成员属性表属性类型描述serialVersionUIDlong序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。temperatureString存储节点对象的温度值humidityString存储节点对象的湿度lightString存储节点对象的光感值xString存储节点对象的三轴加速度x值yString存储节点对象的三轴加速度y值zString存储节点对象的三轴加速度z值adString存储节点对象的ad值ledint存储节点对象的led灯状态(0,灭;1,亮)funint存储节点对象的风扇状态(0,关;1,开;2,加速)beepint存储节
19、点对象的报警器状态(0,关;1,开)nixietubint存储节点对象的数码管状态(0,关;1,开)rfidrfid存储节点对象的rfid信息devNumint存储节点对象的设备号nextNodeInfo便于生成链表watchDogint看门狗,监控节点生命值表4.6 NodeInfo成员方法表方法参数返回值描述NodeInfovoidvoid构造函数,初始化节点对象NodeInfovoidint有参数构造函数,参数为节点设备号getNextvoidNodeInfosetNextNodeInfovoidgetTemperaturevoidString获取该对象温度值setTemperature
20、Stringvoid设置该对象温度值getHumidityvoidString获取该对象湿度值setHumidityStringvoid设置该对象湿度值getLightvoidString获取该对象光感值setLightStringvoid设置该对象光感值getAdvoidString获取该对象AD值setAdStringvoid设置该对象AD值getXvoidString获取该对象三轴加速度x值setXStringvoid设置该对象三轴加速度x值getYvoidString获取该对象三轴加速度y值setYStringvoid设置该对象三轴加速度y值getZvoidString获取该对象三轴加
21、速度z值setZStringvoid设置该对象三轴加速度z值getLedvoidint获取该对象Led状态值setLedintvoid设置该对象Led状态值getFunvoidint获取该对象Fun状态值setFunintvoid设置该对象Fun状态值getBeepvoidint获取该对象Beep状态值setBeepintvoid设置该对象Beep状态值getNixietubvoidint获取该对象Nixietub状态值setNixietubintvoid设置该对象Nixietub状态值getDevNumvoidint获取该对象DevNum值setDevNumintvoid设置该对象DevNu
22、m值getRfidvoidString获取该对象Rfid值setRfidStringvoid设置该对象Rfid值getWatchDogvoidint获取该对象WatchDog值setWatchDogintvoid设置该对象WatchDog值ledOnvoidvoid开灯ledOffvoidvoid关灯funOnvoidvoid开风扇FunOn1voidvoid风扇加速funOffvoidvoid关风扇beepOnvoidvoid开蜂鸣器beepOffvoidvoid关蜂鸣器nixietubeOnvoidvoid开数码管nixietubeOffvoidvoid关数码管4 .NodeList类,存
23、储所有连接设备的信息,便于进行界面节点的更新,删除和添加操作。表4.7 NodeList成员属性表属性类型描述headNodeInfo链表头结点lenLong链表长度表4.8 NodeList成员方法表方法参数返回值描述getHeadNodeInfovoid获取链表头结点setHeadvoidNodeInfo设置链表头结点createNodeListvoidvoid创建设备节点链表insertNodeNodeInfovoid插入节点delNodeNodeInfovoid删除节点allNodevoidvoid遍历链表所有节点findByDevNumintNodeInfo通过设备号找到节点node
24、IsNotExistedintboolean通过设备号查找节点是否存在于链表delByDevNumintvoid通过设备号删除节点allNodeSetWatchDogvoidString所有设备节点看门狗减一oneNodeFeedWatchDogintvoid通过设备号找到设备节点并喂狗findNodeDogDievoidint遍历设备节点,查看是否有节点生命结束getLenvoidint得到链表长度findNodeByPosintNodeInfo通过在链表中位置查找到设备节点4.1.2.2 线程类详细描述1 . MainReadThread类当启动MainReadThread线程,执行run
25、方法,run方法先通过running判断是否执行读操作,如果running为true,进行对设备读操作,判断MainHandlerThread处理线程是否创建,未创建则创建并将读出的数据传给MainHandlerThread,并启动线程,循环执行。图4.4 MainReadThread RUN流程图2 . MainHandlerThread类当MainReadThread线程将读取的数据传到MainHandlerThread后,先对数据进行有效性认证,如果数据有误,使用handler传递发送给SmartHomeActivity即主界面UI线程,进行处理;如果数据无误,判断数据类型并使用hand
26、ler传递,发送给SmartHomeActivity进行处理。图4.5 MainHandlerThread RUN流程图3 . NodeWriteThread类只负责执行设备控制的命令,使用线程可以使程序多次独立线程执行,不被影响。图4.6 NodeWriteThread RUN流程图4.1.2.3 UI类详细描述1 . SmartHomeActivity类(1) onCreatea) 初始化节点列表nodeList。b) 设置从界面标题,setTitle。c) 设置视图,setContentView。d) 获取主界面控件的引用,findViewById。e) 设置GridView和使用的适配
27、器BaseAdapter。f) 设置选项被单击的监听器,setOnItemClickListener。g) 设置线程的 Handler,重写handleMessage方法。h) 打开程序读线程。i) 注册返回广播接收器。(2) onDestroya)卸载广播接收器,unregisterReceiver。b)关闭读线程,mainReadThread.stop。c)关闭主界面Activity,this.finish。(3) updataLayOuta)设置所有节点的看门狗减一,allNodeSetWatchDog。b)判断是否有节点看门狗死亡,findNodeDogDie。如果存在,删除Node节
28、点链表,delByDevNum,并判断是否进入该节点从界面,如果进入则发送广播使其退出。最后,向该死亡设备发送确认命令ISEXIT,如果未死亡,重新发送添加节点NewNode的数据。c)更新适配器notifyDataSetChanged。(4)BackReceiver 广播接受器a)从节点列表删除从界面返回的节点的原对象,nodeList.delByDevNum()b)向节点列表插入从界面返回的新节点对象,nodeList.insertNode()c)关闭从界面Activity ,finishActivity()。2 . NodeInfoActivity类(1) onCreatea)创建从节点
29、对象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类继承SQLiteOpenHelp
30、er类,重写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 fr
31、om rfidTable where rfId = ?2 . 数据库表设计表4.9 rfidTable数据库表字段名类型属性描述idINTEGERprimary key autoincrementID主键devIdVARCHARNull设备号rfIdVARCHARNullRFID号4.1.2.5 框架详细描述 MyUartService类1 .加载库,System.loadLibrary(uart_runtime)2 .重写构造函数,调用本地 _init方法,对设备进行初始化。3. 通过调用本地方法实现java方法4.2 A8-数据传递架构模块4.2.1 层次接口表 数据传递(串口操作)应用层
32、UartDataUpdateNew MyUartServiceUartSendCmdframework层_uart_send_cmd_uart_data_update_initJNI层Uart_writeUart_initUart_readHal层Uart_write_halUart_read_drvUart_device_openUart_read_halUart_write_drv驱动WriteOpenRead图4.6.1 接口层次图图4.6.2 结构图4.2.2 HAL层1、 宏表4.10 HAL层宏定义表名称内容功能UART_HARDWARE_MODULE_IDuart定义hal 的模
33、块idSTART0xAA数据包的开始符NEW0x01新节点加入发的包INFO0x02采集的信息包RFID0x04刷卡时发的包2、 全局变量表4.11 HAL层全局变量表名称类型功能fdint操作设备的文件描述符3、 结构体表4.12 HAL层结构体表struct uart_module_t成员名类型功能commonstruct hw_module_t记录本stub的基本信息和入口struct uart_control_device_t成员名类型功能commonstruct hw_device_t记录本stub操作设备时需要包括的接口uart_read_hal函数指针指向实际读串口的函数uart
34、_write_hal函数指针指向实际写串口的函数4、流程图图4.7 HAL层结构图4.2.3 JNI层1、 宏表4.13 JNI层宏定义表名称内容功能UART_HARDWARE_MODULE_IDuart定义HAL 的模块ID2、 全局变量表4.14 JNI层全局变量表名称类型功能sUartDeviceuart_control_device_t *保存通过调用stub中的open接口后得到的devices handlesUartModuleuart_module_t*保存通过调用Android HAL标准函数hw_get_module,传入UART_HARDWARE_MODULE_ID后得到的
35、UART stub的句柄3、 流程图JNI层主要实现了Java与c/c+之间的过渡,不涉及复杂的逻辑,只根据规则为上层函数调用相应的下层接口,参见整体流程。4.2.4 Framework层表4.15 Framework层类表public class MyUartService方法功能System.loadLibrary装载编译好的JNI层的共享库public MyUartService构造函数,打开并初始化串口public String UartDataUpdate读取当前串口信息数据包public int UartSendCmd向串口传送命令数据包4.2.5 整体流程下续:hal层图4.8
36、整体流程图4.2.6 关键代码分析1 NodeCmd.javastatic MyUartService myUartService = new MyUartService(); /新建对象,初始化 String s = myUartService.UartDataUpdate(); /更新采集数据 myUartService.UartSendCmd(1, LED_ON); /点亮1号设备的灯 2 MyUartService.javapackage .smarthome.uart; import android.util.Log; public class MyUartService /* * load native service. */ static System.loadLibrary(uart_runtime); /装载库 public MyUartService() _init(); /注册本地方法,打开串口并初始化 /* * uart native methods. */