安防监控系统设计方案,安防通讯系统
终极管理员 知识笔记 57阅读
文章目录 前言一、分层意识二、数据流三、应用场景3.1 A9平台3.2 zigbee 四、通信结构体具体设计及分析4.1 数据上传4.2 数据下发4.3 控制命令字的制定 总结
前言

书接上次项目概要本期和大家主要分享的此项目中通信结构体的设计那么这部分是非常重要的可以说在了解清楚了项目需求之后接下来软件设计中通信结构体的设计是非常重要的一环本期只介绍关于结构体的设计后期各个模块的具体实现中再带大家来看具体结构体在软件中的巧妙用处
一、分层意识1.web网页显示
环境信息实时刷新
1ADC电压数据
2MPU6050的六轴数据
3温度和湿度
摄像头实时刷新视频流
硬件控制web指令下发至A9
1)风扇
2)蜂鸣器
3)LED
4)GPRS
2.A9数据处理
在主进程中创建各个线程比如zigbee、LED、蜂鸣器、姿态传感器、ADC等硬件设备的具体处理线程也包括数据刷新线程和客户端请求线程
3.zigbee采集部分
这里主要是通过A9平台上传ADC姿态传感器以及zigbee平台的温湿度信息这里大家也可以自主进行扩展

数据上传共享内存
指令下发消息队列
此项目可以应用于家庭的安防监控工业工厂监控校园环境监控等多个监控场所
3.1 A9平台蜂鸣器蜂鸣器报警
LED灯卧室-厕所-楼道-公共照明-----LED2-LED3-LED4-LED5
按键按键触发中断—控制卧室和厕所灯-----LED2-LED3
ADC获取ADC的采样数据
mpu6050获取MPU6050的六轴数据
#defineGPRS_DEV /dev/ttyUSB0#defineZIGBEE_DEV /dev/ttyUSB1#defineBEEPER_DEV /dev/fsbeeper0#defineLED_DEV /dev/fsled0
3.2 zigbee adc协调器
风扇终端节点 下发命令控制风扇
温湿度终端节点 上传温湿度数据
数据类型定义 typedef uint8_t unsigned char;typedef uint16_t unsigned short;typedef uint32_t unsigned int;//考虑到内存对齐的问题zigbee平台的相关数据struct makeru_zigbee_info{uint8_t head[3]; //标识位: m s m makeru-security-monitor uint8_t type; //数据类型 z---zigbee a---a9float temperature; //温度float humidity; //湿度float tempMIN;//温度下限float tempMAX;//温度上限 float humidityMIN; //湿度下限float humidityMAX; //湿度上限uint32_t reserved[2]; //保留扩展位默认填充0//void *data; 内核预留的扩展接口 参考版};//A9平台的相关数据struct makeru_a9_info{uint8_t head[3]; //标识位: m s m makeru-security-monitor uint8_t type; //数据类型 z---zigbee a---a9uint32_t adcshort gyrox; //陀螺仪数据short gyroy;short gyroz;short aacx; //加速计数据short aacy;short aacz;uint32_t reserved[2]; //保留扩展位默认填充0//void *data; 内核预留的扩展接口 参考版};struct makeru_env_data{struct makeru_a9_info a9_info; struct makeru_zigbee_info zigbee_info;};//所有监控区域的信息结构体struct env_info_client_addr{struct makeru_env_data monitor_no[MONITOR_NUM];//数组 老家---新家 MONITOR_NUM表示家的数量此项目只有一个家所以不存在家的切换};
4.2 数据下发 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);//消息队列用于通信的结构体 包括数据类型和数据将消息队列封装成函数直接通过参数传递的方式来发送信息 int send_msg_queue(long type,unsigned char text){struct msg msgbuf;msgbuf.type 1L;msgbuf.msgtype type; //具体的消息类型msgbuf.text[0] text; //控制命令字 if(msgsnd(msgid,&msgbuf,sizeof(msgbuf) - sizeof(long),0) -1){perror(fail to msgsnd type2);exit(1);}return 0;}struct msgbuf { long mtype; /* message type, must be > 0 */ char mtext[1]; /* message data */};//消息队列结构体#define QUEUE_MSG_LEN 32 struct msg{long type; //从消息队列接收消息时用于判断的消息类型 暂时不用 1Lhome1 2Lhome2 ... long msgtype;//具体的消息类型 指代控制的设备是什么类型的设备unsigned char text[QUEUE_MSG_LEN];//消息正文 > CMD 控制指定的设备};long msgtype;//具体的消息类型消息类型的分配1L: LED控制2L:蜂鸣器控制3L:四路LED灯模拟的数码管4L:风扇5L:温湿度最值设置6L-7L-8L-9L,用于个人的扩展10L: 3G通信模块-GPRS switch(msgbuf.msgtype){case 1L: ... break;....default .... break;}
4.3 控制命令字的制定 消息队列接收消息msgrcv (msgid, &msgbuf, sizeof (msgbuf) - sizeof (long), 1L, 0);解析buf中的数据printf (Get %ldL msg\n, msgbuf.msgtype);printf (text[0] %#x\n, msgbuf.text[0]);A9-ZIGBEE通用指令命令格式一个字节unsigned char 对应消息队列中正文的类型unsigned int ----------------------------------------76| 54|3210平台编号| 设备编号 |操作设备---------------------------------------- 平台编号0x000号-ZigBee平台 0x401号-A9/A53平台0x802号-STM32平台可以自己扩展0xc03号-avr arduino....保留(如果平台继续增多的话可以采用2个字节或多个字节来对设备进行唯一的编号比如A9类下的1号平台2号平台先分类然后再具体标识设备)----------------------------------------设备编号操作掩码0x00LED0x00全部关闭0x01全部打开0x02打开LED20x03打开LED30X04打开LED40x05打开LED50X10打开流水灯----------------------------------------0x10蜂鸣器0x00关闭0x01打开0x02自动报警关闭0x03自动报警打开----------------------------------------0x20风扇0x00关闭风扇0x01打开风扇----------------------------------------0x30数码管0x0~0xF 显示0~F数字(四盏灯对应0000-表示0,0001-表示1....1110-表示14)0x0f关闭数码管led2-3-4-5----------------------------------------控制命令平台编号 设备编号 操作掩码 命令 (命令的封装)例如0x00 0x20 0x01 0x21 风扇打开 0x40 0x10 0x01 0x51 蜂鸣器打开0x40 0x30 0x08 0x78 数码管显示80x40 0x30 0x0f 0x7f 关闭数码管a 高位数据b代表低位数据
上行封装的结构体----共享内存和信号量 —交给CGIC语言和HTML语言之间的转化接口)—交给HTML
下行封装的命令字----消息队列 ----msgbuf msgsnd----控制命令字封装在msgsnd的msgbuf中 —A9端解析—向下控制硬件
到此为止呢所有的通信结构体就已经设计完成了最终呢很显然将A9所有的数据对象成了一个以家为单位的结构体而这个结构体又包括了A9平台和zigbee采集数据的两个结构体那么这两个结构体又仔细划分就是具体的数据对象了比如ADC电压数据温湿度数据数据的下发是通过消息队列下发的也定义了消息队列的结构体这里需要注意的是结构体中第一个类型是必须有的此项目中这个类型既作为消息队列的发送消息类型也作为哪一个家当然此项目只涉及到一个家所以一直是类型1L当有两个家时那么消息队列的类型就可以创建一个2L类型的
最后呢是控制命令字的设计这个也是我在这个项目中学习到的一个非常好的设计思想极大的提高了效率可扩展、也可高效管理多个平台以及多个平台下的具体设备这写呢时很好的设计思想将采集对象在软件设计中模块化从而提高开发效率便于管理和代码编写是良好的项目代码风格