过在链表中位置查找到设备节点
4.1.2.2线程类详细描述
1 . MainReadThread类
当启动MainReadThread线程,执行run方法,run方法先通过running判断是否执行读操作,如果running为true,进行对设备读操作,判断MainHandlerThread处理线程是否创建,未创建则创建并将读出的数据传给MainHandlerThread,并启动线程,循环执行。
图4.4 MainReadThread RUN流程图
2 . MainHandlerThread类
当MainReadThread线程将读取的数据传到MainHandlerThread后,先对数据进行有效性认证,如果数据有误,使用handler传递发送给SmartHomeActivity即主界面UI线程,进行处理;如果数据无误,判断数据类型并使用handler传递,发送给SmartHomeActivity进行处理。
图4.5 MainHandlerThread RUN流程图
3 . NodeWriteThread类
只负责执行设备控制的命令,使用线程可以使程序多次独立线程执行,不被影响。
图4.6 NodeWriteThread RUN流程图
4.1.2.3UI类详细描述
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()
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.9 rfidTable数据库表
字段名 类型 属性 描述
id INTEGER primary key autoincrement ID主键
devId VARCHAR Null 设备号
rfId VARCHAR Null RFID号
4.1.2.5框架详细描述
· MyUartService类
1 .加载库,System.loadLibrary("uart_runtime")
2 .重写构造函数,调用本地 __init方法,对设备进行初始化。
3. 通过调用本地方法实现java方法
4.2A8-数据传递架构模块
4.2.1层次接口表
数据传递(串口操作)
应用层
framework层
JNI层
Hal层
驱动
图4.6.1 接口层次图
图4.6.2 结构图
4.2.2HAL层
1、宏
表4.10 HAL层宏定义表
名称 内容 功能
UART_HARDWARE_MODULE_ID "uart" 定义hal 的模块id
START 0xAA 数据包的开始符
NEW 0x01 新节点加入发的包
INFO 0x02 采集的信息包
RFID 0x04 刷卡时发的包
2、全局变量
表4.11 HAL层全局变量表
名称 类型 功能
fd int 操作设备的文件描述符
3、结构体
表4.12 HAL层结构体表
struct uart_module_t
成员名 类型 功能
common struct hw_module_t 记录本stub的基本信息和入口
struct uart_control_device_t
成员名 类型 功能
common struct hw_device_t 记录本stub操作设备时需要包括的接口
uart_read_hal 函数指针 指向实际读串口的函数
uart_write_hal 函数指针 指向实际写串口的函数
4、流程图
图4.7 HAL层结构图
4.2.3JNI层
1、宏
表4.13 JNI层宏定义表
名称 内容 功能
UART_HARDWARE_MODULE_ID "uart" 定义HAL 的模块ID
2、全局变量
表4.14 JNI层全局变量表
名称 类型 功能
sUartDevice uart_control_device_t * 保存通过调用stub中的open接口后得到的devices handle
sUartModule uart_module_t* 保存通过调用Android HAL标准函数hw_get_module,传入UART_HARDWARE_MODULE_ID后得到的UART stub的句柄
3、流程图
JNI层主要实现了Java与c/c++之间的过渡,不涉及复杂的逻辑,只根据规则为上层函数调用相应的下层接口,参见整体流程。
4.2.4Framework层
表4.15 Framework层类表
public class MyUartService
方法 功能
System.loadLibrary 装载编译好的JNI层的共享库
public MyUartService 构造函数,打开并初始化串口
public String UartDataUpdate 读取当前串口信息数据包
public int UartSendCmd 向串口传送命令数据包
4.2.5整体流程
下续:hal层
图4.8 整体流程图
4.2.6关键代码分析
1.NodeCmd.java
static MyUartService myUartService = new MyUartService(); //新建对象,初始化
String s = myUartService.UartDataUpdate(); //更新采集数据
myUartService.UartSendCmd(1, LED_ON); //点亮1号设备的灯
2.MyUartService.java
package cn.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
上一篇:
基于Android平台的校园通软件
下一篇:
试论APP广告在手机中的应用