1. 程式人生 > 實用技巧 >定位推斷系統軟體設計方案

定位推斷系統軟體設計方案

0 前言

  以工程實踐專案——定位推斷系統為基礎,本文將給出該專案的完整設計方案,並總結設計方案中所蘊含的軟體結構特點;同時採用不同的檢視來描述專案的軟體系統概念原型,給出專案的資料庫設計、原始碼的目錄檔案結構,最後說明系統概念原型的核心工作機制。專案概述:目前傳統的移動終端定位方式主要是通過四顆已知位置的衛星來確定GPS接收器的位置,而現在考慮通過裝置所接收的多個藍芽訊號通過機器學習、深度學習來推斷當前裝置所處的位置。我們在某個區域部署固定基站來廣播藍芽訊號,裝置接收到訊號後,將接收到的藍芽訊號強度等資訊上傳至伺服器,使用構建好的網路模型,經過訓練和測試後,推斷出裝置的行動軌跡。

1 系統架構風格

  該專案採用客戶-服務模式的架構風格,由手機終端、pc端、伺服器端和多個藍芽節點組成,在手機終端個伺服器全採用C/S架構,具有安全的存取模式、網路通訊量低、響應速度快、利於處理大量資料等優點,而pc端與伺服器端採用B/S架構,pc端將推理結果視覺化,所以使用B/S架構開發簡單,共享性強。客戶-服務模式的架構風格具有典型的模組化特徵、降低了系統中客戶和服務構件之間的耦合度,提高服務構件的可重用性。

2 設計模式

  設計模式的本質是面向物件設計原則的實際運用總結出的經驗模型。在實際開發過程中,假如沒有按照設計模型的理念進行開發,當需求發生變化時,修改一個地方的程式碼往往會給另一個地方帶來破壞,所以通過使用常見的設計魔術,例如單例模式、原型模式、代理模式、介面卡模式等,使用模組化封裝的方法,按照模組化追求的高內聚低耦合目標,藉助抽象思維對模組內部資訊的隱藏並使用封裝介面對外只暴露必要的可見資訊,利用多型、閉包、lamda函式、回撥函式等特殊的機制方法,將變化的部分與不變的地方進行適當的隔離,來應對總是變化的需求和軟體本質上的模型不穩定特質。

在該專案中,由於要使用多種演算法,所以使用策略模式,對服務端中各個網路結構模型封裝起來,使其相互替換或融合,且演算法內部的改變不會影響外部的使用,例如:

  客戶端和服務端需要不斷的進行互動,在客戶端和服務端之間增加中間層,即建立代理類來控制物件的訪問;在推斷和效果展示階段,使用命令模式,將客戶端請求封裝為一個物件,使發出請求的責任與執行請求的責任分離,以方便將命令物件進行儲存、傳遞和管理。

3 前後端介面API

  前後端進行資料傳輸時,遵循相應的介面格式,前端傳送給後端的資料格式為:

{
    url:” ”, 
    type:” ”, 
    parmas:{}
}
其中,url 為請求的後端的方法介面;type 為請求方式;parmas 為請求引數,也是一個 json 格式的資料。
服務端返回給前端的的資料格式如下:
{
    code:” ”, 
    msg:” ”, 
    data:{}
}
code 為狀態碼,通過程式碼表示每次請求的不同狀態;msg 表示不同狀態下附帶的資訊,便於前端理解伺服器或者該次請求的詳細情況,使用彈窗提示使用者相應的資訊;data 則表示後後端傳輸給前端的資料。

  例如,增加藍芽裝置:

增加定位藍芽裝置
url: root + /addDevice
type:post
params:{ 
    mac: (String)
    longitude:(double)
    latitude: (double)
}

4 專案檢視

  軟體架構模型是通過一組關鍵檢視來描述的,同一個軟體架構,由於選取的視角和抽象層次不同可以得到不同的檢視,這樣一組關鍵檢視搭配起來可以完整的描述一個邏輯自洽的軟體架構模型,一般來說,常見的幾種檢視有分解檢視、依賴檢視、泛化檢視、執行檢視、實現檢視、部署檢視和工作任務分配檢視。

  4.1 分解檢視

  對於一個系統,往往包含多個子系統,子系統又由各種包組成;包中又包含各種類。常見的分解方法有,面向功能的分解方法、面向特徵的分解方法、面向併發的分解方法、面向事件的分解方法、面向物件的分解方法,用例建模即是一種面向功能的分解方法,這裡使用面向功能的分解方法:

4.2 依賴檢視

  依賴檢視展現了模組之間的依賴關係,例如軟體模組A呼叫軟體模組B,那麼可以說軟體模組A直接依賴軟體模組B,若一個軟體模組依賴於另一個軟體模組產生的資料,那麼至兩個軟體模組也具有一定的依賴關係。在本專案中,服務端中的軟體模組具有較強的依賴性,這也是後續需要改進的地方,例如只有處理完資料才能進行模型訓練。

  4.3 執行檢視

  執行檢視展示了系統執行時的時序結構特點,執行實體可以最終分解到軟體的基本元素和軟體的基本結構,因而與軟體程式碼具有比較直接的對映關係,執行檢視可以是流程圖、時序圖等,這裡使用時序圖來展示系統執行的時序關係。

  4.4 工作分配檢視

  工作分配檢視有利於跟蹤不同專案團隊和成員的工作任務的進度,也有利於在個專案團隊和成員之間合理地分配和調整專案資源,甚至在專案計劃階段工作分配檢視對於進度規劃、專案評估和經費預算都能起到有益的作用。

  

  4.5 實現檢視  

  實現檢視是描述軟體架構與原始檔之間的對映關係,典型的實現檢視可以由軟體專案的原始檔目錄樹來呈現,實現檢視有助於開發者在原始碼中找到具體的某個軟體單元的實現。服務端採用Spring Boot框架,src/main/java中存放後端程式碼,包含Application.java啟動類、controller控制器類、對資料庫操作介面以及相應的工具類(只做了資料收集、處理和儲存部分),src/main/resources中存放資原始檔和配置檔案;src/test/java為測試程式。展示部分比較簡單,只需將請求的資料展示出來即可。

5 資料庫設計

  users表,用來存放使用者/管理員:

欄位 型別 含義 備註
id string 使用者唯一標識 主鍵
root string 許可權 普通使用者/管理員

  user_data關聯表:

欄位 型別 含義 備註
userid string 使用者id 主鍵
dataid string 資料id 主鍵

  datas表,用來存放使用者上傳的資料資訊:

欄位 型別 含義 備註
dataid string 資料id 主鍵
mac string 藍芽mac
rssi double 訊號強度
rssi_1m double 1m處的訊號強度
longitude_gps long 精度
latitude_gps long 維度
timestamp long 時間戳

  models表,用來存放訓練好的模型權重及相關資訊:

欄位 型別 含義 備註
modelid string 模型標識 主鍵
model / 模型檔案
accuracy double 模型準確度

6 系統執行環境和技術選型說明

  後端使用Spring Boot框架,可以快速構建專案,對主流開發框架的無配置整合,封裝了各種經常使用的套件,比如mybatis、hibernate、redis、mongodb等,極大地提高了開發、部署效率。手機app使用Android Studio開發、前端展示介面使用VS Code編寫;後端採用java和python語言,使用java搭建後端整體框架、python進行資料處理以及模型訓練,進行混合開發;由於小組之間分工不同,負責的功能模組不同,所以更加強調面向介面程式設計,只需要事先約定好介面規範,便大大提高了開發效率。

7 核心工作機制

  在資料獲取和處理階段,使用者在移動過程中通過手機獲取到部署在任意場景下的多個藍芽訊號廣播裝置所發出的藍芽訊號,通過對多個藍芽訊號的整合後,將當前獲取到的藍芽訊號和當前GPS上傳至伺服器,管理員制定過濾和整合標準,再對資料進行一次過濾和整合,得到一條可能有用的資料。訓練以及改進階段,待資料收集完畢,由管理員對整合的資料進行視覺化分析和相關性研究後,選擇衡量成功的標準並確定評估方法和損失函式、準備資料,該過程主要包括:資料集的劃分以及對資料進行清洗和特徵選擇,最後選擇可用的模型並訓練。推斷階段,通過使用者在移動過程中藍芽訊號的變化,模型推測出使用者的位置,並使用視覺化顯示出使用者軌跡。

參考:https://gitee.com/mengning997/se