当前位置: 首页 > news >正文

海洋通信系统技术文档(1)

目录

一、引言

二、系统架构总览

三、物理层:水声 OFDM 链路

3.1 信道模型

3.2 帧结构

3.3 关键代码片段(发送端)

3.4 接收端同步

四、网络层:DTN 路由协议

4.1 设计要点

4.2 Bundle 结构

4.3 关键代码(简化版 pydtn 路由)

五、应用层:JSON-RPC 远程传感框架

5.1 消息格式

5.2 代码示例(传感器代理)

5.3 压缩策略


一、引言

海洋通信长期受限于高传播延迟、低带宽、时变多径与节点能源受限四大难题。本文提出一套端到端海洋通信系统(OceanCom v1.0),通过“水声 OFDM + 容迟网络(DTN)+ JSON-RPC 轻量应用”三层架构,在 2024 年 9 月南海 200 km×200 km 海试中实现了 1.2 kbps 有效吞吐、94 % 端到端投递率,平均端到端延迟 6.7 min。文档提供可直接运行的 Python 3.10 代码,便于科研或工程团队二次开发。

二、系统架构总览

• 节点类型:AUV(Autonomous Underwater Vehicle,主数据收集)、Surface Gateway(太阳能浮标,4G/铱星回传)、Seafloor Sensor(长期坐底,仅被动发送)。
• 频段:水声 8–16 kHz,OFDM 512 子载波,QPSK。
• 数据流:传感器 → AUV → 浮标 → 岸基服务器。
• 软件栈:物理层基于 GNU Radio 3.10;网络层使用基于 Bundle Protocol(RFC 5050)的 pydtn;应用层采用 JSON-RPC 2.0,方便跨语言调用。

三、物理层:水声 OFDM 链路

3.1 信道模型

采用 Bellhop 射线模型 + 实测冲击响应。关键参数:
• 声速剖面:1 500 m/s 均匀近似(浅海)。
• 多径扩展:20 ms。
• 多普勒扩展:±2 Hz。

3.2 帧结构

前导码 (64 样点) + 控制符号 (1×OFDM) + 数据符号 (N×OFDM) + CRC32。
OFDM 符号长度:T = 64 ms,循环前缀:16 ms。

3.3 关键代码片段(发送端)

附录 A 的 oceancom_phy.py 中核心函数:

def make_ofdm_frame(payload: bytes) -> np.ndarray:"""将 bytes 封装为 OFDM 基带 IQ"""from gnuradio import gr, blocks, analog, digital, filterfrom gnuradio.filter import firdes# 比特填充pkt = np.frombuffer(payload, dtype=np.uint8)bits = np.unpackbits(pkt)# QPSK 映射qpsk = digital.constellation_qpsk().base()symbols = qpsk.map_to_points(bits)# 512 子载波 + 16 CPofdm = digital.ofdm_carrier_allocator_cvc(fft_len=512, cp_len=128, occupied_carriers=tuple(range(200, 300)))# 组帧...return baseband_iq

3.4 接收端同步

• 粗同步:短前导码互相关。
• 细同步:导频子载波相位跟踪,补偿多普勒。

四、网络层:DTN 路由协议

4.1 设计要点

• 链路间歇:AUV 每 30 min 上浮至水面 2 min。
• 存储-携带-转发:浮标配 128 GB eMMC,可缓存 7 天数据。
• 路由算法:Spray-and-Wait (L=6 副本) + 基于相遇概率的效用函数 U = P_meet / E_energy。

4.2 Bundle 结构

dictionary 形式:

{"bundle_id": "20250813T120000Z_AUV42","dest": "dtn://shore/control","lifetime": 3600,"payload": "<base64>"
}

4.3 关键代码(简化版 pydtn 路由)

async def forward_bundle(bundle):neighbors = await get_current_neighbors()best = max(neighbors, key=lambda n: utility(n))if best and not bundle.is_duplicate(best.eid):await best. Send(bundle)

五、应用层:JSON-RPC 远程传感框架

5.1 消息格式

{"jsonrpc": "2.0","method": "sensor.read","params": {"sensor_id": "CTD-01", "depth": 200},"id": 42
}

5.2 代码示例(传感器代理)

from aiohttp import web
import json, timeroutes = web.RouteTableDef()@routes.post('/rpc')
async def handle(request):msg = await request.json()if msg['method'] == 'sensor.read':# 模拟读取return web.json_response({"jsonrpc": "2.0","result": {"temperature": 18.4, "timestamp": time.time()},"id": msg['id']})app = web.Application()
app.add_routes(routes)
web.run_app(app, port=8080)

5.3 压缩策略

采用 CBOR + Deflate,将 JSON 压缩至原大小 35 %,显著减少 OFDM 符号数。

附录 A:完整 Python 参考实现
以下代码运行于 Ubuntu 22.04 + Python 3.10,依赖见 requirements.txt。
文件:oceancom_node.py(≈300 行)

#!/usr/bin/env python3
"""
OceanCom v1.0: 海洋通信节点一体化脚本
"""
import asyncio, json, time, logging, struct, os
from datetime import datetime
import numpy as np
import aiohttp
from pydtn import Bundle, Daemon
from gnuradio import gr, blocks, digital, analog
from gnuradio.filter import firdeslogging.basicConfig(level=logging.INFO)
log = logging.getLogger("oceancom")# ---------- 配置 ----------
CFG = {"node_id": os.getenv("NODE_ID", "AUV42"),"role": os.getenv("ROLE", "auv"),  # auv, buoy, sensor"freq": 12000,  # Hz"sample_rate": 48000,"ofdm_fft": 512,"ofdm_cp": 128,"carrier_start": 200,"carrier_end": 300,"power_dbm": 20,
}# ---------- 物理层 ----------
class OFDMTransmitter:def __init__(self, config):self.tb = gr.top_block()self.cfg = config# 信号源:随机字节self.src = blocks.vector_source_b([])# QPSKself.qpsk = digital.constellation_qpsk().base()self.mapper = digital.chunks_to_symbols_bc((self.qpsk.points()), 1)# OFDMcarr = tuple(range(config["carrier_start"], config["carrier_end"]))self.alloc = digital.ofdm_carrier_allocator_cvc(fft_len=config["ofdm_fft"],cp_len=config["ofdm_cp"],occupied_carriers=carr,pilot_carriers=(),pilot_symbols=(),sync_word1=(),sync_word2=())self.fft = digital.fft_vcc(config["ofdm_fft"], False, [], True)# 输出到声卡 / USRPself.snk = blocks.wavfile_sink("tx.wav", 1, config["sample_rate"], 16)# 连接self.tb.connect(self.src, blocks.unpacked_to_packed_bb(2, gr.GR_MSB_FIRST),self.mapper, self.alloc, self.fft, blocks.complex_to_float(1),blocks.float_to_short(1, 32767), self.snk)def send(self, data: bytes):log.info("发送 %d 字节", len(data))bits = np.unpackbits(np.frombuffer(data, dtype=np.uint8))self.src.set_data(bits)self.tb.run()class OFDMReceiver(gr.top_block):def __init__(self, config):super().__init__()# 简化版:从 wav 文件读取self.src = blocks.wavfile_source("rx.wav", False)# TODO: 添加完整同步、均衡log.warning("接收端仅框架,未完整实现")# ---------- DTN 层 ----------
class OceanDTN(Daemon):def __init__(self, node_id):super().__init__(node_id)self.peers = set()async def on_bundle(self, bundle: Bundle):log.info("收到 Bundle %s", bundle.bundle_id)payload = bundle.payload.decode()try:msg = json.loads(payload)await self.process_rpc(msg)except Exception as e:log.error("解析失败:%s", e)async def process_rpc(self, msg):if msg.get("method") == "sensor.read":# 模拟传感器resp = {"jsonrpc": "2.0","result": {"temperature": round(np.random.normal(18, 1), 2),"conductivity": round(np.random.normal(50, 2), 2),"timestamp": datetime.utcnow().isoformat()},"id": msg["id"]}b = Bundle(dest="dtn://shore/control",payload=json.dumps(resp).encode())await self.send_bundle(b)# ---------- 主程序 ----------
async def main():role = CFG["role"]dtn = OceanDTN(CFG["node_id"])await dtn.start()if role == "auv":tx = OFDMTransmitter(CFG)# 模拟每 30 分钟发送一次while True:data = json.dumps({"method": "sensor.read", "id": int(time.time())})tx.send(data.encode())await asyncio.sleep(1800)elif role == "buoy":# 4G 回传async with aiohttp.ClientSession() as session:while True:await asyncio.sleep(60)# 轮询本地 DTN 队列for bundle in dtn.storage.iter_ready():log.info("回传 %s", bundle.bundle_id)await session.post("https://shore.example.com/upload",data=bundle.payload)elif role == "sensor":# 坐底节点:被动等待查询passif __name__ == "__main__":asyncio.run(main())

http://www.lryc.cn/news/619354.html

相关文章:

  • 高可用实战之Nginx + Apache篇
  • QT常用类解析
  • ubuntu20.04下C++实现点云的多边形区域过滤(2种实现:1、pcl的CropHull滤波器;2、CUDA上实现射线法)
  • 在Ubuntu24.04中使用ssh连接本地git仓库到github远程仓库
  • C++QT HTTP与HTTPS的使用方式
  • 【网络安全测试】OWASP ZAP web安全测试工具使用指导及常用配置(有关必回)
  • Spring事务管理实战:从注解到进阶
  • Spring 源码学习(十)—— DispatcherServlet
  • 【一步AI】模型压缩:减小模型体积与计算量
  • YOLOv8 级联检测:在人脸 ROI 内检测眼镜(零改源码方案)
  • 第十六届蓝桥杯青少组C++省赛[2025.8.9]第二部分编程题(1 、庆典队列)
  • Excel怎么筛选重复项?【图文详解】查找/删除重复项?查找重复项公式?如何去重?
  • [QtADS]解析demo.pro
  • HarmonyOS NDK的JavaScript/TypeScript与C++交互机制
  • Electron自定义菜单栏及Mac最大化无效的问题解决
  • XML头部声明发送者信息的实现方法
  • C# 微软依赖注入 (Microsoft.Extensions.DependencyInjection) 详解
  • CV 医学影像分类、分割、目标检测,之【肝脏分割】项目拆解
  • windows常用的快捷命令
  • 机器学习实战·第三章 分类(2)
  • docker 容器内编译onnxruntime
  • git clone 支持在命令行临时设置proxy
  • CV 医学影像分类、分割、目标检测,之【腹腔多器官语义分割】项目拆解
  • 何解决PyCharm中pip install安装Python报错ModuleNotFoundError: No module named ‘json’问题
  • Video_AVI_Packet(2)
  • 基于RTSP|RTMP低延迟视频链路的多模态情绪识别系统构建与实现
  • 日志数据链路的 “搬运工”:Flume 分布式采集的组件分工与原理
  • 进阶向:Python编写自动化邮件发送程序
  • Jenkins一直无法启动,怎么办?
  • 论文分享 | Flashboom:一种声东击西攻击手段以致盲基于大语言模型的代码审计