定位紀錄功能說明
定位軟體在每次定位卡片上報時會將卡片資訊依照順序暫存下來,並且於每個小時整點時儲存成一個.dat提供軟體查尋回放,軟體監控停止時也會將未儲存的卡片資訊記錄下來。定位紀錄檔案會自動儲存在軟體執行檔目錄中的Rrecord資料夾內,並且以天為單位存放當天不同時間點的紀錄,每筆紀錄會以當天整點時間命名。如下圖所示為2020年06月11日的5個紀錄檔案,其中14.dat、15.dat、16.dat、17.dat、18.dat為14-18點這5個小時的紀錄檔案。
記錄點存取流程說明
1、定位軟體儲存流程如下
a. 定位卡片上報時計算出定位點,並將相關資訊以結構體方式記錄下來
b. 將結構體資訊放進暫存佇列當中
c. 整點或是定位軟體關閉時啟動儲存執行續儲存紀錄
d. 以二進位格式將暫存佇列進行序列化儲存成dat檔案
2、定位軟體讀取流程如下
a. 依照時間需求依序尋找符合的dat檔案名稱
b. 將dat檔案反序列化後取得佇列化的卡片定位資訊
c. 判斷定位結構中的時間、卡片ID等資料是否是尋找目標
d. 將定位點資訊在軟體中呈現
卡片資訊結構定義
public class LocateTagInfo
{
public byte[] TagId = new byte[3]; //卡片的ID
public byte[] AnchorId = new byte[3]; //基站的ID
public byte[] GroupId = new byte[2]; //地圖組別的ID
public byte[] FirmwareType = new byte[4]; //卡片韌體類型
public byte[] FirmwareVersion = new byte[4]; //卡片韌體版本
public string Name = ""; //卡片的名稱
public Int16 GsensorX, GsensorY, GsensorZ; //紀錄G-Sensor數值
public byte Batt; //卡片的電量
public UInt16 SleepTime; //卡片的休眠時間
public int GsensorTime; //卡片未移動時間
public int SerialNum; //上報封包序號
public int LastSerialNum; //上一筆封包序號
public byte LocateType = 0; //定位類型
public int AbsHeight = int.MinValue; //卡片的高度
public int ActualUseAlgorithm = -1; //使用的定位演算法
public int HearRate = int.MinValue; //心率
//基站結構體,紀錄定位基站資訊
public List<LocateAnchorInfo> LocateAnchorInfoList = new List<LocateAnchorInfo>();
//卡片的座標位置
public PrecisePositionLibrary.Point TagCoor = new PrecisePositionLibrary.Point();
//卡片的歷史軌跡座標,前五點的座標位置
public PrecisePositionLibrary.Point TagLastCoor1, TagLastCoor2, TagLastCoor3, TagLastCoor4, TagLastCoor5;
public DateTime ReceTime = new DateTime(); //卡片封包最後上報時間
public int LossPack = 0; //卡片封包漏包的累計數量
public int TotalPack = 0; //卡片封包的累計數量
public bool IsShowTag = true; //卡片是否要顯示
public bool IsTagShowRed = false; //卡片是否紅色顯示(緊急上報)
public int ShowRedTick = 0; //卡片開始顯示紅色的時間
public bool IsLowBatt = false; //卡片是否是低電量
public bool IsTagLost = false; //卡片是否超時未上報
public bool IsOverTimeNoMove = false; //卡片是否超時未移動
public bool IsTagLostNotShow = false; //卡片超時未上報是否顯示
public bool IsWatchBandLoosen = false; //卡片是H03且錶帶是否鬆脫
public bool IsHeartRateAbnormal = false; //心率是否異常
public bool IsTagLostWarn = false; //卡片是否發出超時未上報警告
public bool IsLowBattWarn = false; //卡片是否發出低電量警報
public bool IsWatchBandLoosenWarn = false; //卡片是否發出錶帶鬆脫警報
public bool IsHeartRateAbnormalWarn = false;//卡片是否發出心率異常警報
//卡片進入限制區域的限制區域結構集合
public Dictionary<string, LimitArea> TagEnterLimitAreaList = null;
public Kalman KalmanX = null; //X座標的Kalman濾波器元件
public Kalman KalmanY = null; //Y座標的Kalman濾波器元件
public Kalman KalmanZ = null; //Z座標的Kalman濾波器元件
public bool IsSinglePointCoor = false; //卡片座標是否為單點定位座標
public double RandomDegree = double.MinValue;//顯示卡片單點座標的隨機角度
}
C#程式碼運作內容說明
定位軟體儲存流程
a. 儲存上報卡片的定位資訊,資訊會儲存成LocateTagInfo的結構形式
b. 將卡片資訊存進暫存佇列當中
c. 固定時間以及關閉監控時,軟體會將定位資訊從暫存佇列取出並進行儲存
d. 進行二進位序列化儲存
e. 使用C#檔案二進位序列化函式進行儲存 - binaryformatter.serialize
f. 檔案會儲存在執行檔當下目錄的Record資料夾中。可以看到檔案會依照時間日期儲存成.dat檔案
定位軟體讀取流程
a. 使用軟體歷史紀錄功能
b. 判斷時間條件讀取相關的dat檔案
c. 當下目錄檔案如下
d. 判斷時間條件與檔案名稱
e. 利用C#檔案反二進位序列化函式進行讀取 - binaryformatter.deserialize
f. 反序列化取得卡片定位資訊
g. 判斷卡片資訊中的接收時間是否符合條件 - ReceTime
h. 判斷ID或是名稱是否符合條件 – Name,TagId[]
i. 取得符合條件封包進行歷史紀錄播放