背景
产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的是满足项目需求,只要满足了需求就达到了目的。产品开发就不太一样,产品开发更像是终身制的项目,要解决随时在不同项目中使用时出现的问题,也要能满足不同应用场景下的使用。
嵌入式软件基本分为了两个流派,从技术层面来讲,一个是基于MCU来开发的,一个是基于MPU来开发的,当年我有很多同事都不理解你一个搞MCU的开发个产品有什么难的,还一个团队十来个人搞这么长时间,有这种想法的人一般都是搞项目开发的高手,不管是基于MCU还是基于MPU,只要是开发产品,都不是个很简单的事情。
早些年都是基于MCU来开发产品,资源有限,处理能力有限,经常会有很多需求无法实现,或者实现起来太麻烦,没法站在开源的巨人肩膀上走的更远。正好在搞项目开发时,公司提出来一个看似不太明确的产品需求,却有明确的项目交期,在这种情况下,只能用最保险的方式,最大的扩展方式来实现产品的开发。
需求
- 宽电压供电,DC9~35V;
- 支持两路百兆以太网;
- 支持4G/5G/Wifi通讯;
- 可外接北斗2/3进行卫星通讯;
- 支持LoRa本地组网;
- 支持继电器控制/数字量采集/CAN总线/RS232总线/RS485总线;
- 支持MQTT标准协议;
- 支持Onenet,阿里云等物联网平台;
- 支持外接TF卡;
- 支持网络摄像头;
技术难点
- 最大的难点是需求不明确,不清楚使用场景;
- 宽电压范围这个还好说,国产电源芯片可以满足;
- 基于新唐的NUC980来实现,内置DDR,减少了硬件工程师的一个风险,官方提供Linux 4.4的内核;
- 基于Linux系统这些外设的驱动实现也是个问题,好在疫情期间跟原厂的工程师建立了微信群,全部协调解决了;
- 软件的扩展性,在这里很重要,用它来应对多变的需求。
设计时没有急于开工,首先通过分析,来将功能进行了划分,拆分架构时参考了冯·诺依曼架构是现代计算机的基础的理论,对设备采集数据,处理数据,存储数据,上传数据等进行类拆分。再加上一些现在开发软件时微服务的概念,将设备内部分成了多个小程序,然后利用TCP协议,在设备内部进行交互。
大体功能模块的划分如下:
- Linux系统,为各个小程序的执行提供运行基础;
- 采集程序,负责前端传感器数据采集,支持周期性采集,触发采集;
- 数据处理程序,负责将采集到数据转化为标准数据;
- 协议处理程序,负责将上下行的数据解析处理,并周期性打包数据上传,接收服务的下行指令的解析处理;
- 中心调度程序,负责将各个子任务的数据进行转发,监控各个子任务的执行情况,并负责维护各个子任务的执行状态;
- 数据管理程序,负责启用数据库,将历史数据存入数据库,并对其它程序提供数据查询服务;
- 通讯程序,负责建立对应的通讯链路,并维护链路的链接;
- 配置程序,负责对外提供web页面,用户可通过web页面对系统的参数,应用程序的参数等进行配置,并对运行过程的数据进行查看;
内部的小程序之间通讯都是基于TCP进行的,设备可以实现集群部署,可以单台设备实现其中的部分功能,来增加整个系统的性能。
产品对外接口有各种灵活性,具体配置如下:

产品内置web服务器,配置界面如下所示:

配置界面如下所示:

内部应用程序如下图所示:
关于架构层面的设计,以后慢慢逐步展开。