# 1. 设计文档 ## 1.1. 产品概述 ## 1.2. 结构设计 1. 迷彩外观; 2. 抽屉式电池箱组; 3. 捆绑/相机支架安装方式; 4. 案件翻盖保护; 5. 可拓展4G模块; 6. 户外防水; ## 1.3. 硬件设计 ### 1.3.1. 关键外设 1. 摄像头; 2. PIR sensor; 3. IR leds; 4. 电池(箱体); 5. 启动模式拨键(三键); 6. 按键:同步/复位/格式化; 7. SD card; 8. usb接口; 9. NFC(绑定APP); 10. 光感传感器:白天/黑夜; 11. 指示灯:设备状态/SD卡状态/电量/无线信号灯/账号状态; ### 1.3.2. 生产测试/研发调试 ## 1.4. 软件设计 ### 1.4.1. 多态单例设计模式    多态单例模式包含两部分:抽象接口 + 抽象接口实例,代码基于抽象接口存在,业务基于抽象接口实例存在。 #### 1.4.1.1. 多态单例图示    下述图示分别为:类图 / 依赖关系图 / 编译链接关系图 ```mermaid classDiagram APP --> AbstractInterface:使用 AbstractInterface <|.. Instance:实现 应用 --> 抽象接口库:依赖 抽象接口库 ..> 实例库:依赖 main线程 --> 抽象接口代码库:链接 main线程 --> 实例代码库:链接 ``` #### 1.4.1.2. 多态单例模块使用时序图    在使用多态单例设计模式开发功能模块时,使用统一的命名规则: * 抽象接口命名:xxx + Abstract,例如:libLogAbstract.a; * 实例库命名:xxx + 具体实例名称,例如:libLogEasylogging.a; **调用关系如下图** ```mermaid sequenceDiagram User ->> +libLogAbstract.a:调用抽象接口 libLogAbstract.a --> +libLogEasylogging.a:实际调用实例接口 libLogEasylogging.a --> -libLogAbstract.a:return libLogAbstract.a -->> -User:return ``` **只有main函数实际调用实例库的实例化接口时,log功能才会生效。** #### 1.4.1.3. 多态单例总结: 1. 应用代码只使用抽象接口,禁止直接依赖实例代码; 2. 应用代码只有在main线程初始化时实例化实例模块即可; 3. 多态单例模块由两个库组成,一个是抽象接口库,一个是实例代码库,支持静态多态和动态多态; ### 1.4.2. 根据软件模块作用域分层 #### 1.4.2.1. 应用层(application) ##### 1.4.2.1.1. 应用层概述    应用层负责处理产品级的复杂业务关系,是产品功能的直接体现,应用层模块全部使用C++接口的多态单例模式设计,各模块之间可以互相调用接口,应用层各库可以随意任意调用中间件或者工具类接口。 ##### 1.4.2.1.2. 网络服务模块 ###### 1.4.2.1.2.1. 网络服务概述    根据产品联网属性,网络服务模块分为不联网 / 联网(B端)/ 联网(自研)三个多态属性。联网时,IPC的图片 / 视频资源通过网络服务器进行管理。 1. 不联网版本:网络服务模块不实例化即可; 2. 联网(B端):媒体资源由三方服务器管理; 3. 联网(自研):媒体资源由自研服务器管理; ###### 1.4.2.1.2.2. 网络服务多态设计模式    通过构建配置文件选择需要实例化的网络服务模块代码。 #### 1.4.2.2. 中间件(middleware) ##### 1.4.2.2.1. 中间件概述    一些相对中性的业务功能库,这些库可以提供给不同的产品需求使用,在应用层不同的调用方式可实现不同的产品功能。中间件只能被应用层调用或者向下调用适配层或者调用工具库,中间件各模块之间不能互相调用。中间件库接口可以使用C或者C++接口。 ##### 1.4.2.2.2. 外设管理模块    应用层唯一的硬件外设接口库。包含灯 / 按键 / GPIO / SD卡等。 ##### 1.4.2.2.3. 相机管理模块    应用层唯一的摄像头接口库。 ##### 1.4.2.2.4. MCU管理模块    单片机通信接口库。 #### 1.4.2.3. 适配层(hal) #### 1.4.2.4. 工具库(utils) ##### 1.4.2.4.1. 工具库概述    工具库是功能单一的不依赖任何三方库的独立库(日志库和返回码管理库除外),必须提供C语言接口,内部实现不限于C或者C++。工具类库可以被任意的其它模块调用,特别指hal/component/application三大层级。 ##### 1.4.2.4.2. 日志库 ###### 1.4.2.4.2.1. 日志库概述    提供程序的日志管理功能,含日志的实时打印/保存/跟踪(实时上传云端)。 ###### 1.4.2.4.2.2. 日志库设计模式    C语言接口的多态单例模式,可动态/静态加载多态实例。 ###### 1.4.2.4.2.3. 日志库启动    日志库是否启用一般来讲是dubug版本启用日志功能,release版本禁用日志功能,考虑到release版本的维护问题,标准启动时,main线程在启动时使用dlopen系列函数去加载日志库(多态),特殊版本仍可在main线程加载日志库后,二次实例化日志库(多态)来实现不同的日志功能。 1. 标准流程:main线程加载sd卡动态库,如有即可动态实现日志功能,正常出货sd卡不带日志库,此时没有日志功能; 2. 可以通过配置参数决定是否启用日志; 3. sd卡的日志动态,根据实际售后维护,可以是实时打印log/保存本地log/云log的多态实例库; 4. 多态日志功能,可以忽略debug和release版本的区别,只发布一个版本即可; ##### 1.4.2.4.3. 返回码管理库 ###### 1.4.2.4.3.1. 返回码管理库概述    提供整个应用程序的返回码管理功能,例如:打印返回码的字符串含义。提供C语言接口,内部实现不限于C或者C++,形成项目内部唯一返回码标准。 1. 创建返回码操作“句柄”; 2. 打印返回码/获取返回码(字符串); 3. 不同的模块可继承实现各自的返回码处理接口;