hunting/doc/design.md
2023-07-22 18:25:09 -07:00

8.6 KiB
Raw Blame History

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. 多态单例图示

下述图示分别为:类图 / 依赖关系图 / 编译链接关系图

classDiagram
    APP --> AbstractInterface:使用
    AbstractInterface <|.. Instance:实现
    应用 --> 抽象接口库:依赖
    抽象接口库 ..> 实例库:依赖
    main线程 --> 抽象接口代码库:链接
    main线程 --> 实例代码库:链接

1.4.1.2. 多态单例模块使用时序图

在使用多态单例设计模式开发功能模块时,使用统一的命名规则:

  • 抽象接口命名xxx + Abstract例如libLogAbstract.a;
  • 实例库命名xxx + 具体实例名称例如libLogEasylogging.a

调用关系如下图

sequenceDiagram
User ->> +libLogAbstract.a:调用抽象接口
libLogAbstract.a --> +libLogEasylogging.a:实际调用实例接口
libLogEasylogging.a --> -libLogAbstract.a:return
libLogAbstract.a -->> -User:return

只有main函数实际调用实例库的实例化接口时log功能才会生效。

1.4.1.3. 多态单例目录结构规范

根据多态单例设计模式,指定使用多态单例模式开发的模块的源码目录结构,耦合思路清晰。

└── Log // 多态单例模式模块的目录
    ├── include  // 多态单例模块对外暴露的头文件目录,抽象接口定义
    │   └── ILogAbstract.h
    ├── abstract // 多态单例模式抽象接口声明
    │   └── ILogAbstract.cpp
    └── src      // 多态单例接口实例代码,目录名称可根据实际功能定义
        ├── LogAstract.cpp
        └── LogAstract.h

构建时把abstract目录和src目录的源码分别编译成库main线程根据实际需要链接并实例化即可。

1.4.1.4. 多态单例总结:

  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.2.5. IPC配置库

负责管理IPC产品相关的配置数据。

基本功能

  1. 敏感数据(例如:账号 / 密码)需要加密处理;
  2. 读到内存使用二进制数据,缓存到数据结构体;
  3. 调用utils工具里面的配置库对配置文件进行读 / 写;
  4. 使用二进制结构体 + 明文配置文件结合的模式,既可减少内存消耗,又可以规避二进制数据升级迭代数据匹配困难问题;
1.4.2.2.6. 高级配置库

对配置库的二级封装,提供更便捷的功能服务,例如:可以监控文件的修改事件 / 可以直接捕获某个配置文件或者数据的操作对象。

1.4.2.2.6.1. 高级配置库设计

对外暴露C++接口,使用多态单例设计模式。

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语言开发的模块形成项目内部唯一返回码标准。

  1. 创建返回码操作“句柄”;
  2. 打印返回码/获取返回码(字符串);
  3. 不同的模块可继承实现各自的返回码处理接口;
1.4.2.4.4. 系统标准接口库

对系统标准接口的套壳封装,主要是为了对系统标准打桩满足测试需求。

使用普通的C语言接口封装即可通过使用gcc编译参数在Linux x86系统中满足打桩需求在交叉编译担心工具链兼容问题测试程序中无法对系统标准接口进行打桩。

1.4.2.4.5. 配置库
1.4.2.4.5.1. 配置库概述

配置库负责管理软件配置参数,对配置数据进行设置 / 获取 / 存储 / 备份 / 升级等功能;

1.4.2.4.5.2. 配置库设计模式

对外提供C语言接口内部不局限使用C或者C++。

基本功能

  1. 使用三方库保存明文格式的配置文件到文件系统;
  2. 可注册回调函数,监听文件的操作事件;
1.4.2.4.5.3. 开源库
1.4.2.4.5.4. 备份机制

备份数据用于数据异常时可还原旧数据。

1.4.2.4.5.5. 升级机制

程序升级后配置数据发生增 / 删时如何兼容和还原。