公共安全视频监控联网信息安全系统的组成及作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了公共安全视频监控联网信息安全系统的组成及作用相关的知识,希望对你有一定的参考价值。

公共安全视频监控联网信息安全系统包括SVAC信息安全摄像机、视频监控联网平台、信息安全平台、信息安全客户端以及信息安全解码器。
它是一套完整的从前端编码到后端存储及解码的视频监控安全系统。VNISS公共安全视频监控联网信息安全系统以国家密码局认定的国产密码算法为基础,利用公钥安全基础设施,以安全芯片、智能密码钥匙、密码机等安全密码部件作为安全载体,实现视频监控前端设备与视频监控管理平台间的双向。
产品概况:
中星技术公共安全视频监控联网信息安全系统包括SVAC信息安全摄像机、视频监控联网平台、信息安全平台、信息安全客户端以及信息安全解码器,是一套完整的从前端编码到后端存储及解码的视频监控安全系统。VNISS公共安全视频监控联网信息安全系统以国家密码局认定的国产密码算法为基础,利用公钥安全基础设施,以安全芯片、智能密码钥匙、密码机等安全密码部件作为安全载体,实现视频监控前端设备与视频监控管理平台间的双向身份认证、基于数字证书的用户身份认证、信令完整性检验、视频数据加解密等密码应用,从而防止设备和用户的非法接入,防止信令和视频数据被篡改、抵赖,防止视频内容被窃取,最终实现安防视频监控系统"防入侵、防篡改、防泄露"的安全需求。系统符合GB35114、GB/T28181和GB/T25724,并支持GB35114最高安全等级C级。
关键技术指标:
1、系统支持10万路以上的前端接入和管理,从前端编码、存储及后端解码全面符合GB/T28181、GB/T25724和GB35114最高安全等级,系统采用国密算法,安全可靠。
2、摄像机内置保密安全芯片,全面支持GB35114最高安全等级C级,实现数字证书保存及更新、密钥处理、设备认证、数字签名和加密。
3、系统从编解码算法、芯片到安全加密设备,全部具有自主知识产权,没有可被国外控制的"后门"、不受制于人,确保自主可控和自主安防产业发展。
产品创新点:
1、支持GB35114视频联网信息安全最高等级,解决视频被侵入窃取、伪造等安全问题痛点。
2、支持信源加密,从视频编码源头保障信息安全,解决信道泄密的问题。
3、采用国产加密芯片、国密算法、国产编解码芯片,全线国产,自主可控,保障国家信息安全。
4、摄像机内置国密安全芯片,确保视频及证书内容不可被非法读取和篡改,防止伪造和冒用。
国内外市场推广情况:
GB35114于2017年11月1日发布,2018年11月1日将正式实施。该标准作为我国公共安全视频监控联网信息安全领域的强制国家标准,国外市场还没有相关产品及解决方案。国内市场方面,中星技术作为GB/T28181、GB/T25724和GB35114标准编制单位之一,在业内率先推出符合公共安全领域信息传输、交换、控制、视音频编解码及信息安全等国家标准要求的完整产品线,为公安和各个行业用户提供更安全、可靠的视频监控联网信息安全整体解决方案。10多个省市发文或在地方标准中优先采用SVAC国家标准;经过多年技术攻关,芯片、算法和产品快速迭代更新应用,SVAC技术已经成熟,产业规模化态势已经呈现,20多家SVAC联盟单位推出了SVAC产品。中星技术通过开放代码、芯片、模组等形式,构建开源社区,吸引更多企业和单位参与到SVAC技术及应用研发工作。在应用SVAC国家标准的天津、太原、大同、贵阳、乌鲁木齐、兰州、雄安新区、保定、张家界、郴州、湘潭、惠州、靖江等30多个大中型城市的70多个平安城市、智能交通、雪亮工程、智慧城市项目中,全部可以通过平台升级、前端升级的方式符合安全国标。大同、茂名、昆明、湘潭等城市即将开始进行符合GB35114的公共安全视频监控联网信息安全系统试点工作。
参考技术A 回答

1、传感器将被测物理量转换为电信号,并具有显示报警功能(有些传感器没有显示或没有声光报警)。 2、执行机构(含有声光报警及显示设备)将控制信号转换为被控物理信量。 3、分站接收来自传感器的信号,并按预先约定的复用方式远距离传给主站(或传输接口),同时,接收来自主站(或传输接口)的多路复用信号。分站还具有线性校正,超限判断、逻辑运算等简单的数据处理能力,对传感器输入的信号和主站(或传输接口)传输来的信号进行处理,控制执行机构工作。

4、电源箱将电网电源转换为系统所需的本质安全型直流电源,并具有维持电网停电后正常供电不小于2h蓄电池。 5、传输接口接收分站远距离发送的信号,并送主机处理;接收主机信号,并送相应分站。传输接口还具有控制分站的发送与接收、多路复用信号的调制与解调、系统自检等功能。 6、主机一般选用工控微型计算机或普通微型计算机,采用双机或多机备份。其主要作用是接收监测信号、校正、报警判别、数据统计、磁盘存储、显示、声光报警、人机对话、输出控制、控制打印输出、联网等。

以上就是公共安全视频监控联网安全系统的组成及作用

信息安全系15级学生课程设计——2018.05 小组课题报告

信息安全系15级学生课程设计——2018.05 小组课题报告

课题:物联网实训·远程安防监控系统

一、设计方案及可行性分析

1、项目概述

本项目需要实现以嵌入式Web服务器为核心的视频监控系统。

摄像头采集的到的图像经过压缩后,传到内置的web服务器中。用户只需要通过浏览器就可以观看摄像头采集到的数据。

除了视频监控功能外,本项目还可以搜集空气湿度、空气温度、光照强度等信息。

2、系统架构

该项目基本可以看作B/S架构,由有三部分组成:

技术分享图片

(1)核心服务端:其实是客户端(严格意义上说,PC上的浏览器才是客户端)一台普通的PC机,需要与前端数据中心在同一局域网中,然后通过浏览器对系统进行监控和设置。

(2)前端数据中心:FS4412开发平台,可以连接摄像头、GPRS、zigBee、传感器、WIFI等模块。

(3)远程控制终端:zigBee模块、摄像头等用来进行信息采集的设备。采集到的信息有前端数据中心进行处理。

3、其他注意事项

该远程监控系统支持chrome浏览器和Firefox浏览器,但不支持IE浏览器。

二、详细设计思路

1、任务的划分

(1)环境搭建

(2)编译源码

(3)镜像烧写

(4)前端数据中心数据接收与处理模块的调试

(5)理解Web服务器的搭建与配置

(6)理解CGI程序的编译调试

2、详细过程

(1)环境搭建

仅需在VMware Workstation Pro打开打开虚拟机即可

(2)编译源码

编译源码的环境是在Linux下,首先应先熟悉Linux终端的一些操作。

cd 进入一个目录 如cd /usr/local 或者是cd usr,用cd ..返回上一层。

利用tab来补全命令。

Mkdir 是一个用来在 Linux 系统下创建目录的命令。是一层一层的创建,可以创建后用cd打开然后创建。

cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。如cp/xx/xx ./是将文件拷贝到当前目录下。利用这两条指令以及cd指令拷贝源码。

编译源码需要修改环境变量,BootLoader编译,Linux内核编译,主应用程序编译,根文件系统镜像制作。

①完成bootloader的编译与SD bootloader的编译

技术分享图片

②Linux内核的编译

下面是根据指导书进入Linux内核配置图形界面。

技术分享图片

下面是用make工具完成zImage内核二进制文件的截图

技术分享图片

等待片刻之后,linux内核编译完成

技术分享图片

③ 主应用程序编译

直接用make工具即可

技术分享图片

④ 根文件系统镜像制作

在制作根文件时需要将之前编译好的应用程序、驱动等项目拷贝到rootfs下。

技术分享图片

(3)烧写镜像

①制作SD卡启动盘

用读卡器将SD卡插入电脑,虚拟机识别SD读卡器,将uboot烧写到sd卡,将SD卡插入开发板SD卡槽内,拨码至1000,连接开发板。在win上设置串口调试工具,选择Serial连接方式(如果不选择的话直接open会导致乱码,其中COMX由设备管理器看)。启动开发板,在倒计时5s结束前,按任意键停止。

②安装Fastboot

在安卓手机中fastboot是一种比recovery更底层的刷机模式。就是使用USB数据线连接手机的一种刷机模式。相对于某些系统(如ios)卡刷来说,线刷更可靠,安全。

遇到问题:fastboot驱动安装的强制签名问题

解决方案:

通过配置win10关闭驱动签名(百度上轻松找到解决方案)

在计算机属性下的系统属性,查看高级,选择环境变量,编译系统变量的path项,在变量值最后添加D:Fastboot.使用win+r,输入cmd,输入fastboot测试是否安装成功。

在设备管理器中是否有Android,有则更新驱动,路径选择D:Fastboot。

③烧写到开发板的Flash

硬件连接后拨动至1000 ,设置串口工具后,启动开发板,按任意键暂停,输入sdfuse flashall。等烧写结束,关闭开发板,拨至0110,启动开发板,暂停。输入fdisk -c 0

对SD卡分区,输入fastboot,再执行flash-all.bat。

在cmd命令行中输入fastboot flash BootLoader u-boot-fs4412.bin完成烧写BootLoader。

在cmd命令行中输入fastboot flash kernel zimage完成烧写内核镜像zImage。

在cmd命令行中输入fastboot flash system system.img完成烧写根文件系统镜像。

技术分享图片

技术分享图片

技术分享图片

(4)前端数据中心数据接收与处理模块的调试

①WIFI模块的移植——内核配置

配置内核

技术分享图片

编译内核

技术分享图片

②WIFI模块——wpa_suppliant的移植

openssl补丁安装

技术分享图片

Openssl安装

技术分享图片

注意权限问题——最后应该输入sudo make install

wpa_suppliant的移植——修改Makefile

技术分享图片

使用make工具编译

技术分享图片

==遇到问题==:不知道如何测试,文档中没有明确说明如何操作

后我们选择使用网线直连,其中如果需要修改网卡IP,由于是直连,输入ifconfig eth0 192.168.x.x

③Web服务器的配置

==遇到问题==:

技术分享图片

解决方法

按照指导书修改过compat.h

技术分享图片

Make工具进行编译

技术分享图片

(6)理解CGI程序的编译调试

我自己有过Web编程的经验,也了解早期的Web编程是靠CGI来完成的,用的语言也是五花八门——C/C++、perl、bash……

我选择研究该项目的CGI源码,也是因为自己对Web编程有一些了解,而对系统编程就完全不懂,也搞不清什么线程、锁、同步的概念。

①登录表单处理——login.cgi

我们进入文件系统rootfs的www目录下,这里就是存放web服务器html,css,js和cgi程序的地方。我们先看看index.html.

我们直接看登录的表单部分。

<form name="form1" method="post"  action="cgi-bin/login.cgi">
  <table width="100%" border="0" cellspacing="9" cellpadding="0">
  <tbody>
  <tr>
    <td width="92">用户帐号:</td>
    <td width="130"><label>
    <input name="username" type="text" id="username" value="user"></label></td>
  </tr>
  <tr>
    <td>登录密码:</td>
    <td>
    <label>
      <input name="password" type="password" id="password" value="123456">
    </label>
    </td>
  </tr>
  <tr>
    <td height="25"></td>
    <td><input type="image" name="submit" style="width:97px;height:25px;" src="images/login/go.gif"></td>
  </tr>
  </tbody> 
  </table>
</form>

这个表单的数据会提交给login.cgi这个程序去处理。学过java servlet的同学会发现,CGI程序和servlet比较接近。

我们来分析一下login.cgi的源码。

//login.c

cgiFormStringNoNewlines("username", name, N);
cgiFormStringNoNewlines("password", pw, N);

这两条语句将username和password分别放到char数组name和pw中,接下来肯定是要到数据库里面去查询了。这里的数据库用的是sqlite,非常轻量级的一个数据库。

//login.c

if(sqlite3_open("/user.db", &db) != SQLITE_OK)
{
    fprintf(cgiOut, "<BODY>");
    fprintf(cgiOut, "<H1>%s</H1>", "Server is busy...");        
    fprintf(cgiOut, "<meta http-equiv="refresh" content="1;url=../index.html">");
    return -1;
}

sprintf(sql, "select * from usr where name=‘%s‘ and password=‘%s‘", name, pw);

if(sqlite3_get_table(db, sql, &result, &row, &column, NULL) != SQLITE_OK)
{
    fprintf(cgiOut, "<BODY>");
    fprintf(cgiOut, "<H1>%s</H1>", "Server is busy...");        
    fprintf(cgiOut, "<meta http-equiv="refresh" content="1;url=../index.html">");
    sqlite3_close(db);
    return -1;
}

非常容易理解,sqlite3_open()函数用来打开数据user.db,如果打开失败就会看到网页上有Server is busy...字样。

char数组sql中存放了一条select语句,sqlite3_get_table()函数就是用来查询的,如果数据库出现问题,依然在网页上显示有Server is busy...

如果在数据库里找不到对应的用户,变量row的值就是0,网页上显示Name or password error。

//login.c

if(row == 0)
{
    fprintf(cgiOut, "<BODY>");
    fprintf(cgiOut, "<H1>%s</H1>", "Name or password error");       
    fprintf(cgiOut, "<meta http-equiv="refresh" content="1;url=../index.html">");
    sqlite3_close(db);
    return 0;
}

查看user.db数据库,只有一条记录

技术分享图片

代码里的cgiOut是什么呢?,我们在cgic.h头文件的实现文件cgic.h中找到了答案。

//cgic.c

    cgiIn = stdin;
    cgiOut = stdout;

cgiOut就是标准输出。登录成功后,会跳转到主页面main.html。

②环境信息获取——env_1_a9_info.cgi

main.html页面是一个frameset框架,由left.html,top.html,right.html三个页面构成。其中只有left.html导航栏具有实际的功能选项。

技术分享图片

我们先看看环境信息env1.html页面中的cgi程序

<iframe  frameborder="0"  border=0 scrolling="no" src="cgi-bin/env_1_a9_info.cgi" width="100%" height="100%"></iframe>

这个iframe告诉我们env_1_a9_info.cgi程序会处理当前的实时数据,并返回结果。分析一下env_1_a9_info.cgi的源码,来看看这些数据是怎么得到的。

get_env()函数是用来获取环境信息的。

//env_1_a9_info.c

void get_env()
{
    sqlite3 *db;
    char sql1[N] = {0}, sql2[N] = {0};
    char **result1, **result2;
    int row1, colunm1, row2, colunm2;
    if  (sqlite3_open("/smartfarm.db", &db) != SQLITE_OK) {
        fprintf(cgiOut, "<H2>sqlit smartfarm.db open err</H2>");    
        errflag = 1;
        return ;
    }
    sprintf(sql1, "select * from env where farm_no=1");
    if (sqlite3_get_table(db, sql1, &result1, &row1, &colunm1, NULL) != SQLITE_OK) {
        fprintf(cgiOut, "<H2>sqlite3_get_table  err</H2>"); 
        errflag = 1;
        return ;
    }
    strncpy(temp_max, result1[colunm1 + 1], 9);
    strncpy(temp_min, result1[colunm1 + 2], 9);
    strncpy(hum_max, result1[colunm1 + 3], 9);
    strncpy(hum_min, result1[colunm1 + 4], 9);
    strncpy(light_max, result1[colunm1 +5], 9);
    strncpy(light_min, result1[colunm1 + 6], 9);

    .......

    sqlite3_close(db);
}

不难发现,这些数据都是从数据库smartfarm.db中获取的。

技术分享图片

最高/最低气温,湿度,光照,都在env表中。

还有一张collect_env表,显示的是实时信息,但是好像没有用到。

技术分享图片

//env_1_a9_info.c

void get_env()
{
    ........

    sprintf(sql2, "select * from collect_env where farm_no=-1");
    if (sqlite3_get_table(db, sql2, &result2, &row2, &colunm2, NULL) != SQLITE_OK) {
        errflag = 1;
        return ;
    }
#if 0
    strncpy(temp, result2[colunm2 + 1], 9);
    strncpy(hum, result2[colunm2 + 2], 9);
    strncpy(light, result2[colunm2 + 3], 9);
#endif

}

很明显,temp,hum,light分别存放当前的温度、湿度和光照,但是被注释掉了。

④实时监控的图像拍照处理——take_photo.cgi

实现监控的CGI程序是take_photo.cgi,我们还是直接分析它的源代码。.

抛开cgi程序的fprintf不看,我们直接看核心处理的部分。

//take_photo.c

    key_t key; 
    int msgid; 
    char buf[2] = {0};

    if((key = ftok("/lib", ‘a‘)) < 0)
    {
        perror("ftok");
        exit(1);
    }
    if ((msgid = msgget(key, IPC_CREAT | IPC_EXCL | 0666)) < 0)
    {
        if (errno == EEXIST) {
            msgid = msgget(key, 0666);
        }else{
            perror("msgget msgid");
            return 0;
        }
    }

    struct message msgbuf;
    msgbuf.type = 1L;
    msgbuf.msg_type = 2L;

    cgiFormString("mode", buf, 2);
    if(buf[0] <= ‘0‘ || buf[0] > ‘9‘)
        goto err;
    
    msgbuf.text.camera = buf[0] - ‘0‘;
    msgsnd (msgid, &msgbuf, sizeof (msgbuf) - sizeof (long), 0);

这是一段linux的进程间通信,我们需要关注以下三个系统调用:

  • key_t ftok(const char *pathname, int proj_id)
  • int msgget(key_t key, int msgflg)
  • int msgsnd(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg)

这些调用的细节不去管它,只要知道该进程需要收发其他进程的消息就可以了。
我们关注这段代码,看看进程发送的消息msgbuf是什么。

//take_photo.c

    struct message msgbuf;
    msgbuf.type = 1L;
    msgbuf.msg_type = 2L;

    cgiFormString("mode", buf, 2);
    if(buf[0] <= ‘0‘ || buf[0] > ‘9‘)
        goto err;
    
    msgbuf.text.camera = buf[0] - ‘0‘;

注意到这里的cgiFormStirng函数,我们的buf存的是表单中收集到的数字,下面是表单的内容。

<form id="take_photo" name="take_photo" method="post" action="cgi-bin/take_photo.cgi">
  <td width="15%"><input type="radio" name="mode" id="mode_1" value="1" />1</td>
  <td width="15%"><input type="radio" name="mode" id="mode_2" value="3" />3</td>
  <td width="15%"><input type="radio" name="mode" id="mode_3" value="5" />5</td>
  <td width="15%"><input type="radio" name="mode" id="mode_4" value="7" />7</td>
  <td width="15%"><input type="radio" name="mode" id="mode_5" value="9" />9</td>
  <td width="25%"><input type="submit" name="take_photo" id="take_photo" value="图像抓拍" /></td>
</form>

结构体message在struct.h头文件中有定义。

//struct.h

union text {
    unsigned char led;
    unsigned char buzzer;
    unsigned char camera;
    unsigned char fan;
    unsigned char relay;
    unsigned char uart;
    char phone[24];
    struct control_parameter parameter;
};

struct message {
    long type;
    long msg_type;
    union text text;
};

那么谁会接收msgbuf这个消息呢?我们可以在项目源码中找到答案。

看一下,项目源码里面pthread_client_request.c中的一个代码片段。

//pthread_client_request.c

    switch (msgbuf.msg_type) {

        ........

        case CAMERA:
            printf("received camera request
");
            pthread_mutex_lock (&mutex_camera);
            dev_camera_mask = msgbuf.text.camera;
            pthread_cond_signal (&cond_camera);
            pthread_mutex_unlock (&mutex_camera);
            break;
        
        ........
        
        default:    
#if DEBUG
            printf("pthread client request default break
");
#endif
            break;
    
    }

也就是说会 有专门的线程用来处理摄像头有关的消息。

我们还记得之前take_photo.c有这样一段代码。

    struct message msgbuf;
    msgbuf.type = 1L;
    msgbuf.msg_type = 2L;

1L、2L这样的魔数是什么意思呢

答案在项目源码的global_variable.h头文件中。

//global_variable.h

/*message queue type */
#define REQUEST 1L

/*message queue msg_type*/
#define BUZZER 1L
#define CAMERA 2L
#define FAN 3L
#define LED 4L
#define RELAY 5L
#define SET_PARAMETER 6L
#define SMS 7L
//#define SQLITE 7L
#define UART 8L
#define MODIFY_PHONE_NUM 9L
#define BEEP 10L

linux下一切都是文件,打开摄像头也不例外。

//pthread_camera.c

    if ((dev_camera_fd=open (DEV_CAMERA, O_RDWR | O_NOCTTY | O_NDELAY)) < 0)
    {
        printf ("Cann‘t open file /tmp/webcam
");
        exit (-1);
    }

其中DEV_CAMERA这个常量的定义在头文件global_variable.h中也能找到。

//global_variable.h

#define DEV_GPRS            "/dev/ttyUSB1"
#define DEV_GPRS_2          "/dev/ttyUSB2"
#define DEV_ZIGBEE          "/dev/ttyUSB0"
#define DEV_LED             "/dev/led"
#define DEV_BUZZER          "/dev/buzzer"
#define DEV_CAMERA      "/tmp/webcam"
#define SQLITE_OPEN         "./smartfarm.db"

这个常量就是/tmp/webcam,就是摄像头设备。

④照片展示——show_photo.cgi

在“历史照片”这一功能中,调用的CGI程序是show_photo.cgi

我们同样还是忽略掉CGI源码中的fprintf部分。

#define DIRNAME     "../pice"
#define PHOTO_NUM_MAX   100 // 最多100张,0-99

int cgiMain()
{
    .........

    if((dir = opendir(DIRNAME)) == NULL)    //打开图片存放的目录
    {
        perror("fail to opendir");
        exit(1);
    }

    while((dirp = readdir(dir)) != NULL)  //读文件夹里文件的名字
    {
        if(dirp->d_name[0] > ‘9‘ || dirp->d_name[0] < ‘0‘)   //名字的第一个字母
            continue;
        sprintf(photoname[syncmsg1.photo_num++], "%s", dirp->d_name);
        if(syncmsg1.photo_num >= PHOTO_NUM_MAX)         //判断是否超过最大值
        {
            syncmsg1.photo_num = PHOTO_NUM_MAX - 1;
            break;
        }
    }

    .........

}

我们从中可以知道,历史照片都是保存在/www/pice目录下的,而且最多只保存100张。

三、调试过程中无法解决的问题

1、WIFI模块无法使用

原本这个系统是通过WIFI来访问并进行控制的,但是我们的WIFI模块出现了问题,现在只能用网线直连的方式控制系统。

我们将手机热点配置为my_accent,密码设为012345678,在rootfs/etc中添加配置文件wpa-spk-tkip.conf。

# WPA-PSK/TKIP

ctrl_interface=/var/run/wpa_supplicant

network={
    ssid="my_accent"
    key_mgmt=WPA-PSK
    proto=WPA
    pairwise=CCMP
    group=CCMP
    psk="012345678"
}

更新文件系统以后重新烧写镜像,配置IP和网关后,执行命令wpa_supplicant -B -i wlan0 -c /etc/wpa-psk-tkip.conf

技术分享图片

我们可以看到,wlan网卡依然没有连接到手机热点上。我们暂时没有解决这个问题。

2、视频模块无法使用

我们无论直接使用含有项目内容的文件系统,还是自己重新编译mjpeg-streamer都出现了同样的问题。

我们启动开发板后,对mjpeg-streamer进行测试。

运行mjpg_streamer -i "/mjpg/input_uvc.so -y -d /dev/video0" -o "/mjpg/output_http.so -w 192.168.9.111:8080"

技术分享图片

系统显示由于设备被占用了,初始化失败。我们没有找到解决的方法。
这些问题目前依然没有找到解决方案。

四、设计特色

本项目特色在于与物联网内容相关联,拓宽了学生的眼界,让我们更好的学习Linux指令、物联网相关知识、嵌入式系统调试等很多本不属于我们专业的知识,对于三个代码和嵌入式基础薄弱的理科专业学生来说是一个大量接触相关知识的好机会。课题特色的地方在于充分结合嵌入式系统调试,可以让我们给硬件嵌入Linux内核以方便我们进行硬件控制。



以上是关于公共安全视频监控联网信息安全系统的组成及作用的主要内容,如果未能解决你的问题,请参考以下文章

GB28181协议视频安防平台EasyGBS国标配置查询步骤及信令示例

信息安全政策(隔离与监控)

GB28181国标平台资料整理

GB28181国标平台资料整理

光伏物联网监控系统

那些你看不到的风景,视频监控系统维护城市安全