張勝茂,戴 陽(yáng),楊勝龍,范秀梅,王 斐
(1 中國(guó)水產(chǎn)科學(xué)研究院東海水產(chǎn)研究所,農(nóng)業(yè)農(nóng)村部東海漁業(yè)資源開發(fā)利用重點(diǎn)實(shí)驗(yàn)室,上海 200090;2中國(guó)水產(chǎn)科學(xué)研究院東海水產(chǎn)研究所,農(nóng)業(yè)農(nóng)村部遠(yuǎn)洋與極地漁業(yè)創(chuàng)新重點(diǎn)實(shí)驗(yàn)室,上海200090)
海洋浮標(biāo)一般可攜帶多種傳感器來(lái)探測(cè)海洋環(huán)境參數(shù),是一種重要的海洋觀測(cè)工具[1-4]。具有全天候、全天時(shí)穩(wěn)定可靠的收集海洋環(huán)境資料的能力[5-6],并能實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)采集、自動(dòng)標(biāo)識(shí)和發(fā)送[7-9]。海洋浮標(biāo)種類繁多,主要有錨定類型浮標(biāo)和漂流類型浮標(biāo)[10-11],用途包括氣象資料收集、海水水質(zhì)監(jiān)測(cè)、船舶導(dǎo)航、重要設(shè)施標(biāo)識(shí)等[12-15]。近年來(lái),隨著聲吶設(shè)備的小型化,海洋浮標(biāo)也可攜帶魚探儀器輔助海洋捕撈[16-19]。海洋浮標(biāo)的通信方式多樣,主要包括衛(wèi)星通信、移動(dòng)網(wǎng)絡(luò)通信、北斗短報(bào)文等[20]。海事衛(wèi)星、銥星等通信方式快捷但費(fèi)用高[21-23],而移動(dòng)通信網(wǎng)絡(luò)適合在近海浮標(biāo)上使用,海洋浮標(biāo)采集的環(huán)境數(shù)據(jù)多為海洋物理參數(shù),采用北斗短報(bào)文方式通信費(fèi)用低,傳輸次數(shù)限制小,因此適合作為海洋浮標(biāo)的數(shù)據(jù)通信方式。
海洋捕撈是人類海洋開發(fā)史上最古老的產(chǎn)業(yè)之一[24],因魚類資源時(shí)空變化大[25-26],快速確定漁場(chǎng)位置在漁業(yè)捕撈中尤為重要,尋找漁場(chǎng)手段包括船長(zhǎng)經(jīng)驗(yàn)、人員觀測(cè)、多船分散探捕等[27],以及運(yùn)用衛(wèi)星遙感技術(shù)預(yù)報(bào)漁場(chǎng)[28-30]。海洋浮標(biāo)可以攜帶聲吶設(shè)備,通過(guò)太陽(yáng)能供電可以長(zhǎng)期工作,并且體積小成本低[31],漁船在作業(yè)海域可以布放多個(gè)浮標(biāo)來(lái)探測(cè)魚群,成為快速定位漁場(chǎng)有效手段。
本研究利用面向?qū)ο蟮脑O(shè)計(jì)方法,采用北斗通信方式實(shí)現(xiàn)數(shù)據(jù)接收與海洋浮標(biāo)控制。受短消息的數(shù)據(jù)量限制,傳感器數(shù)據(jù)采用分解包為多幀方式傳輸,終端軟件采用多線程,通過(guò)哈希表管理接收數(shù)據(jù),隊(duì)列管理回發(fā)的信息和控制命令。漁船上部署海洋浮標(biāo)數(shù)據(jù)收發(fā)控制的船載終端可直接獲取浮標(biāo)數(shù)據(jù),服務(wù)于漁場(chǎng)尋找。
北斗海洋浮標(biāo)是一種漂浮在海上的浮標(biāo)終端,利用太陽(yáng)能電池板供電,通過(guò)掛載的多個(gè)傳感器收集海洋物理參數(shù),如溫度、鹽度、pH、聲吶等。船載終端部署在船上,通過(guò)船上的發(fā)電設(shè)備供電,控制衛(wèi)星海洋浮標(biāo)數(shù)據(jù)的收發(fā)。浮標(biāo)終端和船載終端都裝有衛(wèi)星通信卡,通過(guò)通信衛(wèi)星完成兩者之間的數(shù)據(jù)收發(fā)與控制(圖1)。浮標(biāo)終端掛載的傳感器分別為傳感器1、傳感器2、…、傳感器n,通過(guò)下位機(jī)讀取海洋物理參數(shù)。船載終端由上位機(jī)發(fā)送控制命令和接收數(shù)據(jù),接收的數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中,通過(guò)終端能夠查詢。
上位機(jī)和下位機(jī)間的數(shù)據(jù)類型固定不變,共有11種數(shù)據(jù)類型,包括無(wú)符號(hào)整數(shù)(8位、16位、32位、64位)、有符號(hào)整數(shù)(8位、16位、32位、64位)、浮點(diǎn)數(shù)(32位、64位)、128位精確的十進(jìn)制值。浮標(biāo)終端發(fā)送的基本信息固定(表1),包括浮標(biāo)卡號(hào)(32位無(wú)符號(hào)整數(shù)類型)、時(shí)間(32位無(wú)符號(hào)整數(shù)類型)、經(jīng)度(32位單精度浮點(diǎn)型)、緯度(32位單精度浮點(diǎn)型)、航速(8位無(wú)符號(hào)整數(shù))、航向(16位無(wú)符號(hào)整數(shù))。浮標(biāo)基本信息數(shù)據(jù)長(zhǎng)度為:B=32(浮標(biāo)卡號(hào))+32(時(shí)間)+32(經(jīng)度)+32(緯度)+8(航速)+16(航向)+16(電壓)=168(bit)。
表1 浮標(biāo)數(shù)據(jù)基本信息
浮標(biāo)卡號(hào)取值范圍0到4 294 967 295,卡號(hào)不多于9位;時(shí)間為2000年起算的秒數(shù),上位機(jī)接收到數(shù)據(jù)后,在2000年基礎(chǔ)上加上秒數(shù)來(lái)計(jì)算時(shí)間;經(jīng)緯度類型都為單精度浮點(diǎn)型,經(jīng)度范圍-180°~180°,緯度范圍-90°~90°;航速為8位無(wú)符號(hào)整數(shù),取值范圍為0到255,除以10后范圍為0~25.5 m/s;航向?yàn)?6位無(wú)符號(hào)整數(shù)類型,采用方位角表達(dá),范圍為0~259。浮標(biāo)終端傳感器有多個(gè),各傳感器位數(shù)總和為傳感器的數(shù)據(jù)長(zhǎng)度。
(1)
式中:S為各傳感器的總位數(shù);ni為第i個(gè)傳感器的數(shù)據(jù)個(gè)數(shù);ti為ni傳感器的數(shù)據(jù)類型位數(shù),兩者乘積為第i個(gè)傳感器數(shù)據(jù)的位數(shù)。
浮標(biāo)基本數(shù)據(jù)和傳感器數(shù)據(jù)合并后向船載終端發(fā)送,一般會(huì)超過(guò)通信衛(wèi)星一條短消息的長(zhǎng)度,因此,將向船載終端發(fā)送的完整數(shù)據(jù)作為一個(gè)包,把包劃分為多幀,多次發(fā)送。船載終端接收到全部幀后,再把幀拼接為包,然后進(jìn)行解譯。
數(shù)據(jù)包由多個(gè)幀組成,每幀有一個(gè)頭文件(表2),頭文件中包含包編號(hào)、幀數(shù)、幀序號(hào)、傳感器i數(shù)據(jù)個(gè)數(shù)、傳感器i數(shù)據(jù)類型。包的一組幀的包編號(hào)相同,每月開始從1起始編號(hào),編號(hào)用該月起始的分鐘數(shù),到該月最后一分鐘位置,編號(hào)范圍從1到44 640的值。幀數(shù)是包的一組幀的總數(shù),8位有符號(hào)整數(shù)類型的前4位,幀序號(hào)是幀在一組幀的順序號(hào),8位有符號(hào)整數(shù)類型后4位,幀數(shù)和幀序號(hào)組成一個(gè)8位無(wú)符號(hào)整數(shù)類型,只有各幀全部接收并且按順序拼接才能正確解譯數(shù)據(jù)。傳感器i數(shù)據(jù)個(gè)數(shù)表明該傳感器在包中有多少數(shù)據(jù),8位有符號(hào)整數(shù)類型的前4位,傳感器i數(shù)據(jù)類型表明該傳感器的數(shù)據(jù)的類型,8位有符號(hào)整數(shù)類型后4位,傳感器數(shù)據(jù)個(gè)數(shù)和數(shù)據(jù)類型組成一個(gè)8位無(wú)符號(hào)整數(shù)類型。包編號(hào)、幀數(shù)、幀序號(hào)在數(shù)據(jù)包的每個(gè)包都存在,傳感器i的數(shù)據(jù)個(gè)數(shù)、類型和頭結(jié)束,僅在第一幀包含。幀數(shù)據(jù)的頭文件數(shù)據(jù)長(zhǎng)度為:H=16(包編號(hào))+8(幀)+8(傳感器個(gè)數(shù)n)+n×8=32+n×8。
表2 幀數(shù)據(jù)的頭文件
完整的數(shù)據(jù)包信息包括頭文件、基本數(shù)據(jù)、傳感器數(shù)據(jù),因此數(shù)據(jù)長(zhǎng)度計(jì)算方法如式(2)。
L=H+B+S
(2)
式中:L為數(shù)據(jù)包的位數(shù);H為頭文件數(shù)據(jù)的位數(shù);B為基本數(shù)據(jù)的位數(shù);S為各傳感器的總共位數(shù)。把H、B、S帶入式(2)得到式(3)。
(3)
每個(gè)幀都有頭文件,假設(shè)通信衛(wèi)星一次傳輸數(shù)據(jù)量為N位bit,則一個(gè)包需要傳輸?shù)膸瑪?shù)計(jì)算方法如式(4)。
(4)
式中:F為幀數(shù);N為衛(wèi)星一次傳輸數(shù)據(jù)的位數(shù);n為傳感器個(gè)數(shù);ni為第i個(gè)傳感器的數(shù)據(jù)個(gè)數(shù);ti為ni傳感器的數(shù)據(jù)類型位數(shù)。
船載終端通過(guò)發(fā)送命令控制浮標(biāo)終端,主要控制命令包括設(shè)置傳感器、時(shí)間同步、時(shí)間間隔、立刻返回?cái)?shù)據(jù)(表3)。設(shè)置傳感器格式為“n:sensori,num,type;”n是傳感器數(shù),sensori是傳感器號(hào),num是數(shù)據(jù)個(gè)數(shù),type是數(shù)據(jù)類型。例如“3:1,3,9;2,1,9;3,5,2”表示3個(gè)傳感器,1號(hào)傳感器3個(gè)數(shù)據(jù),數(shù)據(jù)類型為32位單精度浮點(diǎn)型;2號(hào)傳感器有1個(gè)數(shù)據(jù),數(shù)據(jù)類型為32位單精度浮點(diǎn)型;3號(hào)傳感器有5個(gè)數(shù)據(jù),數(shù)據(jù)類型為16位無(wú)符號(hào)整數(shù)類型。時(shí)間同步格式為“yyyy-MM-dd HH:mm:ss”,表示年月日時(shí)分秒。時(shí)間間隔為浮標(biāo)終端發(fā)送數(shù)據(jù)的時(shí)間間隔,通過(guò)命令設(shè)置間隔的分鐘數(shù)。立刻返回?cái)?shù)據(jù)為命令浮標(biāo)終端立即發(fā)回?cái)?shù)據(jù)。
表3 浮標(biāo)終端的主要控制命令
船載終端(圖2)定義了主窗體類、串口測(cè)試類、命令控制類、數(shù)據(jù)瀏覽類,以及后臺(tái)運(yùn)行的串口數(shù)據(jù)接收類、數(shù)據(jù)回發(fā)類、清理回發(fā)類、清理包類。實(shí)例化的主窗體界面是用戶交互界面,主要窗體上有串口測(cè)試、命令控制、數(shù)據(jù)瀏覽。
串口測(cè)試完成端口、波特率、數(shù)據(jù)位、校驗(yàn)位、停止位的設(shè)置,運(yùn)行測(cè)試端口返回可用的端口信息,運(yùn)行打開串口完成串口開啟,再運(yùn)行數(shù)據(jù)接收,啟動(dòng)臺(tái)程序。命令控制在完成浮標(biāo)號(hào)選擇、命令名稱選擇、參數(shù)設(shè)置后,運(yùn)行發(fā)送命令,實(shí)現(xiàn)命令的發(fā)送功能。數(shù)據(jù)瀏覽在完成浮標(biāo)卡號(hào)選擇,時(shí)間范圍設(shè)置,然后運(yùn)行查詢功能,獲取對(duì)應(yīng)浮標(biāo)的數(shù)據(jù),運(yùn)行導(dǎo)出功能可以導(dǎo)出查詢到的數(shù)據(jù)。
浮標(biāo)終端發(fā)回的數(shù)據(jù)由ReadCom對(duì)象完成(圖3),在初始化時(shí)首先實(shí)例化ReadCom對(duì)象,傳入的參數(shù)有信息回發(fā)隊(duì)列、串口實(shí)例和數(shù)據(jù)包管理表。
回發(fā)隊(duì)列用于暫存接收到的數(shù)據(jù)包信息,這些信息會(huì)向浮標(biāo)終端回復(fù)數(shù)據(jù)包收到,串口實(shí)例用于監(jiān)聽浮標(biāo)終端發(fā)來(lái)的數(shù)據(jù),數(shù)據(jù)包管理表用于管理接收的報(bào)包數(shù)據(jù),如果首次收到包則保存在表中,如果非首次接收則忽略。實(shí)例化的ReamCom通過(guò)串口監(jiān)聽浮標(biāo)終端發(fā)來(lái)的數(shù)據(jù),當(dāng)有數(shù)據(jù)收后觸發(fā)Comm_DataReceived事件,首先創(chuàng)建接收的包信息,保存到數(shù)據(jù)庫(kù)中,然后處理數(shù)據(jù)包,讀取數(shù)據(jù)幀,判斷數(shù)據(jù)幀是否接收完整,如果沒有接收完整則不做處理,如果數(shù)據(jù)幀接收完整,則拼接數(shù)據(jù)包進(jìn)行解析,解析完成后返回到處理數(shù)據(jù)包方法,存儲(chǔ)包文件,并把信息存儲(chǔ)到數(shù)據(jù)庫(kù),最后把解析處理完成的包從數(shù)據(jù)包管理表中清除。
船載終端接收的數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,用GetBeidou窗體類實(shí)例化對(duì)象(圖8),在窗體中設(shè)置時(shí)間范圍、浮標(biāo)卡號(hào)、數(shù)據(jù)類型等信息,運(yùn)行SearchGet方法,由實(shí)例化的SqliteHelper對(duì)象獲取數(shù)據(jù),然后返回到窗體顯示,數(shù)據(jù)也可以導(dǎo)出。
首先,把信息回發(fā)類(SendBack)實(shí)例化為對(duì)象(圖4),完成接收包的回發(fā)和控制命令的回發(fā)。其次,用數(shù)據(jù)包回發(fā)隊(duì)列暫存所接收包的信息,船載終端向浮標(biāo)終端發(fā)送包信息,通知浮標(biāo)終端包已經(jīng)成功接收,浮標(biāo)終端就不再重發(fā)。命令隊(duì)列暫存控制命令,命令是由BeidouCmm實(shí)例化的對(duì)象生成,通過(guò)船載終端向浮標(biāo)終端發(fā)送命令,控制浮標(biāo)的工作。
BeidouCmm為生成命令的窗體對(duì)象,在選擇好命令,設(shè)置好參數(shù)后,運(yùn)行命名發(fā)送功能,命令首先通過(guò)實(shí)例化的SQLiteHelper對(duì)象報(bào)道數(shù)據(jù)庫(kù)中,然后經(jīng)過(guò)創(chuàng)建命令、命令編碼后,暫存到SendBack實(shí)例的回發(fā)消息隊(duì)列中。
數(shù)據(jù)回發(fā)類中定義有時(shí)鐘實(shí)例,設(shè)置一定的時(shí)間間隔后,時(shí)鐘定時(shí)觸發(fā)OnTimer事件,查詢命令隊(duì)列中是否有沒有發(fā)出的命令,如果有則取出命令并向浮標(biāo)終端發(fā)送,發(fā)送結(jié)束后在隊(duì)列中刪除命令。然后再檢查數(shù)據(jù)包回發(fā)隊(duì)列,如果隊(duì)列中有未發(fā)的數(shù)據(jù)包消息,則把消息向浮標(biāo)終端發(fā)送,然后在隊(duì)列中刪除該包信息。
船載終端以包的形式接收浮標(biāo)終端數(shù)據(jù),每個(gè)包采用編碼管理,數(shù)據(jù)包以編碼方式保存在數(shù)據(jù)包管理表中,數(shù)據(jù)包各幀都接收到后會(huì)被解析保存到數(shù)據(jù)庫(kù),并在包管理表中刪除該包;如果數(shù)據(jù)包中的幀不能全部接收到,則數(shù)據(jù)包一直保存在包管理表中,隨著接收時(shí)間延長(zhǎng)(1個(gè)月以上)積累包增多,占用大量?jī)?nèi)存,由于包發(fā)送一般限制在1 h到1 d內(nèi)發(fā)送完成,如果超過(guò)1 d沒有收到則該包失效,因此限時(shí)1 d對(duì)包管理表中超過(guò)1 d的包進(jìn)行清除。
船載終端接收到包后會(huì)把回復(fù)信息和控制命令信息暫存到回發(fā)隊(duì)列,終端定時(shí)自動(dòng)讀取回發(fā)隊(duì)列中的信息,向浮標(biāo)終端發(fā)送,發(fā)送完成后從隊(duì)列中清除該消息。消息發(fā)送一般限制在1 min到1 h發(fā)送完成,如果發(fā)送失敗則信息會(huì)留在回發(fā)隊(duì)列中,隨著接收時(shí)間延長(zhǎng)(1個(gè)月以上)積累包增多,占用內(nèi)存,因此限時(shí)1 d對(duì)隊(duì)列中超過(guò)1 d的消息進(jìn)行清除。
船載終端同時(shí)控制和接收多個(gè)浮標(biāo)終端,因此在時(shí)間較長(zhǎng)的情況下(1個(gè)月以上),包管理表中出現(xiàn)的無(wú)效數(shù)據(jù)包,以及回發(fā)隊(duì)列中的無(wú)效包回發(fā)信息、命令控制信息會(huì)更多,因此采用清除包和回發(fā)信息非常重要。包清除類(圖5a)、回發(fā)信息和控制命令類(圖5b)完成清除,實(shí)例化的包清除對(duì)象在指定時(shí)間觸發(fā)OnTimeClearBaoEvent事件清除數(shù)據(jù)包管理表的無(wú)效信息,處理過(guò)程保存在日志中。實(shí)例化的回發(fā)清除對(duì)象在指定時(shí)間觸發(fā)OnTimeClearSendBackEvent事件清除包信息回發(fā)隊(duì)列和命令發(fā)送隊(duì)列的無(wú)效信息,處理過(guò)程保存在日志中。
海洋浮標(biāo)數(shù)據(jù)接收與控制終端軟件部署在戴爾Latitude E6500測(cè)試機(jī)上,通過(guò)測(cè)試機(jī)連接串口接收數(shù)據(jù)。2020年6月3日到6月9日,進(jìn)行5組數(shù)據(jù)收發(fā)試驗(yàn)。單幀數(shù)據(jù)以1包1幀方式發(fā)送,累計(jì)發(fā)送186條,成功176條,成功率94.6%,各組接收成功率都在90%以上;多幀數(shù)據(jù)以1包3幀的方式發(fā)送,累計(jì)發(fā)送95條,成功接收到86條,成功率90.5%,除第5組接收成功率較低外,其他各組成功率都在90%以上。浮標(biāo)控制命令以多次發(fā)送直到浮標(biāo)端確認(rèn)收到為止的形式執(zhí)行程序,保證命令發(fā)送成功,共測(cè)試了74條控制命令浮標(biāo)端都能成功接收。
表4 浮標(biāo)數(shù)據(jù)接收測(cè)試
北斗衛(wèi)星導(dǎo)航系統(tǒng)是中國(guó)自主研制的全球衛(wèi)星定位與通信系統(tǒng),已經(jīng)完成全球組網(wǎng),可在全球范圍內(nèi)全天候、全天時(shí)為用戶提供高精度、高可靠定位、導(dǎo)航、授時(shí)服務(wù),并具有短報(bào)文通信功能。北斗海洋漁探浮標(biāo)利用太陽(yáng)能供電,通過(guò)北斗定位與短報(bào)文通信,采用面向?qū)ο蟮脑O(shè)計(jì)方法,以北斗通信方式實(shí)現(xiàn)數(shù)據(jù)接收與海洋浮標(biāo)控制。為解決短消息的數(shù)據(jù)量限制,傳感器數(shù)據(jù)采用分解包為多幀傳輸。終端軟件采用多線程,通過(guò)哈希表管理接收數(shù)據(jù),隊(duì)列管理回發(fā)的信息和控制命令。浮標(biāo)有溫度、鹽度、pH、聲吶等多個(gè)傳感器收集海洋物理參數(shù),可應(yīng)用于漁場(chǎng)尋找、資源調(diào)查等,為漁業(yè)生產(chǎn)和科學(xué)研究提供服務(wù)。
□