1. 概述

  嵌入式设备的多样性,使得在嵌入式应用程序中,与硬件交互的部分无法做到”一次编写,到处使用“,但是与平台和客户端交互的部分却是可以一致的。因此我们在逻辑上,将 VVDEV 设备端程序分解成两层,平台接入层和硬件接入层。

  在硬件接入层中,我们针对设备端一些通用的功能,抽象出一个基础功能模块,我们设计了这个模块的接口,需要硬件开发商来实现(也可以委托我们来实现);针对非基础功能,即扩展功能,我们以插件的方式来提供,一些常见的扩展功能插件,我们已经实现。

  平台接入层和基础功能模块可以是主程序与动态库间这种分离的关系,我们称为动态库方式;也可以是集成在一个程序中,我们称之为静态库方式。

  当采用动态库方式时,设备开发商需要按本文档的规定编写一个名为 libvvdev.so 的动态库, 供 vvdev 调用,vvdev 是一个可执行程序,由我们提供,里面已实现平台接入层的所有功能。

  当采用静态库方式时,设备开发商需要将 libvvdev.a 的静态库链接到自己的程序中,并在自己的程序中按本规范实现所有 API 接口。

  所有非基础功能,即扩展功能,均采用动态库的方式,以插件的形式来提供。这些插件已经由我们编写好,直接复制到设备中即可。这些插件包括:Onvif服务插件、RTSP流媒体服务插件、二维码识别插件、外部传感器插件等。这些插件可以随意组合使用,当设备中包含这些插件时,vvdev 自动开启这些插件的功能,否则就不具备这些功能,但不影响基础功能的正常运行。

1.1 动态库方式

  基础功能库采用动态库时,其结构如下图所示:

  基础功能库与硬件驱动交互,实现与硬件相关的一组基本功能,编译成动态链接库,供 vvdev 进程调用。所有通过网络交互的功能,都放在平台接入层中。平台接入层与硬件无关,以进程方式运行,,通过加载动态链接库的方式与基础功能库交互。

  插件直接与 vvdev 交互,实现一些扩展功能。

1.2 静态库方式

  基础功能库采用静态库时,其结构如下图所示:

  使用静态库方式时,设备开发商在自己的程序中,将我们提供的 libvvdev.a 静态库集成进去。 在 libvvdev.a 中已实现了平台接入层的所有功能。设备开发商需要在自己的程序中实现本文档定义的基础功能库接口,libvvdev.a 中的代码会在适当的时候来自动调用这些接口。

  与动态库方式相比,除了 libvvdev.so 被设备厂商自己的程序所代替外,其它的扩展功能,仍由插件提供。

我们建议使用动态库方式,因为采用动态库方式时,当平台接入层升级时,只需要简单地替换掉 vvdev 即可,设备开发商的程序不需要再重新编译。