张胜茂,戴 阳,杨胜龙,范秀梅,王 斐
(1 中国水产科学研究院东海水产研究所,农业农村部东海渔业资源开发利用重点实验室,上海 200090;2中国水产科学研究院东海水产研究所,农业农村部远洋与极地渔业创新重点实验室,上海200090)
海洋浮标一般可携带多种传感器来探测海洋环境参数,是一种重要的海洋观测工具[1-4]。具有全天候、全天时稳定可靠的收集海洋环境资料的能力[5-6],并能实现数据的自动采集、自动标识和发送[7-9]。海洋浮标种类繁多,主要有锚定类型浮标和漂流类型浮标[10-11],用途包括气象资料收集、海水水质监测、船舶导航、重要设施标识等[12-15]。近年来,随着声呐设备的小型化,海洋浮标也可携带鱼探仪器辅助海洋捕捞[16-19]。海洋浮标的通信方式多样,主要包括卫星通信、移动网络通信、北斗短报文等[20]。海事卫星、铱星等通信方式快捷但费用高[21-23],而移动通信网络适合在近海浮标上使用,海洋浮标采集的环境数据多为海洋物理参数,采用北斗短报文方式通信费用低,传输次数限制小,因此适合作为海洋浮标的数据通信方式。
海洋捕捞是人类海洋开发史上最古老的产业之一[24],因鱼类资源时空变化大[25-26],快速确定渔场位置在渔业捕捞中尤为重要,寻找渔场手段包括船长经验、人员观测、多船分散探捕等[27],以及运用卫星遥感技术预报渔场[28-30]。海洋浮标可以携带声呐设备,通过太阳能供电可以长期工作,并且体积小成本低[31],渔船在作业海域可以布放多个浮标来探测鱼群,成为快速定位渔场有效手段。
本研究利用面向对象的设计方法,采用北斗通信方式实现数据接收与海洋浮标控制。受短消息的数据量限制,传感器数据采用分解包为多帧方式传输,终端软件采用多线程,通过哈希表管理接收数据,队列管理回发的信息和控制命令。渔船上部署海洋浮标数据收发控制的船载终端可直接获取浮标数据,服务于渔场寻找。
北斗海洋浮标是一种漂浮在海上的浮标终端,利用太阳能电池板供电,通过挂载的多个传感器收集海洋物理参数,如温度、盐度、pH、声呐等。船载终端部署在船上,通过船上的发电设备供电,控制卫星海洋浮标数据的收发。浮标终端和船载终端都装有卫星通信卡,通过通信卫星完成两者之间的数据收发与控制(图1)。浮标终端挂载的传感器分别为传感器1、传感器2、…、传感器n,通过下位机读取海洋物理参数。船载终端由上位机发送控制命令和接收数据,接收的数据保存在数据库中,通过终端能够查询。
上位机和下位机间的数据类型固定不变,共有11种数据类型,包括无符号整数(8位、16位、32位、64位)、有符号整数(8位、16位、32位、64位)、浮点数(32位、64位)、128位精确的十进制值。浮标终端发送的基本信息固定(表1),包括浮标卡号(32位无符号整数类型)、时间(32位无符号整数类型)、经度(32位单精度浮点型)、纬度(32位单精度浮点型)、航速(8位无符号整数)、航向(16位无符号整数)。浮标基本信息数据长度为:B=32(浮标卡号)+32(时间)+32(经度)+32(纬度)+8(航速)+16(航向)+16(电压)=168(bit)。
表1 浮标数据基本信息
浮标卡号取值范围0到4 294 967 295,卡号不多于9位;时间为2000年起算的秒数,上位机接收到数据后,在2000年基础上加上秒数来计算时间;经纬度类型都为单精度浮点型,经度范围-180°~180°,纬度范围-90°~90°;航速为8位无符号整数,取值范围为0到255,除以10后范围为0~25.5 m/s;航向为16位无符号整数类型,采用方位角表达,范围为0~259。浮标终端传感器有多个,各传感器位数总和为传感器的数据长度。
(1)
式中:S为各传感器的总位数;ni为第i个传感器的数据个数;ti为ni传感器的数据类型位数,两者乘积为第i个传感器数据的位数。
浮标基本数据和传感器数据合并后向船载终端发送,一般会超过通信卫星一条短消息的长度,因此,将向船载终端发送的完整数据作为一个包,把包划分为多帧,多次发送。船载终端接收到全部帧后,再把帧拼接为包,然后进行解译。
数据包由多个帧组成,每帧有一个头文件(表2),头文件中包含包编号、帧数、帧序号、传感器i数据个数、传感器i数据类型。包的一组帧的包编号相同,每月开始从1起始编号,编号用该月起始的分钟数,到该月最后一分钟位置,编号范围从1到44 640的值。帧数是包的一组帧的总数,8位有符号整数类型的前4位,帧序号是帧在一组帧的顺序号,8位有符号整数类型后4位,帧数和帧序号组成一个8位无符号整数类型,只有各帧全部接收并且按顺序拼接才能正确解译数据。传感器i数据个数表明该传感器在包中有多少数据,8位有符号整数类型的前4位,传感器i数据类型表明该传感器的数据的类型,8位有符号整数类型后4位,传感器数据个数和数据类型组成一个8位无符号整数类型。包编号、帧数、帧序号在数据包的每个包都存在,传感器i的数据个数、类型和头结束,仅在第一帧包含。帧数据的头文件数据长度为:H=16(包编号)+8(帧)+8(传感器个数n)+n×8=32+n×8。
表2 帧数据的头文件
完整的数据包信息包括头文件、基本数据、传感器数据,因此数据长度计算方法如式(2)。
L=H+B+S
(2)
式中:L为数据包的位数;H为头文件数据的位数;B为基本数据的位数;S为各传感器的总共位数。把H、B、S带入式(2)得到式(3)。
(3)
每个帧都有头文件,假设通信卫星一次传输数据量为N位bit,则一个包需要传输的帧数计算方法如式(4)。
(4)
式中:F为帧数;N为卫星一次传输数据的位数;n为传感器个数;ni为第i个传感器的数据个数;ti为ni传感器的数据类型位数。
船载终端通过发送命令控制浮标终端,主要控制命令包括设置传感器、时间同步、时间间隔、立刻返回数据(表3)。设置传感器格式为“n:sensori,num,type;”n是传感器数,sensori是传感器号,num是数据个数,type是数据类型。例如“3:1,3,9;2,1,9;3,5,2”表示3个传感器,1号传感器3个数据,数据类型为32位单精度浮点型;2号传感器有1个数据,数据类型为32位单精度浮点型;3号传感器有5个数据,数据类型为16位无符号整数类型。时间同步格式为“yyyy-MM-dd HH:mm:ss”,表示年月日时分秒。时间间隔为浮标终端发送数据的时间间隔,通过命令设置间隔的分钟数。立刻返回数据为命令浮标终端立即发回数据。
表3 浮标终端的主要控制命令
船载终端(图2)定义了主窗体类、串口测试类、命令控制类、数据浏览类,以及后台运行的串口数据接收类、数据回发类、清理回发类、清理包类。实例化的主窗体界面是用户交互界面,主要窗体上有串口测试、命令控制、数据浏览。
串口测试完成端口、波特率、数据位、校验位、停止位的设置,运行测试端口返回可用的端口信息,运行打开串口完成串口开启,再运行数据接收,启动台程序。命令控制在完成浮标号选择、命令名称选择、参数设置后,运行发送命令,实现命令的发送功能。数据浏览在完成浮标卡号选择,时间范围设置,然后运行查询功能,获取对应浮标的数据,运行导出功能可以导出查询到的数据。
浮标终端发回的数据由ReadCom对象完成(图3),在初始化时首先实例化ReadCom对象,传入的参数有信息回发队列、串口实例和数据包管理表。
回发队列用于暂存接收到的数据包信息,这些信息会向浮标终端回复数据包收到,串口实例用于监听浮标终端发来的数据,数据包管理表用于管理接收的报包数据,如果首次收到包则保存在表中,如果非首次接收则忽略。实例化的ReamCom通过串口监听浮标终端发来的数据,当有数据收后触发Comm_DataReceived事件,首先创建接收的包信息,保存到数据库中,然后处理数据包,读取数据帧,判断数据帧是否接收完整,如果没有接收完整则不做处理,如果数据帧接收完整,则拼接数据包进行解析,解析完成后返回到处理数据包方法,存储包文件,并把信息存储到数据库,最后把解析处理完成的包从数据包管理表中清除。
船载终端接收的数据存储在数据库中,用GetBeidou窗体类实例化对象(图8),在窗体中设置时间范围、浮标卡号、数据类型等信息,运行SearchGet方法,由实例化的SqliteHelper对象获取数据,然后返回到窗体显示,数据也可以导出。
首先,把信息回发类(SendBack)实例化为对象(图4),完成接收包的回发和控制命令的回发。其次,用数据包回发队列暂存所接收包的信息,船载终端向浮标终端发送包信息,通知浮标终端包已经成功接收,浮标终端就不再重发。命令队列暂存控制命令,命令是由BeidouCmm实例化的对象生成,通过船载终端向浮标终端发送命令,控制浮标的工作。
BeidouCmm为生成命令的窗体对象,在选择好命令,设置好参数后,运行命名发送功能,命令首先通过实例化的SQLiteHelper对象报道数据库中,然后经过创建命令、命令编码后,暂存到SendBack实例的回发消息队列中。
数据回发类中定义有时钟实例,设置一定的时间间隔后,时钟定时触发OnTimer事件,查询命令队列中是否有没有发出的命令,如果有则取出命令并向浮标终端发送,发送结束后在队列中删除命令。然后再检查数据包回发队列,如果队列中有未发的数据包消息,则把消息向浮标终端发送,然后在队列中删除该包信息。
船载终端以包的形式接收浮标终端数据,每个包采用编码管理,数据包以编码方式保存在数据包管理表中,数据包各帧都接收到后会被解析保存到数据库,并在包管理表中删除该包;如果数据包中的帧不能全部接收到,则数据包一直保存在包管理表中,随着接收时间延长(1个月以上)积累包增多,占用大量内存,由于包发送一般限制在1 h到1 d内发送完成,如果超过1 d没有收到则该包失效,因此限时1 d对包管理表中超过1 d的包进行清除。
船载终端接收到包后会把回复信息和控制命令信息暂存到回发队列,终端定时自动读取回发队列中的信息,向浮标终端发送,发送完成后从队列中清除该消息。消息发送一般限制在1 min到1 h发送完成,如果发送失败则信息会留在回发队列中,随着接收时间延长(1个月以上)积累包增多,占用内存,因此限时1 d对队列中超过1 d的消息进行清除。
船载终端同时控制和接收多个浮标终端,因此在时间较长的情况下(1个月以上),包管理表中出现的无效数据包,以及回发队列中的无效包回发信息、命令控制信息会更多,因此采用清除包和回发信息非常重要。包清除类(图5a)、回发信息和控制命令类(图5b)完成清除,实例化的包清除对象在指定时间触发OnTimeClearBaoEvent事件清除数据包管理表的无效信息,处理过程保存在日志中。实例化的回发清除对象在指定时间触发OnTimeClearSendBackEvent事件清除包信息回发队列和命令发送队列的无效信息,处理过程保存在日志中。
海洋浮标数据接收与控制终端软件部署在戴尔Latitude E6500测试机上,通过测试机连接串口接收数据。2020年6月3日到6月9日,进行5组数据收发试验。单帧数据以1包1帧方式发送,累计发送186条,成功176条,成功率94.6%,各组接收成功率都在90%以上;多帧数据以1包3帧的方式发送,累计发送95条,成功接收到86条,成功率90.5%,除第5组接收成功率较低外,其他各组成功率都在90%以上。浮标控制命令以多次发送直到浮标端确认收到为止的形式执行程序,保证命令发送成功,共测试了74条控制命令浮标端都能成功接收。
表4 浮标数据接收测试
北斗卫星导航系统是中国自主研制的全球卫星定位与通信系统,已经完成全球组网,可在全球范围内全天候、全天时为用户提供高精度、高可靠定位、导航、授时服务,并具有短报文通信功能。北斗海洋渔探浮标利用太阳能供电,通过北斗定位与短报文通信,采用面向对象的设计方法,以北斗通信方式实现数据接收与海洋浮标控制。为解决短消息的数据量限制,传感器数据采用分解包为多帧传输。终端软件采用多线程,通过哈希表管理接收数据,队列管理回发的信息和控制命令。浮标有温度、盐度、pH、声呐等多个传感器收集海洋物理参数,可应用于渔场寻找、资源调查等,为渔业生产和科学研究提供服务。
□