我们如何学会将 1000 卢布的中国相机连接到云端。 无需注册商和短信(节省了数百万美元)

您好!

近年来,云视频监控服务越来越受欢迎,这对任何人来说可能都不是秘密。 发生这种情况的原因是可以理解的,视频是“重”内容,需要基础设施和大量磁盘存储来存储。 使用本地视频监控系统需要资金来运营和支持,无论是使用数百个监控摄像头的组织还是拥有多个摄像头的个人用户。

我们如何学会将 1000 卢布的中国相机连接到云端。 无需注册商和短信(节省了数百万美元)

云视频监控系统通过为客户提供现有的视频存储和处理基础设施来解决这个问题。 云视频监控客户端只需将摄像机连接到互联网并将其链接到他们在云中的帐户即可。

有多种技术方法可以将摄像机连接到云端。 毫无疑问,最方便、最便宜的方式——摄像头直接与云端连接并工作,无需服务器或注册商等额外设备的参与。

为此,需要在相机上安装与云配合使用的软件模块。 然而,如果我们谈论廉价相机,那么它们的硬件资源非常有限,几乎100%被相机厂商的原生固件占用,但没有云插件所需的资源。 ivideon 的开发人员致力于解决这个问题 文章,这说明了为什么他们不能在廉价相机上安装该插件。 结果,相机的最低价格为 5000r(80 美元),并且在设备上花费了数百万美元。

我们已经成功解决了这个问题。 如果您对如何做感兴趣 - 欢迎来到猫下

有一点历史

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

在相机软件方面,在第一阶段,我们采用了“标准”方式来完成此类任务:我们开发了自己的插件,该插件安装在供应商相机的固件中并与我们的云配合使用。 但值得注意的是,在设计时,我们使用了最轻量级、最高效的解决方案(例如,protobuf、libev、mbedtls 的纯 C 实现以及完全放弃像 boost 这样方便但笨重的库)

现在网络摄像机市场上还没有通用的集成解决方案:每个供应商都有自己的插件安装方式、自己的固件操作API集和独特的更新机制。

这意味着对于每个相机供应商来说,有必要单独开发一个体积层的集成软件。 在开发开始时,建议仅与 1 个供应商合作,以便团队集中精力开发与云合作的逻辑。

海康威视被选为第一家供应商,它是摄像头市场的全球领导者之一,提供完善的 API 和强大的工程技术支持。

使用海康威视摄像机,我们启动了第一个试点项目——云视频监控Videocomfort。

几乎在发布后不久,我们的用户就开始询问是否可以将其他制造商的更便宜的相机连接到该服务。

我几乎立即放弃了为每个供应商实施集成层的选择 - 因为它的可扩展性很差并且对相机硬件提出了严格的技术要求。 入口处满足这些要求的摄像机的成本:~ 60-70 美元

因此,我决定深入挖掘 - 为任何供应商的相机制作自己的固件。 这种方法显着降低了对相机硬件资源的要求。 云层与视频应用程序的集成更加有效一个数量级,并且固件中没有多余的未使用的脂肪。

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

我们如何学会将 1000 卢布的中国相机连接到云端。 无需注册商和短信(节省了数百万美元)

那一刻,我们什么都没有了。 什么都没有。

几乎所有供应商都没有准备好在如此低的水平上与我们合作。 没有有关电路和组件的信息,没有官方芯片组 SDK 和传感器文档。
也没有技术支持。

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

小米蚁蚁、海康威视、大华、Spezvision、D-Link 和一些超便宜的无名中国相机是我们第一批塞上凹凸的相机型号。

技术

基于海思3518E芯片组的相机。 相机的硬件特性如下:

小米蚁蚁
NONAME

系统芯片
海思3518E
海思3518E

内存
64MB
64MB

FLASH
16MB
8MB

无线网络
mt7601/bcm43143
-

传感器
ov9732 (720p)
ov9712 (720p)

以太网(EtherNet)
-
+

的MicroSD
+
+

全向麦
+
+

喇叭
+
+

爱尔兰人
+
+

红外切割
+
+

我们从他们开始。

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

固件的组成

uboot

uboot是bootloader,上电后首先启动,初始化硬件并加载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,稍后当我们谈到更新子系统时,会详细介绍这一点。

注意行 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模块驱动、一套标准系统库,如 libld и libc,以及我们自己开发的软件,负责LED控制逻辑、网络连接管理和固件更新。

根文件系统作为 initramfs 连接到内核,组装后我们得到一个文件 uImage,它同时具有内核和 rootfs。

视频应用

固件中最复杂和资源密集的部分是一个应用程序,它提供视频音频捕获、视频编码、配置图像参数、实现视频分析(例如运动或声音检测器)、控制 PTZ 并负责切换白天和夜间模式。

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

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

此时,我们使用共享内存机制 - 视频不会通过相机软件组件之间的套接字复制或发送,从而最佳且谨慎地使用相机的适度硬件功能。

我们如何学会将 1000 卢布的中国相机连接到云端。 无需注册商和短信(节省了数百万美元)

更新子系统

单独引以为傲的主题是用于在线固件更新的容错子系统。

让我解释一下这个问题。 更新固件从技术上来说并不是一个原子操作,如果更新中途断电,闪存上就会有一部分“被覆盖”的新固件。 如果不采取特殊措施,那么相机接下来就会变成一块必须搬到服务中心的“砖头”。

我们也处理过这个问题。 即使相机在更新时关闭,它也会自动从云端下载固件并恢复操作,无需用户干预。

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

最容易受到攻击的时刻是用 Linux 内核和根文件系统覆盖分区。 如果这些组件之一被损坏,那么相机将无法在 uboot 引导加载程序之外启动,而 uboot 引导加载程序无法从云端下载固件。

这意味着我们需要确保相机在更新过程中随时都有可用的内核和rootfs。 最简单的解决方案似乎是在闪存上永久存储带有 rootfs 的内核的两个副本,并在主内核损坏的情况下从备份副本加载它。

一个很好的解决方案 - 然而,带有 rootfs 的内核大约需要 3.5MB,并且需要分配 3.5MB 来进行永久备份。 在最便宜的相机上,根本没有那么多可用空间用于备份内核。

因此,对于固件更新时的备份内核,我们使用应用程序分区。
并使用两个命令来选择内核所需的分区 bootm 在 uboot 中 - 一开始我们尝试加载主内核,如果它损坏,则加载备份内核。

我们如何学会将 1000 卢布的中国相机连接到云端。 无需注册商和短信(节省了数百万美元)

这可以确保在任何给定时间相机都具有带有 rootfs 的正确内核,以便它可以启动并恢复固件。

用于构建和部署固件的 CI/CD 系统

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

我们如何学会将 1000 卢布的中国相机连接到云端。 无需注册商和短信(节省了数百万美元)

通过该服务,固件更新将传送到我们 QA 的测试相机,并在完成所有测试阶段后传送到用户的相机。

信息安全

众所周知,在我们这个时代,信息安全是任何物联网设备(包括相机)最重要的方面。 像 Mirai 这样的僵尸网络在互联网上漫游,使用供应商的标准固件攻击数百万台相机。 出于对相机供应商的应有尊重,我不得不指出,标准固件包含许多与云一起使用不需要的功能,但包含僵尸网络使用的许多漏洞。

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

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

结论

现在我们的固件积极用于视频监控项目。 其中最雄心勃勃的也许是俄罗斯联邦总统选举当天的投票广播。
该项目涉及 70 万多台装有我们固件的摄像机,这些摄像机安装在我国的投票站中。

在解决了许多复杂的、在某些地方甚至在当时几乎不可能的任务之后,我们作为工程师当然得到了极大的满足,但除此之外,我们还节省了数百万美元购买相机的费用。 在这种情况下,节省的成本不仅仅是文字和理论计算,而是已经发生的设备采购招标的结果。 因此,如果我们谈论云视频监控:有两种方法:战略上依赖低水平的专业知识和开发,从而节省大量设备费用;或者使用昂贵的设备,如果您专门考虑消费者特征,那么这就是与类似的廉价产品几乎没有什么不同。

为什么尽早就集成方法的选择做出决定具有战略重要性? 开发插件时,开发人员依赖某些技术(库、协议、标准)。 如果只为昂贵的设备选择一套技术,那么未来转向廉价相机的尝试很可能会花费非常长的时间甚至失败,并且会回归到昂贵的设备。

来源: habr.com

添加评论