日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

安防监控 —— 软硬件环境分析与通信协议制定

發布時間:2024/6/21 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 安防监控 —— 软硬件环境分析与通信协议制定 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、硬件環境分析

要有分層意識、數據流意識

二、軟件環境分析·

根據數據流向分析軟件框架

軟件框架也分為三部分:數據采集部分、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端解析==>向下控制硬件

總結

以上是生活随笔為你收集整理的安防监控 —— 软硬件环境分析与通信协议制定的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。