我们如何学习将1000r的中国相机连接到云。 没有记录器和短信(节省了数百万美元)

大家好!


对于最近基于云的视频监视服务越来越流行的人来说,这可能不是什么秘密。 可以理解为什么视频是“大量”内容,这需要基础架构和大量磁盘存储来存储,这是可以理解的。 在使用数百个监控摄像机的组织中,以及在个人用户使用多个摄像机的情况下,使用本地视频监控系统都需要操作和支持手段。



基于云的视频监控系统通过为客户提供现有的视频存储和处理基础架构来解决此问题。 对于基于云的监视客户端,只需将摄像机连接到Internet并绑定到他在云中的帐户就足够了。


有几种将相机连接到云的技术方法。 毫无疑问,这是最方便,最便宜的方法-摄像机直接连接并与云一起工作,而无需服务器或注册商等其他设备的参与。


为此,必须在相机上安装与云一起使用的软件模块。 但是,如果我们谈论廉价相机,则它们的硬件资源非常有限,几乎由相机供应商的本机固件占用了100%,但没有云插件所需的资源。 ivideon的开发人员专门针对此问题发表了一篇文章 ,该文章指出了为什么他们无法在廉价的相机上安装该插件。 结果,相机的最低价格为5000卢布(约合80美元)和数百万美元的设备支出。


我们已经成功解决了这个问题。 如果您对操作方法感兴趣-Wellcome under cat


一点历史


2016年,我们开始为Rostelecom开发基于云的视频监控平台。


在摄像头软件部分,首先,我们以“标准”方式完成此类任务:我们开发了自己的插件,该插件已安装在供应商的摄像头固件中,并且可以与我们的云一起使用。 但是,值得注意的是,在设计过程中,我们使用了最轻便,最有效的解决方案(例如,protobuf,libev,mbedtls的纯C实现以及完全放弃的便捷但繁琐的库(如boost))


现在,在IP摄像机市场上,还没有通用的集成解决方案:每个供应商都有自己的安装插件的方式,自己的用于固件工作的API集以及独特的更新机制。


这意味着对于每个相机供应商,有必要单独开发集成软件的批量层。 而且,在开发开始时,建议仅与第一供应商合作,以便将团队的工作重点放在开发使用云的逻辑上。


第一个供应商是海康威视-海康威视是相机市场的全球领导者之一,提供了有据可查的API和强大的工程技术支持。


在海康威视相机上,我们启动了第一个试点项目,即云视频监控Video Comfort。


推出后几乎立即,我们的用户开始询问有关将便宜的第三方相机连接到该服务的可能性的问题。


我几乎立即放弃了针对每个供应商的集成层实施方案,因为扩展性差且对相机硬件提出了严格的技术要求。 满足入口要求的摄像头成本:〜60-70 $


因此,我决定更深入地研究-完全为任何供应商的相机制作固件。 这种方法大大降低了相机的硬件要求- 云层可以更有效地与视频应用程序集成一个数量级,并且固件中没有多余的脂肪。


重要的是,在低级别使用相机时,可以使用硬件AES,它可以加密数据而不会在低功耗CPU上造成额外的负担。



那时,我们什么都没有。 没事


几乎所有供应商都不愿意与我们合作这么低的水平。 没有有关电路和组件的信息,也没有官方的SDK芯片组和传感器文档。
也没有技术支持。


所有问题的答案都必须通过逆向工程获得-反复试验。 但是我们做到了。


我们遇到麻烦的第一个相机型号是小米Yi Ants,海康威视,大华,Spezvision,D-Link相机和几款超级便宜的未命名中国相机。


技术


基于Hisilicon 3518E芯片组的相机。 摄像机的硬件特征如下:


小米彝族蚂蚁无名
片上系统海思3518E海思3518E
内存64MB64MB
闪光灯16MB8MB
无线上网mt7601 / bcm43143--
感应器ov9732(720p)ov9712(720p)
乙太网路--+
微型SD++
麦克风++
讲者++
已IRL++
IRCut++

我们从他们开始。


我们目前支持Hisilicon 3516/3518芯片组,以及Ambarella S2L / S2LM。 相机型号有几十个。


固件组成


开机


uboot是引导加载程序,在打开电源后,它将首先引导,初始化硬件并加载linux内核。


相机加载脚本非常简单:


bootargs=mem=38M console=ttyAMA0,115200 rootfstype=ramfs mtdparts=hi_sfc:256K(boot),64K(tech),4096K(kernel),8192K(app),-(config) hw_type=101 bootcmd=sf probe 0; sf read 0x82000000 0x50000 0x400000; bootm 0x82000000; setenv bootargs $(bootargs) bkp=1; sf read 0x82000000 0x450000 0x400000; bootm 0x82000000 

在这些功能中, bootm被调用了bootm ,之后便进入了更新子系统。


注意行mem=38M 。 是的,这不是错别字-Linux内核和所有应用程序只能使用38 MB的RAM。


uboot旁边还有一个称为reg_info的特殊块,其中包含一个低级DDR初始化脚本和许多SoC系统寄存器。 reg_info的内容取决于相机的型号,如果不正确,相机甚至将无法下载uboot,但会在加载的早期挂起。


首先,当我们在没有供应商支持的情况下工作时,我们只是从原始相机固件中复制了此模块。


linux内核和rootfs


摄像机使用Linux内核,该内核是SDK芯片的一部分,通常这些不是3.x分支中的最新内核,因此我们经常不得不发现其他硬件驱动程序与所使用的内核不兼容,因此我们必须将其反向移植到内核相机。


另一个问题是内核大小。 当FLASH大小仅为8MB时,帐户中的每个字节都将被写入,我们的任务是仔细禁用所有未使用的内核功能,以将大小减小到最小。


Rootfs是一个基本的文件系统。 它包括busybox ,wifi模块的驱动程序,一组标准系统库(例如libldlibc )以及我们的开发软件,该软件负责LED控制逻辑,网络连接管理和固件更新。


根文件系统以initramfs的形式连接到内核,作为汇编的结果,我们得到了一个uImage文件,该文件同时包含内核和rootfs。


视频应用


固件最复杂和最消耗资源的部分是提供视频音频捕获,视频编码,调整图片参数,实施视频分析(例如,运动或声音检测器),控制PTZ并负责昼夜模式切换的应用程序。


我什至要说一个重要的功能-视频应用程序如何与云插件交互。


在传统的解决方案“供应商固件+云插件”(无法在廉价的硬件上运行)中,摄像机内部的视频使用RTSP协议进行传输-这是巨大的开销:通过套接字复制和传输数据,额外的系统调用。


我们在这里使用共享内存机制-不会在摄像机软件组件之间的套接字上复制或发送视频,因此,使用摄像机的适度硬件功能可以最佳且谨慎地进行。



更新子系统


在线固件更新的容错子系统特别引人注目。


我将解释问题。 从技术上讲,固件更新不是原子操作,并且如果在更新过程中发生电源故障,则闪存中将存在一部分“未记录”的新固件。 如果不采取特殊措施,相机将变成“砖头”,必须携带到服务中心。


我们已经解决了这个问题。 即使在更新时关闭了相机,它也将自动在没有用户干预的情况下从云端下载固件并恢复操作。


让我们更详细地分析该技术:


最容易受到攻击的一点是用Linux内核和根文件系统覆盖分区。 如果发现这些组件之一被损坏,则相机将无法启动uboot引导加载程序,后者不知道如何从云中下载固件。


因此,我们需要确保相机在更新过程中的任何时候都具有正常工作的内核和rootfs。 看来,最简单的解决方案是将带有rootfs的内核的两个副本永久存储在闪存中,并在损坏主内核的情况下,从备份中加载它。


一个好的解决方案-但是,带有rootfs的内核大约需要3.5MB,而对于永久备份,您需要分配3.5MB。 在最便宜的相机上,备份内核根本没有太多可用空间。


因此,对于固件更新期间的备份内核,我们使用应用程序分区。
为了选择内核所需的分区,在uboot中使用了两个bootm -首先,我们尝试加载主内核,如果主内核已损坏,则进行备份。



这样可以确保摄像机在任何时候都具有带有rootfs的正确内核,并且能够启动和还原固件。


CI / CD系统,用于组装和部署固件


要构建固件,我们使用gitlab CI,其中会自动收集所有支持的相机型号的固件,在构建固件后,会将它们自动部署到相机软件更新服务。



通过该服务,固件更新将交付给我们质量检查的测试摄像机,并在完成所有测试阶段后,再交付给用户的摄像机。


信息安全


众所周知,信息安全是包括摄像头在内的任何物联网设备中最重要的方面。 诸如Mirai之类的僵尸网络在Internet上四处走动,使用厂商提供的标准固件影响了数百万台摄像机。 出于对相机供应商的所有应有的尊重,我不禁要注意,标准固件包含许多不需要使用云的功能,但是它包含了僵尸网络使用的许多漏洞。


因此,将禁用固件中所有未使用的功能,关闭所有tcp / udp端口,并在更新固件时检查软件的数字签名。


除此之外,固件还在信息安全实验室中定期进行测试。


结论


现在,我们的固件已在视频监控项目中得到积极使用。 其中最雄心勃勃的也许是在俄罗斯联邦总统当选之日播出的投票结果。
该项目涉及超过7万个装有我们固件的摄像机,这些摄像机已安装在我国的投票站中。


当时解决了许多复杂的,有时甚至是实际上不可能完成的任务,我们当然获得了工程师的高度满意,但是除此之外,我们还节省了数百万美元的购买相机的费用。 在这种情况下,节省的不仅是语言和理论上的计算,而且是已经举行的购买设备招标的结果。 因此,如果我们谈论云视频监控,则有两种方法-从战略上依靠低水平的专业知识和开发,在输出端节省大量设备或使用昂贵的设备(如果您看一下消费者的特性,实际上与类似的廉价设备没有什么不同)。


为什么尽早决定采用集成方法的方法在战略上很重要? 开发插件时,开发人员需要使用某些技术(库,协议,标准)。 而且,如果仅为昂贵的设备选择了一套技术,那么将来极有可能尝试切换到廉价相机至少会花费很长时间,甚至失败,并且会返回到昂贵的设备。

Source: https://habr.com/ru/post/zh-CN415841/


All Articles