安防监控 —— 软硬件环境分析与通信协议制定
一、硬件環境分析
要有分層意識、數據流意識
二、軟件環境分析·
根據數據流向分析軟件框架
軟件框架也分為三部分:數據采集部分、A9數據采集與處理部分、Web顯示部分
數據上行:
Zigbee —— > A9 : Zigbee采集數據 ——> 填充到結構體 ——> 數據采集線程
A9 —— > Web :數據刷新線程 ——> 共享內存、信號量 ——> cgi進程 ——> html (cgi進程完成C語言和html語言的交互)
數據下行:
Web ——> A9 : html ——> cgi進程 ——> 消息隊列 ——> 主線程 __接收用戶請求線程 |——>LED線程
|------>蜂鳴器線程
|------>GPRS線程
A9 ——> Zigbee:主線程 __接收用戶請求線程 |——>Zigbee線程
三、通信協議制定
分層分析:
web網頁端顯示部分:
環境信息 === 實時刷新環境數據
攝像頭采集圖像 === 采集監控信息
硬件控制 === 下發要去控制的命令
A9數據處理部分
創建進程、線程
每條線程做自己的事情
涉及到進程間通信
數據處理===>分發(上行數據 or 下行數據)
A9-ZigBee數據采集部分
A9采集部分
ZigBee采集部分
(STM32平臺)
數據流分析·:
數據上傳:
數據下發:
制定通信的協議(結構體):
數據要怎么上傳,上傳的目的是為了什么?
數據要怎么下發,下發的目的又是為了什么?
數據的上傳: ====> 共享內存上傳數據 ====> 顯示并交給用戶查看環境信息
數據的下發用于控制硬件:====> 消息隊列下發數據 ===> 控制硬件改變環境
更具體的分層分析:
web網頁端顯示部分:
環境信息: adc電壓數據
mpu6050的六軸數據
溫度
濕度
攝像頭采集圖像:
硬件控制: 風扇
LED燈
蜂鳴器
GPRS ==== 發短信或打電話
A9數據處理部分
數據流向分析:
1、ZigBee(采集終端)-->A9(處理平臺)
2、A9(處理平臺)-->網頁(顯示平臺)
3、網頁(顯示平臺)-->A9(處理平臺)
4、A9(處理平臺)--->ZigBee(采集終端)
A9-ZigBee采集部分
外設驅動 --------在應用層去獲取外設的狀態或數據
A9--------- 蜂鳴器 ------------------蜂鳴器報警
LED燈 ------------------臥室-廁所-樓道-公共照明 --------LED2-LED3-LED4-LED5
按鍵 ------------------按鍵觸發中斷---控制臥室和廁所燈-----LED2-LED3
ADC -----------------獲取ADC的采樣數據
mpu6050 ------------------獲取MPU6050的六軸數據
zigbee------adc ------主---協調器
風扇 ------從---終端節點 下發命令控制風扇
溫濕度 ------從---終端節點 上傳溫濕度數據
(光敏)
小結: | | | |
| ZigBee | A9 | web |
| | | |
| adc | 蜂鳴器 | 環境信息:-----------------adc電壓數據
| 風扇 | LED燈 | 攝像頭采集:-----usb攝像頭 mpu6050的六軸數據
| 溫濕度 | 按鍵 | 硬件控制: |------風扇 溫度
| (光敏) | ADC | | LED燈 濕度
mpu6050 蜂鳴器
四路led燈模擬數碼管 GPRS
四路led燈模擬數碼管
具體數據流分析:
數據流分析:
數據上傳:
ZigBee |
溫濕度數據 |
A9 |
ADC采集 |-----------上傳這些數據
加速計數據 |
陀螺儀數據 |
攝像頭 |
視頻流圖像 |
數據下發:
ZigBee: |
風扇 |
A9: |
蜂鳴器 |-----打開設備節點控制硬件
LED燈 |
四路LED燈模擬的數碼管 |
GPRS: |
3G通信模塊 |
宏定義設備文件:
#define GPRS_DEV "/dev/ttyUSB0"
#define ZIGBEE_DEV "/dev/ttyUSB1"
#define BEEPER_DEV "/dev/fsbeeper0"
#define LED_DEV "/dev/fsled0"
制定通信協議結構體:
1、數據的上傳:
數據類型定義:
typedef uint8_t unsigned char; =======參考:
typedef uint16_t unsigned short;
typedef uint32_t unsigned int;
//考慮到內存對齊的問題
struct makeru_zigbee_info{
uint8_t head[3]; //標識位: 'm' 's' 'm' makeru-security-monitor
uint8_t type; //數據類型 'z'---zigbee 'a'---a9
------------->crc ...加密算法 <--------------
float temperature; //溫度
float humidity; //濕度
float tempMIN;//溫度下限
float tempMAX;//溫度上限
float humidityMIN; //濕度下限
float humidityMAX; //濕度上限
uint32_t reserved[2]; //保留擴展位,默認填充0
//void *data; 內核預留的擴展接口 參考版
};
struct makeru_a9_info{
uint8_t head[3]; //標識位: 'm' 's' 'm' makeru-security-monitor
uint8_t type; //數據類型 'z'---zigbee 'a'---a9
uint32_t adc;
short gyrox; //陀螺儀數據,16位精度
short gyroy;
short gyroz;
short aacx; //加速計數據,16位精度
short aacy;
short aacz;
uint32_t reserved[2]; //保留擴展位,默認填充0
//void *data; 內核預留的擴展接口 參考版
};
//將A9-info結構體和Zigbee-info結構體進行再次封裝
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]; //數組 老家---新家
};
2、數據的下發:(采用消息隊列的方式下發數據到下位機上)
數據的下發用于控制硬件:
man msgsnd
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
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 = t; //具體的消息類型
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; //從消息隊列接收消息時用于判斷的消息類型 ==== 暫時不用 1L===home1 2L===home2 ...
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;
}
3、控制命令的制定:
消息隊列接收消息:
msgrcv (msgid, &msgbuf, sizeof (msgbuf) - sizeof (long), 1L, 0);
解析buf中的數據:
printf ("Get %ldL msg
", msgbuf.msgtype);
printf ("text[0] = %#x
", msgbuf.text[0]);
A9-ZIGBEE通用指令
命令格式:一個字節,unsigned char 對應消息隊列中正文的類型:
(unsigned char 每兩位只能表示4種設備,若要增加可用unsigned int)
8位
----------------------------------------
7 6 | 5 4 | 3 2 1 0
平臺編號 | 設備編號 | 操作設備
----------------------------------------
位數 7654 3210
0 0 0x0000 0000
0 1 0x0100 0000
1 0 0x1000 0000
1 1 0x1100 0000
平臺編號
0x00 0號-ZigBee平臺
0x40 1號-A9/A53平臺
0x80 2號-STM32平臺(可以自己擴展)
0xc0 3號-avr arduino....保留(如果平臺繼續增多的話可以采用2個字節或多個字節來對設備進行
唯一的編號,比如A9類下的1號平臺,2號平臺,先分類,然后再具體標識設備)
----------------------------------------
設備編號 操作掩碼
0x00 LED 0x00 全部關閉
0x01 全部打開
0x02 打開LED2
0x03 打開LED3
0X04 打開LED4
0x05 打開LED5
0X10 打開流水燈
----------------------------------------
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 數碼管顯示8
0x40 + 0x30 + 0x0f = 0x7f 關閉數碼管
a 高位數據,b代表低位數據
short c
unsigned char a ,b;
c = a | b;
c = a + b;
上行:封裝的結構體====共享內存和信號量 ===>交給CGI(C語言和HTML語言之間的轉化接口)===>交給HTML
下行:封裝的命令字====消息隊列 ====>msgbuf msgsnd===>控制命令字封裝在msgsnd的msgbuf中 ===>A9端解析==>向下控制硬件
總結
以上是生活随笔為你收集整理的安防监控 —— 软硬件环境分析与通信协议制定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国独立电影人制作的纪录片《南京梦魇——
- 下一篇: 9位运算