使用Unetstack向远程调制解调器发送文件失败问题排查
问题排查与解决建议
以下是导致脚本超时无响应的核心问题及对应解决方法:
混淆文件路径归属:
RemoteFilePutReq的filename参数指向本地Unet网关节点上的文件路径,而非运行Python脚本的本地电脑文件。若文件在本地电脑,需先上传到网关再发起远程传输:# 先把本地文件上传到网关 with open(file_name, 'rb') as f: file_data = f.read() put_req = FilePutReq(filename=file_name, data=file_data) put_resp = gw.request(put_req, 5000) if not (put_resp and put_resp.success): print("文件上传到网关失败") sys.exit(1)超时时间设置过短:水下通信带宽有限,文件传输所需时间远长于普通指令。将
timeout参数调整为更大的值,比如60000(60秒),根据文件大小和链路带宽灵活调整。链路连通性问题:先验证本地网关与远程节点的基础连通性,发送Ping请求测试:
ping_resp = gw.request(PingReq(to=node), 5000) if ping_resp is None: print("本地网关与远程节点链路不通,请排查节点通信范围或路由配置") sys.exit(1)远程文件传输服务未启用:确认网关节点上的
RemoteFileTransferService已启动,可通过以下代码检查:rfts = gw.agentForService("RemoteFileTransferService") if rfts is None: print("网关节点未启用RemoteFileTransferService,请先启用该服务") sys.exit(1)目标节点地址格式错误:若远程节点ID并非整数类型(部分设备使用字符串地址),脚本中
int(sys.argv[3])的转换会导致地址不匹配,需根据实际节点ID格式调整参数类型。
修正后的完整脚本示例
from unetpy import * import sys if len(sys.argv) != 6: print("Usage: python3 ac_sender.py <source_ip_address> <port> <destination_address> <timeout(ms)> <filename>") sys.exit(1) ip_address = sys.argv[1] port = int(sys.argv[2]) node = sys.argv[3] # 若节点ID是字符串则无需转int timeout = int(sys.argv[4]) file_name = sys.argv[5] sock = UnetSocket(ip_address, port) gw = sock.getGateway() # 检查远程文件传输服务是否可用 rfts = gw.agentForService("RemoteFileTransferService") if rfts is None: print("错误:网关未启用RemoteFileTransferService") sock.close() sys.exit(1) # 测试链路连通性 ping_resp = gw.request(PingReq(to=node), 5000) if ping_resp is None: print("错误:无法连接到目标节点,请排查链路") sock.close() sys.exit(1) # 上传本地文件到网关 try: with open(file_name, 'rb') as f: file_data = f.read() except FileNotFoundError: print(f"错误:本地文件 {file_name} 不存在") sock.close() sys.exit(1) put_req = FilePutReq(filename=file_name, data=file_data) put_resp = gw.request(put_req, 5000) if not (put_resp and put_resp.success): print("错误:文件上传到网关失败") sock.close() sys.exit(1) # 发起远程文件传输 req = RemoteFilePutReq(to=node, filename=file_name) resp = gw.request(req, timeout) print(f"传输结果: {resp}") sock.close()
内容的提问来源于stack exchange,提问作者Guilherme Moreira
相关产品推荐
相关产品推荐

