java实现JT809协议数据对接客户端

最近使用JT809协议进行数据对接,遇到了不少问题,度娘谷歌都不好使,找不到很好的客户端实现代码的例子,只能苦逼的自己闷头弄,现在特意写篇帖子,希望能帮助一些人

说正经的:

背景:跟某公司做数据对接,将本公司的一些信息推送到接收端

要求:建立tcp链接,使用接收端提供的用户名密码等信息 先登录,登录成功后推送数据,数据采用JT809标准协议

实现语言:java

下面介绍具体实现,包涵完整代码

在这之前,最好先下载jt809协议,研究研究,网上就有,我找到的里面还有一些错误别,一度让我觉得是个盗版货

首先说下整体结构:一个tcp客户端,一个Decoder,一个心跳Handler,一个处理反馈的handler,一个消息对象

通过tcp客户端链接制定ip地址和端口,进行登陆,心跳handler负责在发送数据空闲时向目标服务器发送请求保持包;decoder负责解码组装对象,反馈handler负责处理收到的反馈信息,消息对象我就不多说了

下面看代码:

TCPclient:

由于时间紧迫,代码结构有些臃肿,我使用的tcpclient为两个,一个是基类,一个子类,其实这两个可以合并到一起,这里有心的朋友自己去和,下面来看下tcpclient基类的代码,其中有一些模块的引用因为涉及到公司信息,所以我删除掉了,大家参考的时候,引用自己编写的就可以了,

 

//包路径,自己填
import java.net.InetSocketAddress;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.handler.logging.LoggingHandler;
import org.jboss.netty.handler.timeout.IdleStateHandler;
import org.jboss.netty.logging.InternalLogLevel;
import org.jboss.netty.util.HashedWheelTimer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;



public class TcpClient{

	private static final Logger LOG = LoggerFactory.getLogger(TcpClient.class);

	private static final int DEFAULT_PORT = 9000;

	private long connectTimeoutMillis = 3000;

	private int port = DEFAULT_PORT;

	private boolean tcpNoDelay = false;

	private boolean reuseAddress = true;

	private boolean keepAlive = true;

	private int workerCount = 4;

	private ClientBootstrap bootstrap = null;
	
	private  static Channel channel = null;

	private Executor bossExecutor = Executors.newCachedThreadPool();

	private Executor workerExecutor = Executors.newCachedThreadPool();
	

	private static TcpClient instance = new TcpClient();

	private TcpClient() {
		init();
	}
	
	public static TcpClient getInstence(){
		return instance;
	}

	
	public void init() {

		bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(
				bossExecutor, workerExecutor, workerCount));
		bootstrap.setOption("tcpNoDelay", tcpNoDelay);
		bootstrap.setOption("connectTimeoutMillis", connectTimeoutMillis);
		bootstrap.setOption("reuseAddress", reuseAddress);
		bootstrap.setOption("keepAlive", keepAlive);
	}
	
	
	public Channel getChannel(String address, int port) {
		
		if (null == channel || !channel.isOpen()) {
			bootstrap.setOption("writeBufferHighWaterMark", 64 * 1024);
			bootstrap.setOption("writeBufferLowWaterMark", 32 * 1024);
			bootstrap.setPipelineFactory(new ChannelPipelineFactory(){
				@Override
				public ChannelPipeline getPipeline() throws Exception {
					ChannelPipeline pipeline = Channels.pipeline();
//					pipeline.addLast("loging", new LoggingHandler(InternalLogLevel.ERROR)); 打印日志信息,上线稳定后可去掉
					pipeline.addLast("timeout", new IdleStateHandler(new HashedWheelTimer(), 10, 60, 0));//设置空闲心跳机制
					pipeline.addLast("heartbeat", new HeartBeatHandler());//心跳发送包处理handler
					pipeline.addLast("decode", new Decoder());//解码
					pipeline.addLast("loginHandler", new RecevieHandler());//反馈数据处理
					return pipeline;
				}
			});
			ChannelFuture future = bootstrap.connect(new InetSocketAddress(
					address, port));
			future.awaitUninterruptibly();
			if (future.isSuccess()) {
				channel = future.getChannel();
			} else {
				throw new FrameworkRuntimeException(future.getCause());
			}
		}

		return channel;
	}

	

	public long getConnectTimeoutMillis() {
		return connectTimeoutMillis;
	}

	public void setConnectTimeoutMillis(long connectTimeoutMillis) {
		this.connectTimeoutMillis = connectTimeoutMillis;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public boolean isTcpNoDelay() {
		return tcpNoDelay;
	}

	public void setTcpNoDelay(boolean tcpNoDelay) {
		this.tcpNoDelay = tcpNoDelay;
	}

	public boolean isReuseAddress() {
		return reuseAddress;
	}

	public void setReuseAddress(boolean reuseAddress) {
		this.reuseAddress = reuseAddress;
	}

	public boolean isKeepAlive() {
		return keepAlive;
	}

	public void setKeepAlive(boolean keepAlive) {
		this.keepAlive = keepAlive;
	}

	public int getWorkerCount() {
		return workerCount;
	}

	public void setWorkerCount(int workerCount) {
		this.workerCount = workerCount;
	}
	
}

 

上面的配置,用过netty都不会陌生,就不多说了,下面看下子类的实现

 



import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Cha
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
### 回答1: JT809协议是指基于地理信息技术的公路运输业内部通信协议,主要用于管理和监控公路运输车辆和货物。为了实现JT809协议接受平台推送数据,我们可以采用Java语言编程来实现。 首先,需要使用Java网络编程技术来建立与平台的TCP/IP连接。在成功建立连接后,可以使用Java的IO流技术来进行数据的传输,将平台推送的数据按照JT809协议中规定的格式进行解析和处理。 其次,需要在Java程序中实现JT809协议的解析和封装功能。这可以借助一些开源的Java库或自己写代码实现。我们需要将从平台接收到的JT809协议数据进行解析,得到协议中规定的各类数据,如车辆位置、状态信息等等,再封装为Java对象或其他形式进行处理。 最后,需要建立一套稳定的系统架构来保证数据的高效处理和可靠传输。这包括使用线程池对接收到的数据进行分发和处理,以及建立相应的日志记录和异常处理机制来保证系统的健壮性和可维护性。 通过以上的几个步骤,我们可以实现JavaJT809协议接受平台推送数据的功能,从而达到监控和管理公路运输车辆和货物的目的。 ### 回答2: Java实现JT809协议接收平台推送数据需要采用Java编程语言编写代码,涉及到以下三个主要步骤: 第一步,建立TCP/IP的连接。JT809协议支持TCP/IP协议,需要使用Java的Socket类与平台建立连接。通过指定平台IP地址与端口号,在Java程序中创建一个Socket实例实现与平台的连接。 第二步,解析JT809协议数据JT809协议规定了数据传输格式和数据字段,需要对平台推送的数据进行解析,提取有用的数据信息。因此,Java程序需要根据JT809协议字段定义、数据类型和编码方式,对平台采用byte数组或字符串进行封装和解析。 第三步,处理接收到的数据。一旦接收到来自平台的JT809协议数据Java程序需要比对数据包头和数据包体,进行数据有效性检查,然后执行相应的业务逻辑,如存储、分析和显示数据信息。 为了更好地实现JT809协议接收平台推送数据,可以借助于开源的框架,如JT809开源框架,来实现JT809协议数据的解析和处理。使用该框架,只需引入相关的依赖包并进行简单的配置,就能以更高效、更准确的方式实现JT809协议接收平台推送数据功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fox_mt

真的帮助了你,而你又签好有钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值