DatagramSocket 与 移动物联网卡通信

1.背景

应用场景和需求都比较简单,有台设备集成了移动的物联网卡,通过4G模块发送UDP数据包到对应服务器上。

2.遇到的问题

JAVA开SOCKET监听服务器端口可以接收到数据设备上报数据包,但是设备端无法接收到我程序下发回去的数据。
接收程序:

发送程序:

			DatagramSocket datagramSocket = new DatagramSocket(config.getSocketPort());
			//定义字节数组,缓冲客户端发送的数据
			byte[] bytes = new byte[1200];
			//构造包对象,设置接收内容
			DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
			//开始接收包
			datagramSocket.receive(datagramPacket);
			//获取数据包字节码
			byte[] recvDatas = datagramPacket.getData();
			... ...
		    ... ...

发送程序:

        //组装发送命令字节码
        byte[] command = protocol0xdc_55(data);
        //往接收到的数据包中解析出的IP与PORT发数据
		DatagramPacket dp = new DatagramPacket(command, command.length, InetAddress.getByName(data.getIp()),
			data.getPort());	
        DatagramSocket datagramSocket = new DatagramSocket();
		datagramSocket.send(dp);
3.解决方案

服务器给设备发送消息时,使用接收设备上传数据时的socket对象。
修改后的发送程序

        //组装发送命令字节码
        byte[] command = protocol0xdc_55(data);
        //往接收到的数据包中解析出的IP与PORT发数据
		DatagramPacket dp = new DatagramPacket(command, command.length, InetAddress.getByName(data.getIp()),
			data.getPort());	
		//接收数据的socket对象
        UDPServer.datagramSocket.send(dp);
4.总结

物联网通信这块的知识还不够扎实,很多原理性的东西半知半解,按之前的理解UDP通信应该是不用维护状态的,有对方的IP和端口,只管发消息就行。

测试过程发现的现象
  • 办公司内网环境多台电脑通信,指定内网IP相互收发,采用第一种发送程序,即发送时重新实例化一个socket,可以实现相互通信;
  • 办公司内网环境多台电脑通信,指定对应内网IP映射的外网IP相互收发,采用第一种发送程序,即发送时重新实例化一个socket,复现问题,只能收数据,无法通过原IP端口回发消息,收发使用同一个socket对象则问题消失。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值