背景
? ? ? ? 產品研發和項目研發有什么區別?一個令人發指的問題,剛開始工作時項目開發居多,認為項目開發和產品開發區別不大,待后來隨著自身能力的提升,逐步感到要開發一個好產品還是比較難的,我認為項目開發的目的是滿足項目需求,只要滿足了需求就達到了目的。產品開發就不太一樣,產品開發更像是終身制的項目,要解決隨時在不同項目中使用時出現的問題,也要能滿足不同應用場景下的使用。
? ? ? ? 嵌入式軟件基本分為了兩個流派,從技術層面來講,一個是基于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服務器,配置界面如下所示:
????????配置界面如下所示:
????????內部應用程序如下圖所示:
關于架構層面的設計,以后慢慢逐步展開。