版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
管理信息化物联网智能家居系统方案设计{管理信息化物联网}智能家居系统方案设计智能家居系统方案设计文档目录0.文档介绍40.1文档目的40.2文档范围40.3读者对象40.4参考文献40.5术语与缩写解释41.模块命名规则52.模块汇总52.1模块汇总表52.2模块关系图53.子系统A的模块设计63.N模块A-N64.子系统B的模块设计64.N模块B-N65.其他60.文档介绍0.1文档目的本文档旨在详细说明智能家居系统中门禁系统和linux下的模块程序开发过程,通过此文档的描述,希望可以达到具有同等技术的开发人员按此介绍可以完全重现此技术。0.2文档范围智能控制系统,嵌入式linux系统等。0.3读者对象嵌入式系统开发人员0.4参考文献无0.5术语与缩写解释缩写、术语解释CPLDCPLD是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统编程)将代码传送到目标芯片中,实现设计的数字系统。WiegandWiegand协议是国际上统一的标准,有很多格式,标准的26-bit应该是最常用的格式zigbee紫蜂技术1.模块命名规则本文档模块名称与具体实现的功能函数采取一致的表示方法。2.模块汇总设备管理,策略管理,人员管理,定时管理,设备底层操作,串口设备层操作,串口底层操作库,配置文件解析,以及UI通讯等模块。同时包括门禁控制系统模块,家居控制模块和环境探测模块以及人机交互界面设计模块。2.1模块汇总表设备管理(dev.c)模块名称功能简述init_dev初始化设备根节点add_dev添加入网设备del_dev删除链表中设备init_dev_policy_table按照设备类新初始化策略表update_dev_policy_table按照各个设备类型,更新链表中的各个设备策略表get_dev_policy_table_size按照设备节点的类型返回对应设备类型的策略表大小策略管理(policy.c)模块名称功能简述tempmon_policy_table_init初始化温度计类型设备的策略表。tempmon_policy_table_set_warn根据参数传过来的状态设置设备报警状态。tempmon_policy_table_update调用底层设备控制取得当前设备状态更新对应设备的策略表。设备底层操作接口(devctl.c)tempmon_get_dev_stat取得温度计设备状态tempmon_get_cur_temp取得温度计设备温度tempmon_set_hi_level设置温度计最高报警温度tempmon_set_low_levl设置温度计最低报警温度用户认证(auth.c)auth_user根据传来的用户名和密码,返回验证结果change_pass根据传来的用户名和密码,更改密码文del_pass根据传来的用户名,删除密码文件中的对应用户行add_user根据传来的参数,在密码文件中加入对应用户行配置文件处理(parm.c)load_parm解析器的前端,根据解析器的结果,抛出对应得错误。do_paser根据传进来的文件描述符,将文件中相应的参数解析到参数结构体。save_parm将参数结构体按照对应格式写入配置文件。getnline从文件中取得最大长度为n一行,并将回车翻译为字符串结尾符trim刨去传入字符串开头和结尾的空格和tab配置文件参数处理(parm_handler.c)temp_hi_level设置参数结构体的temp_hi_level参数temp_low_level设置参数结构体的temp_low_level参数带头节点的双向链表(list.c)移植自linux内核list_add_node插入节点list_del_node删除节点is_empty_list判断链表是否为空is_last_node判断是否为最后一个节点offsetof宏取得结构体元素相对于结构体开始的偏移量container_of宏通过结构体元素的指针取得结构体的指针循环缓冲区(loop_buf.c)移植自linux内核min宏返回两个数中的最小值init_loop_buf初始化循环缓冲区release_loop_buf释放循环缓冲区里的线程锁get_loop_buf从循环缓冲区中获取数据put_loop_buf向循环缓冲区中放置数据lock_buf循环缓冲区线程锁加锁unlock_buf循环缓冲区中线程锁解锁loop_buf_reset循环缓冲区指针复位loop_buf_len返回循环缓冲区剩余长度串口设备层操作(uart.c)init_uart调用底层串口库初始化串口_monitor串口监视线程,负责监视并接受串口上数据。pre_frame_proces对串口接受数据预处理,调用相应的操作函数read_uart_one_frame从串口读取完整一桢read_uart_buf从缓冲区读取数据,没有数据则休眠等待下次信号唤醒。串口操作库(uart.c)open_uart打开相应串口设备文件read_uart读取串口数据。write_uart将数据写入串口set_uart_speed设置串口工作速度set_uart_parity设置串口的工作特性,例如停止位奇偶流控等。read_uart_timeout带有超时的串口读取操作处理。UI通信(mui.c)init_mui初始化ui通信各个参数。mui_monitor套接字监视线程,监视套接字是否有命令数据到来。get_cmd_line从描述符中取得一行命令行warn_ui向ui发起报警命令处理程序(cmd.c)run_cmd命令解析器,调用对应命令的处理程序。error根据错误码,将返回对应得错误信息。命令处理程序handler(cmd_handler.c)xxx_and_handler对应各个命令的处理程序。门禁控制模块ReadWiegand读取用户卡信息SendWiegand发送用户卡信息SendCmd发送控制指令家居控制系统和环境探测模块GetTem采集环境信息SendTem封包发送采集数据RecTem解析采集数据信息SendLedData发送led显示数据GetTemFromCDLed模块收取并解析温度数据DisplayTem发送并显示信息OpenLamp打开继电器CloseLamp关闭继电器2.2模块关系图3.设备管理系统的模块设计模块名称init_dev功能描述初始化设备根节点接口与属性voidinit_dev(void);数据结构structdev{与算法pthread_mutex_lockmutex;unsignedintnr_dev;structlistlist;};补充说明包含设备编号和链表的线程锁模块名称add_dev功能描述向设备链表中添加设备节点接口与属性intadd_dev(chardev_type,chardev_no,char*ieee_addr);数据结构structdev_node{与算法chardev_type;chardev_no;charieee_addr[8];charalive;charfailed;void*policy_table;structlistlist;};补充说明根据传来的设备类型设备号及IEEE地址,分配新的设备节点,并填写相应的项目然后调用模块名称del_dev功能描述从设备链表中删除设备节点接口与属性intdel_dev(chardev_type,chardev_no);数据结构structdev_node{与算法chardev_type;chardev_no;charieee_addr[8];charalive;charfailed;void*policy_table;structlistlist;};补充说明模块名称init_dev_policy_table功能描述初始化设备策略表接口与属性voidinit_dev_policy_table(structdev_node*node);数据结构同上与算法补充说明模块名称renew_dev_policy_table功能描述将全局参数表的参数对应节点的参数刷新到设备的策略表里接口与属性voidrenew_dev_policy_table(structdev_node*node)数据结构无与算法补充说明模块名称renew_all_dev_policy_table功能描述将全局参数表的参数刷新到所有设备的策略表里接口与属性voidrenew_all_dev_policy_table(structdev_node*node)数据结构无与算法补充说明模块名称update_dev_policy_table功能描述通过调用设备控制层相关方法,取得设备对应状态,更新相应策略表接口与属性voidupdate_dev_policy_table(structdev_node*node)数据结构structdev_node{与算法chardev_type;chardev_no;charieee_addr[8];charalive;charfailed;void*policy_table;structlistlist;};补充说明模块名称update_all_dev_policy_table功能描述更新所有设备策略表接口与属voidupdate_all_dev_policy_table(structdev_node*node);性数据结构同上与算法补充说明模块名称check_dev_type功能描述检查设备类型是否合法接口与属性intcheck_dev_type(unsignedchardev_type)数据结构同上与算法补充说明模块is_dev_exist名称功能检查设备是否存在描述接口intis_dev_exist(unsignedchardev_type,unsignedchardev_no)与属性数据同上结构与算法补充说明模get_dev_node块名称功根据设备类型和设备号返回设备节点指针能描述接structdev_node*get_dev_node(unsignedchardev_type,unsignedchardev_no)口与属性数同上据结构与算法补充说明4.策略管理模块设计模块名称tempmon_policy_table_init功能描述温度计策略表初始化接口与属voidtempmon_policy_table_init(structdev_node*node);性数据结构struct__dev_table{与算法unsignedchardev_type;void(*policy_table_init)(structdev_node*);void(*policy_table_load_parm)(structdev_node*);void(*policy_table_update)(structdev_node*);void(*policy_table_warn)(structdev_node*,char);void(*parm_table_save)(structdev_parm*,FILE*fp);};structtempmon_policy{charhi_level;charlow_level;charcur_temp;chartemp_warn;};补充说明为设备节点钟的策略表指针分配内存,并使用参数表中的值初始化对应得设备。模块名称tempmon_policy_table_update功能描述调用设备层温度计操作函数,更新温度计温度策略表接口与属voidtempmon_policy_table_update(structdev_node*node);性数据结构同上与算法补充说明模tempmon_policy_table_set_warn块名称功根据传来的参数,设置对应温度计设备的报警状态能描述接voidtempmon_policy_table_set_warn(structdev_node*node,charstat);口与属性数同上据结构与算法补充说明模块tempmon_policy_table_load_parm名称功能将温度计参数表中的值填入策略表里描述接口voidtempmon_policy_table_load_parm(structdev_node*node)与属性数据同上结构与算法补充说明模块tempmon_policy_table_load_default_parm名称功能将温度计默认的参数填入策略表里描述接口voidtempmon_policy_table_load_parm(structdev_node*node)与属性数据同上结构与算法补充说明5.设备底层操作接口模块设计模块名称tempmon_get_dev_stat功能描述取得温度计设备状态接口与属性chartempmon_get_dev_stat(structdev_node*node);数据结构与无算法补充说明调用取得温度计温度判断是否有返回值,判断设备是否仍然有响应,如果设备没有响应,则将设备节点中的设备状态标记为设备已死并调用failed_dev_ctl使设备节点操作失败次数加1(考虑到网络延迟等情况,采用设备操作失败计数,当累计到操作失败到指定次数,则会调用del_dev将设备从设备链表中删除。而任何一次成功的设备操作则判定设备再次有响应,模块名称tempmon_get_dev_stat功能描述取得温度计当前温度接口与属性chartempmon_get_cur_temp(structdev_node*node);数据结构与structgen_frame{算法unsignedcharhead1;unsignedcharhead2;//always0x550xAAunsignedchartype;//frametypeWARNunsignedcharlen;//framelenunsignedchardev_type;//devicetypeunsignedchardev_no;//devicenocharstatus;};补充说明按照协议,组装好设备的查询数据包,从串口发出,并等待串口回应。模tempmon_set_hi_level块名称功设置当前温度计最高报警温度能描述接chartempmon_set_hi_level(structdev_node*node,charhigh_level);口与属性数structcon_frame{据unsignedcharhead1;结unsignedcharhead2;构unsignedchartype;与unsignedcharlen;算unsignedchardev_type;法unsignedchardev_no;unsignedcharcon_cmd;charcon_value;};补按照协议,组装好设备的控制数据包,从串口发出,并调用取得设备温充度,刷新设备状态。说明模tempmon_set_low_level块名称功设置当前温度计最低报警温度能描述接chartempmon_set_low_level(structdev_node*node,charhigh_level);口与属性数structcon_frame{据unsignedcharhead1;结unsignedcharhead2;构unsignedchartype;与unsignedcharlen;算unsignedchardev_type;法unsignedchardev_no;unsignedcharcon_cmd;charcon_value;};补按照协议,组装好设备的控制数据包,从串口发出,并调用取得设备温度,充刷新设备状态。说明其他设备以此类类推。5.用户认证模块设计模块名称auth_user功能描述根据传来的用户名和密码返回验证结果接口与属性charauth_user(char*name,char*pass);数据结构与无算法补充说明模块名称add_user功能描述根据传来的用户名和密码将用户添加到密码文件中接口与属性charadd_user(char*name,char*pass);数据结构与无算法补充说明模块名称del_user功能描述根据传来的用户名将用户从密码文件中删除接口与属性chardel_user(char*name);数据结构与无算法补充说明注意此处仅作用户存在性检查不做用户检查,用户检查应该由UI发命令使用auth_user检查通过后再来调用此函数。功能性模块尽可能在自己被调用时提供方法而不是策略。模块名称change_pass功能描述根据传来的用户名和密码将用户从密码文件中修改对应的记录接口与属性charchange_pass(char*name,char*pass);数据结构与无算法补充说明注意事项同上。用户配置文件格式为用户名和密码定长不足定长使用空格补足,分隔符为:防止频繁修改文件大小,加剧NandFland的读写。6.配置文件处理模块设计模块名称Load_parm功能描述解析器的前端,根据解析器的结果,抛出对应得错误接口与属性intload_parm(char*fname)数据结构与无算法补充说明无模块名称do_parser功能描述解析器主体,根据传进来的文件指针,将文件中相应的参数解析到全局参数表。接口与属性intdo_parser(FILE*fp);数据结构与structtemp_parm{算法inttemp_hi_level;inttemp_low_level;};unionparm{structtemp_parmtemp_parm;};structdev_parm{chardev_type;chardev_no;unionparmparm;};structparm_table{unsignedintnr_parm;structdev_parmdev_parm[NR_MAX_PARM];};structparm_action{charname[MAX_PARM_NAME_LEN];void(*func)(structdev_parm*,char*);};示例:structparm_actionparm_action[PARM_ACTION_LEN]={{"dev_type",load_dev_type},{"dev_no",load_dev_no},{"temp_hi_level",load_temp_hi_level},{"temp_low_level",load_temp_low_level},};补充说明模块名称save_parm功能描述根据传进来的文件名,将全局参数表存储到配置文件中。接口与属性intsave_parm(char*fname);数据结构与同上算法补充说明模块名称get_dev_parm功能描述根据传来的设备类型和设备号,返回对应设备的参数指针接口与属structdev_parm*get_dev_parm(chardev_type,chardev_no);性数据结构同上与算法补充说明模块名称getnline功能描述根据传进来的文件指针,从中取得一行,此行最大长度为count。接口与属性size_tgetnline(char*buf,size_tcount,FILE*fp);数据结构与无算法补充说明会将行尾的回车符替换为字符串结束的尾零,并且遇到EOF时停止。返回值为实际取得的字符数(含尾零/模块名称trim功能描述将传进来的字符串头尾的空格以及制表符砍去,然后将结果复制到dst。接口与属性char*trim(char*dst,constchar*src);数据结构与无算法补充说明各个参数的handler:模块名load_dev_type称功能描将设备类型填入到传入的dev_parm。述接口与voidload_dev_type(structdev_parm*dev_parm,char*value);属性数据结无构与算法补充说明模块名load_dev_no称功能描将设备号填入到传入的dev_parm。述接口与voidload_dev_type(structdev_parm*dev_parm,char*value);属性数据结无构与算法补充说明模块load_temp_hi_level名称功能将温度计最高报警温度填入到传入的dev_parm。描述接口voidload_temp_hi_level(structdev_parm*dev_parm,char*value)与属性数据无结构与算法补充说明模load_temp_low_level块名称功将温度计最低报警温度填入到传入的dev_parm能描述接voidload_temp_low_level(structdev_parm*dev_parm,char*value)口与属性数无据结构与算法补充说明模块名称temp_parm_save功能描述将传入的温度计的dev_parm按照格式写入到文件指针里接口与属性voidtemp_parm_save(structdev_parm*dev_parm,FILE*fp)数据结构与无算法补充说明7.带头节点双向链表模块设计模块名称init_list功能描述初始化链表头节点接口与属性voidinit_list(structlist*list);数据结构与structlist{算法structlist*prev,*next;};补充说明模块名list_add_node称功能描将节点加入链表。述接口与voidlist_add_node(structlist*new,structlist*node,intlocat属性ion);数据结同上构与算法补充说可以使用location标志指定插入node制定节点的左边还是右边,明如果node指向头节点,那么左边及为链表尾部,右边是链表头。模块名称list_del_node功能描述将节点从量表中删除接口与属性voidlist_del_node(structlist*node);数据结构与无算法补充说明模块名称is_last_node功能描述判断节点是否是链表的尾节点接口与属性intis_last_node(structlist*list,structlist*node);数据结构与无算法补充说明真为尾节点模块名称is_empty_list功能描述返回链表是否为空链表接口与属性intis_empty_list(structlist*list);数据结构与无算法补充说明真为空链表模块名称offsetof宏功能描述返回成员在结构体中的偏移接口与属性offsetof(TYPE,MEMBER);数据结构与无算法补充说明TYPE为对应结构体的类型,MEMBER为成员在结构体中的名字模块名称get_node_owner宏功能描述传入指向结构体中成员的指针,返回指向结构体的指针。接口与属性get_node_owner(ptr,type,member);数据结构与无算法补充说明type,member定义同offsetof,ptr为指向结构体中成员的指针。模块名称each_node_in_list宏功能描述使用pos指针遍历结构体。接口与属性each_node_in_list(pos,head);数据结构与#defineeach_node_in_list(pos,head)\算法for(pos=(head)->next;pos!=(head);pos=pos->next)补充说明注意不要在循环中修改pos指针。模each_owner_in_list宏块名称功使用pos指针遍历结构体,但是此pos的指针类型是链表宿主的,head节能点类型是链表类型。描述接each_owner_in_list(pos,type,member);口与属性数#defineeach_owner_in_list(pos,head,member)\据for(pos=get_node_owner((head)->next,typeof(*pos),member);\结&pos->member!=(head);\构pos=get_node_owner(pos->,typeof(*pos),member))与算法补同上。充说明8.循环缓冲区模块设计模块名称init_loop_buf功能描述初始化循环缓冲区。接口与属性intinit_loop_buf(structloop_buf*buf);数据结构与structloop_buf{算法pthread_mutex_tmutex;unsignedcharbuffer[LOOP_BUF_LEN];unsignedintin;unsignedintout;};补充说明注意缓冲区大小必须为2的平方。模块名称release_loop_buf功能描述释放循环缓冲区。接口与属性voidrelease_loop_buf(structloop_buf*buf);数据结构与同上算法补充说明释放结构体中的线程锁,同时复位缓冲区模put_loop_buf块名称功将数据放入循环缓冲区能描述接unsignedintput_loop_buf(structloop_buf*buf,unsignedchar*buffer,unsignedintlen口;与属性数同上据结构与算法补空间不足则只放入能放入的,返回值为实际放入数据长度。充说明模get_loop_buf块名称功使用pos指针遍历结构体,但是此pos的指针类型是链表宿主的,head节点类型是链表能型。描述接unsignedintget_loop_buf(structloop_buf*buf,unsignedchar*buffer,unsignedintlen口;与属性数同上据结构与算法补同上。充说明模块名称lock_buf(structloop_buf*buf);功能描述锁定循环缓冲区接口与属性voidlock_buf(structloop_buf*buf);数据结构与无算法补充说明无。模块名称unlock_buf功能描述解锁循环缓冲区接口与属性voidunlock_buf(structloop_buf*buf);数据结构与无算法补充说明无。模块名称loop_buf_reset功能描述循环缓冲区复位接口与属性voidloop_buf_reset(structloop_buf*buf);数据结构与无算法补充说明无。模块名称loop_buf_len功能描述返回循环缓冲区长度接口与属性unsignedintloop_buf_len(structloop_buf*buf);数据结构与无算法补充说明无。9.串口操作层模块设计模块名称init_uart功能描述按照本程序的需要调用串口库初始化串口,并开启监听线程接口与属性voidinit_uart(void);数据结构与无算法补充说明无。模块名称_monitor功能描述串口监听线程实例接口与属性void*_monitor(void*arg);数据结构与无算法补充说明首先调用read_uart_one_frame收到完整一桢,然后调用process_frame_buf处理由协调器主动发起的添加设备桢和报警桢根据返回值判断是否已经处理,直接进入下一个循环还是放入缓冲区,供发起查询的函数取得回应包。模块名称read_uart_one_frame功能描述从串口中取得完整一桢接口与属性ssize_tread_uart_one_frame(intfd,unsignedchar*buf);数据结构与无算法补充说明调用read_uart_timeout取得完整桢头,然后进行一系列桢检查,非法桢直接丢弃返回0,合法桢则放入buf。模块名称read_uart_buf功能描述从缓冲区读取数据,没有数据则休眠等待下次信号唤醒接口与属性voidunlock_buf(structloop_buf*buf);数据结构与无算法补充说明无。10.串口操作库模块设计模块名称open_uart功能描述打开串口接口与属性intopen_uart(char*fname);数据结构与无算法补充说明无。模块名称set_uart_speed功能描述设置串口速度接口与属性intset_uart_speed(intfd,intspeed);数据结构与无算法补充说明无。模块名称set_uart_parity功能描述设置串口各种工作属性接口与属性intset_uart_parity(intfd,intdatabits,intstopbits,intparity);数据结构与无算法补充说明无。模read_uart_timeout块名称功在timeout规定的时间内读取指定的count字符个数能描述接ssize_tread_uart_timeout(intfd,void*buf,size_tcount,inttimeo口ut);与属性数无据结构与算法补无。充说明11.UI通信模块设计模块名称init_mui功能描述创建与UI通信的线程初始化working信号量接口与属性voidinit_mui(void);数据结构与structmui_slot{算法pthread_mutex_tworking;intlink_sd;FILE*link_fp;};补充说明无。模块名称mui_monitor功能描述负责与UI通信的线程接口与属性void*mui_monitor(void*arg);数据结构与无算法补充说明创建并初始化unix域套接字,监听套接字连接。收到连接后使用get_cmd_line取得一行命令,将命令及套接字连接描述符(用于命令处理handler返回执行结果)一同传给run_cmd,解析并运行命令做出相应的查询/设置。模块名称get_cmd_line功能描述从文件指针取得一行命令接口与属性intget_cmd_line(FILE*fp,char*buf);数据结构与无算法补充说明将结束符转换为字符串结束符方便后面的处理模块名称warn_ui功能描述向ui报警接口与属性voidwarn_ui(chardev_type,chardev_no,charstat);数据结构与无算法补充说明如果槽里的连接描述符可以,则使用槽里面的连接描述符向UI发送报警返回结果。写连接描述符以前加锁,避免与命令返回值相冲突。12.命令处理部分设计模块名称run_cmd功能描述运行传来的命令,使用提供的连接返回命令执行结果。接口与属性intrun_cmd(intfd,char*cmd)数据结构与structcmd_action_table{算法charname[MAX_CMD_LEN];void(*func)(FILE*fp,char*sep);};示例:structcmd_action_tablecmd_action_table[]={{"GET",do_get},{"SET",do_set},{"USER",do_user},{"SAVE",do_save},};补充说明会复制新的描述符传给下面的handler,所以handler中关闭描述符生成的文件指针不会关闭当前连接。模块名称error功能描述根据传进来的错误号,将出错信息按照标准信息返回格式,返回到描述符上。接口与属性voiderror(FILE*fp,interrorno);数据结构与无算法补充说明不会关闭传入的文件指针。主Handler部分:模do_get块名称功解析get动词能描述接voiddo_get(FILE*fp,char*sep);口与属性数structsub_cmd_action_table{据charname[MAX_CMD_LEN];结void(*get)(FILE*fp,char*sep);构void(*set)(FILE*fp,char*sep);与}算示例:法structsub_cmd_action_tablesub_cmd_action_table[]={{"CONFIG",cmd_conf_get,cmd_conf_set},//getconfigfilename{"TEMP",cmd_temp_get,cmd_temp_set},};补根据取得接下来的命令目标,将剩余拆解的字符串传给目充sub_cmd_action_table中对应目标的get函数指针所指向的函数。说明模块名称do_set功能描述解析set动词接口与属性voiddo_set(FILE*fp,char*sep);数据结构与同上算法补充说明根据取得接下来的命令目标,将剩余拆解的字符串传给目sub_cmd_action_table中对应目标的set函数指针所指向的函数。模块名称do_user功能描述解析user动词接口与属性voiddo_user(FILE*fp,char*sep)数据结构与同上算法补充说明根据接下来的命令动词,对用户认证的各个功能做出响应,然后将返回的结果写入到传入的文件指针上。模块名称do_save功能描述解析save动词接口与属性voiddo_save(FILE*fp,char*sep)数据结构与同上算法补充说明根据接下来的命令动词,将当前的全局参数表格存到对应的文件里,如不指定文件名,则存储到默认的文件里,并将结果按照返回格式返回到传入的文件指针。子handler:模块名称cmd_conf_get功能描述解析到GETCONFIG后面的目标,遍历CONFIG文件夹,将其中的配置文件名按照对应的格式,返回到传入的文件指针。接口与属性voidcmd_conf_get(FILE*fp,char*sep);数据结构与无算法补充说明模块名称cmd_conf_set功能描述解析到SETCONFIG后面的目标,调用load_parm解析对应的配置文件,并renew策略表,将结果返回到传入的文件指针。接口与属性voidcmd_conf_get(FILE*fp,char*sep);数据结构与同上算法补充说明模块名称cmd_temp_get功能描述解析到GETTEMP后面的设备号,按照返回格式,返回温度计当前状态(策略表中),如果后面没有跟设备号,则根据返回格式,返回当前网络中所有温度计设备号。接口与属性voidcmd_conf_get(FILE*fp,char*sep);数据结构与同上算法补充说明模块名称cmd_temp_set功能描述解析到SETTEMP后面的参数,按照命令格式,取得当前命令中想要设置的最高值和最低值,并且使用修改全局参数表,如果全局参数表中没有此设备的参数则创建设备的参数。接口与属性voidcmd_temp_set(FILE*fp,char*sep)数据结构与同上算法补充说明附命令通信协议:设备操作相关:取得设备DEV_NO:UI发送:GET<分隔符><DEV_TYPE><结束符>UI接收:<状态值><分隔符><DEV_NO><分隔符><DEV_NO><分隔符>……<DEV_NO><分隔符><结束符>状态值DEV_NO_START返还设备号开始注意结束符前有一分隔符,如果无此类型的设备,则返回格式类似下面:<状态值><分隔符><分隔符><结束符>温度计相关命令:#defineMAX_TEMP125#defineMIN_TEMP-125#defineTEMP_POSION126//如果取到这个温度则代表温度获取失败取得状态:UI发送:GET<分隔符><DEV_TYPE><分隔符><DEV_NO><结束符>UI收到:<状态值><分隔符><DEV_TYPE><分隔符><DEV_NO><分隔符><当前温度><分隔符><最高温度><分隔符><最低温度><结束符>状态值成功SUCCESS可能失败的状态值ERROR_CMD_NOT_FOUND命令不完整ERROR_DEV_NOT_FOUND设备不存在设置状态:SET<分隔符><DEV_TYPE><分隔符><DEV_NO><分隔符><最高温度><分隔符><最低温度><结束符>UI接收到:<状态值><分隔符><MESSAGE><结束符>成功SUCCESS可能失败的状态值ERROR_CMD_NOT_FOUND命令不完整ERROR_DEV_NOT_FOUND设备不存在配置文件相关命令:1.取得可用配置文件UI发送:GET<分隔符>CONFIG<结束符>UI接收:<状态值><分隔符><FILENAME><分隔符>……<FILENAME><分隔符><结束符>成功状态值为CONF_NAME_START777可能的失败状态ERROR_CONF_DIR_NOT_FOUND板上配置文件目录打开失败注意结束符前有一分隔符,如果无此类型的设备,则返回格式类似下面:<状态值><分隔符><分隔符><结束符>2.载入指定配置文件UI发送SET<分隔符>CONFIG<分隔符><文件名><结束符>UI接收:<状态值><分隔符><Message><结束符>成功状态值为SUCCESS可能失败的状态值ERROR_CMD_CONFIG_NOT_FOUND配置文件载入失败3.保存配置文件UI发送SAVE<分隔符>CONFIG<分隔符>[文件名]<结束符>如不指定文件名则配置将保存到默认配置文件defalut中UI返回<状态值><分隔符><Message><结束符>成功状态值SUCCESS可能失败的状态值:ERROR_SAVE_CONF保存配置文件失败用户认证相关命令:用户认证:UI发送:USER<分隔符>AUTH<分隔符><USERNAME><分隔符><PASSWORD><结束符>UI接收:<状态值><分隔符><MESSAGE><结束符>成功状态值为USER_AUTH_PASS或USER_AUTH_FAILED可能失败的状态ERROR_USER_AUTH密码文件打开失败用户添加:UI发送:USER<分隔符>ADD<分隔符><USERNAME><分隔符><PASSWORD><结束符>UI接收:<状态值><分隔符><MESSAGE><结束符>成功状态值为SUCCESS可能失败的状态ERROR_USER_ADD添加用户失败用户删除:UI发送:USER<分隔符>DEL<用户名><结束符>UI接收:<状态值><分隔符><MESSAGE><结束符>成功状态值为SUCCESS可能失败的状态ERROR_USER_DEL删除用户失败用户改密UI发送:USER<分隔符>PASS<用户名><分隔符><新密码><结束符>UI接收:<状态值><分隔符><MESSAGE><结束符>成功状态值SUCCESS可能失败的状态ERROR_USER_CHANGE_PASS用户改密失败、参数:#defineMAX_CMD_LEN10//单个命令部分最长值#defineMAX_CMD_LINE_LEN128//命令行最长值#defineCMD_DELIM""//分隔符#defineCMD_END"\r\n"//结束符#defineSOCKKET_ADDR"homecore-socket"socket地址状态值列表:#defineSUCCESS0//成功#defineERROR_CMD_NOT_FOUND1//#defineERROR_CMD_PARM_INVAILD2#defineERROR_DEV_NOT_FOUND3#defineCONF_NAME_START4#defineERROR_CMD_CONFIG_NOT_FOUND5#defineERROR_CONF_DIR_NOT_FOUND6#defineUSER_AUTH_PASS7#defineUSER_AUTH_FAILED8#defineERROR_USER_AUTH9#defineERROR_USER_ADD10#defineERROR_USER_DEL11#defineERROR_USER_CHANGE_PASS12#defineERROR_SAVE_CONF13#defineWARN_START14#defineDEV_NO_START1513.驱动程序设计1.门禁驱动程序设计根据门禁控制系统文档,修改Linux内核源代码arch/arm下开发板相关文件(根据内核版本不同,此处可能为mach-smdk2410或者是mach-s3c2410的CPLD内存物理地址映射到的虚拟地址。驱动程序设计初步实现read方法用于用户态程序取得门禁控制系统返回的卡号,ioctl方法用于用户态程序实现门的打开和关闭,一个中断处理程序,负责响应门禁控制系统的中断。2.LCD驱动移植根据LCD手册,将合适的参数填入到s3c2410fb_mach_info类型的结构体中并在.int_machine所制定的初始化函数中将结构体传给platform_data(不同内核版本此处调用不同),供驱动程序加载。3.触摸屏驱动实现Open,read,release,fasync,poll方法,probe中设置对应GPIO引脚,注册中断并在devfs中建立对应设备节点,read方法中从循环缓冲区中取得捕获的数据返回个用户态程序。在adc和触摸屏的中断中捕获屏幕的坐标,将其放入循环缓冲区。4.音频驱动程序Probe中初始化GPIO引脚功能,申请IRQ注册,同时初始化uda1341,注册声卡dsp和mixer的操作方法,open方法打开时初始化循环缓冲区,并且初始化iis总线的收发。在dsp的ioctl方法中实现音频流各种参数的处理,在mixer的ioctl方法中实现声音设备音量等处理。14.门禁控制系统设计一、教学用门禁子板接口说明:二、韦根读卡器接口,DATA0DATA1GND和5V04CPLD8个I/O,分别为Wiegand1、Wiegand2、Wiegand3、Wiegand4;三、4个按键输入,占用CPLD4个I/O,为KeyIN2个门状态反馈输入,占用CPLD2个I/O,为DoorSta;2个继电器控制输出,占用CPLD2个I/O,为ConOut1和ConOut2;1个中断请求输出,占用CPLD1个I/O,为INTR;1个片选输入占用CPLD1个I/O,为CS5个地址线,占用CPLD5个I/O,为Addr(0,4)16个地址线,占用CPLD16个I/O,为Data(0,15)1个读信号,占用CPLD1个I/O,为RD1个写信号,占用CPLD1个I/O,为WR1个复位信号,占用CPLD1个I/O,为RESET框图如下图所示:B四、和ARM板接口信号说明下图为ARM板接口信号示意图连接描述如下:DATA0~DATA15连接到Data(0,15)ADDR0~ADDR4连接到Addr(0,4)nOE连接到RD,变低表示开始读nWE连接到WR,变低表示开始写nGCS2连接到CS,ARM输出低电平,表示选中CPLDGPA15连接到RESETARM输出低电平,表示复位CPLD,工作状态一直保持高电平EINT3连接到INTR,为ARM中断输入信号,低电平五、工作过程描述数据流程如框图所示:如果有事件发生(事件可能是四个读卡器接口有数据输入或门状态异常),CPLD向ARM发中断请求,请求处理。ARM响应后发读数据命令,CPLD把数据传送给ARM,ARM判断数据后,再把指令送给CPLD,CPLD根据指令是否执行开关门操作。还有一种状况是ARM直接发指令,让门打开或关闭。六、关于韦根协议说明关于韦根协议说明:Wiegand协议是国际上统一的标准,有很多格式,标准的26-bit应该是最常用的格式。此外,还有34-bit、37-bit等格式。标准26位Wiegand通讯协议标准韦根输出是由26位二进制数组成,每一位的含义如下:26XXXXXXXXXXXXXXXXXXXXXXXXXX二进制第1位为2—13位的偶校验位第2—9位对应与电子卡HID码的低8位第10-25位对应电子卡的PID号码第26位为14-25位的奇校验位这26位数据在读出器的韦根输出线D0,D1上输出。数据输出高位在前。所以CPLD支持各种协议的Wiegand协议,依靠标准协议来判断是多少bit的格式,所以CPLD接收的Wiegan数据寄存器设计成最大48bit,为区别各个协议在每组数据包的最后三位置成标志码,所以最大支持45bit数据。000------表示26-bit标准协议001------表示27-bit协议010------表示32-bit协议011------表示34-bit协仪100------表示36-bit协议101-----表示37-bit协议七、实现方案1.在ARM复位后,发复位信号,置GPA15为低,CPLD进入工作状态。2.如果有事件发生,CPLD发出中断请求,把EINT3置高,ARM响应中断后读CPLD中的数据,具体的地址分配如下(reader对应图一的Wiegand)据宽度为16bit:Addr[4:0]AccessMode描述Wiegand1接口数据地址00000ReadonlyReader1datalow00001ReadonlyReader1datamid00010ReadonlyReader1datahighWiegand2接口数据地址00011Reader2datalow00100Reader2datamid00101Reader2datahighWiegand3接口数据地址00110Reader3datalow00111Reader3datamid01000Reader3datahighWiegand4接口数据地址01001Reader4datalow01010Reader4datamid01011Reader4datahigh状态寄存器01100Readonly控制寄存器(门控制等信息)01101WriteonlyControlDoor由于公用一条中断请求,所以ARM分不出是哪个中断请求,所以ARM每次读的时候把00000~01011地址的数据全部读出,从而做出开关门判断。如果有一组数据为全0,表示这一组没有卡号输入。读出数据后,ARM写控制寄存器命令即向地址01101写入相关数据。Wiegand1和Wiegand2共同对应ConOut1(1#doorWiegand3和Wiegand4共同对应ConOut2(2#door状态寄存器的详细描述Bit15Bit14Bit13Bit12Bit11Bit10Bit9Bit8KS4KS3Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0KS2KS1WS4WS3WS2WS1DS2DS1DS1:1#doorstatus(0=正常1=异常)DS2:2#doorstatus(0=正常1=异常)WS1:Wiegand1status1号韦根对卡器状况(0=读卡器正常,1=读卡器异常)WS2:Wiegand2status2号韦根对卡器状况WS3:Wiegand3status3号韦根对卡器状况WS4:Wiegand4status4号韦根对卡器状况KS1:1#Keystatus1号键状态(0=未按键,1=有按键)KS2:2#Keystatus2号键状态(0=未按键,1=有按键)KS3:3#Keystatus3号键状态(0=未按键,1=有按键)KS4:4#Keystatus4号键状态(0=未按键,1=有按键)控制寄存器的详细描述Bit15Bit14Bit13Bit12Bit11Bit10Bit9Bit8Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0DO2DO1DO1-----1#dooropen0=关1=开DO2-----2#dooropen0=关1=开六:具体模块主要函数说明模块名称ReadWiegand功能描述从读卡器读取用户信息,并提供后续处理接口与属性BoolReadWiegand(void)补充说明当读取成功的时候,函数返回非0值,失败返回-1模SendWiegand块名称功向用户接口发送数据,能描述接UnsignedcharSendWiegand(unsignedchar*data,unsignedcharlen)口与属性补此函数发送成功,返回发送的字节数充说明模块名称SendCmd功能描述直接发送控制门的开和关接口与属性VoidSendCmd(unsignedchardoor,unsignedcharstate)补充说明此函数指定控制几号门(door)和门的状态(开或关)15.家居控制系统和环境探测模块环境探测采用zigbee无线通讯技术,通过温度传感器采集环境温度,上报到家庭网关,网关解析温度数据,实时的显示温度到led显示屏幕,其结构图如下:家居控制主要涉及对继电器的控制,通过继电器的通或者断来控制照明设备的开或者关。模块主要涉及的功能函数说明如下:模块名称GetTem功能描述负责温度采集接口与属性VoidGetTem(unsignedchar*tmp)补充说明此功能函数负责采集温度数据并封装采集数据温度值用两个字节来存储模块名称SendTem功能描述上报采集温度数据接口与属性VoidSendTem(unsignedinttem)补充说明此函数利用zigbee无线网络传递温度信息到家庭网关处理模块名称RecTem功能描述网关解析温度数据包接口与属性VoidRecTem(void)补充说明此函数解析接收包含了温度值的无线数据包模SendLedData块名称功网关封装温度数据帧并发送温度显示命令到led显示模块能描述接UnsignedcharSendLedData(unsignedchar*leddata,unsignedcharlen)口与属性补无充说明模块名称GetTemFromCD功能描述LED显示模块接收并解析温度数据帧接口与属性VoidGetTemFromCD(VOID)补充说明无模块DisplayTem名称功能Led显示模块控制led屏幕显示温度值描述接口UnsignedcharDisplayTem(unsignedchartem[],unsignedcharlen)与属性补充函数执行成功返回非0值,失败返回-1说明模块名称OpenLamp功能描述打开继电器控制照明设备接口与属性VoidOpenLamp(void)补充说明实现照明设备的打开模块名称CloseLamp功能描述关闭继电器控制照明设备接口与属性VoidCloseLamp(void)补充说明实现照明设备的关断16.人机交互界面模块设计人机交互模块采用基于Armlinux下的GUI-Qt应用程序开发来完成,用户通过在LCD上显示的软件界面,辅助触摸屏来完成各项操作,其结构图如下:主界面的视图;煤气火警报警信息显示窗磁开关门磁模式遥控器温度计退出主
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 华润物业合同范例
- 2024高考政治一轮复习第二部分政治生活第一单元公民的政治生活单元整合教案
- 初中创新实践报告范文
- 2025加工承揽合同的样板2
- 2025快递承包合同协议书
- 2025年烟台货运从业资格证模拟考
- 2025年商洛货运考试题目
- 2025上海市房屋租赁合同登记备案证明办理指南
- 聚能处理机行业深度研究报告
- 上海外国语大学贤达经济人文学院《中日关系史专题》2023-2024学年第一学期期末试卷
- 国开电大《亲子关系与亲子沟通》形考+大作业
- (2024年)中国传统文化介绍课件
- 2024年度武汉天河国际机场免税店经营合同3篇
- 蛇年春联对联240副
- 四川省南充市2023-2024学年高一上学期期末考试 政治 含解析
- 【MOOC】土木工程制图-同济大学 中国大学慕课MOOC答案
- 餐厅服务培训
- 南水北调江苏水源公司2024年下半年校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 寒假安全教育 1
- 人教版5年级上册音乐测试(含答案)
- 数智时代的商业变革智慧树知到期末考试答案章节答案2024年山东大学(威海)
评论
0/150
提交评论