JAVA腾晖数据帧对接指南

Java基础

(1)基本数据类型各占多少个字节

数据类型

字节

byte

1

short

2

int

4

long

8

float

4

double

8

char

2

boolean

4

(2)十六进制

十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F表示,其中:A~F相当于十进制的10~15,这些称作十六进制数字。

   参考地址: https://zh.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6

(3)大小端模式

大端模式:低位(字节/比特)放在高地址中,高位(字节/比特)放在低地址中。

小端模式:低位(字节/比特)放在低地址中,高位(字节/比特)放在高地址中。

一般操作系统都是小端模式;而通讯协议是大端模式。

java和平台无关,默认是大端模式。

    参考地址:https://www.cnblogs.com/justkong/p/8807534.html

自定义协议

(1)对接数据帧封装协议

                                                                            表2.3.1 通用数据帧

帧 头

2byte

帧长度

4byte

帧流水号

2byte

协议版本

1byte

命令

1byte

数据载荷

LEN byte

校验和

1byte

0x5A55

 0x0000

~0xFFFFFFFF

 0x0000

~0xFFFF

0x00~0xFF

0x00-0xFF

——

0x00~0xFF

                                                                             表2.3.2命令子域值

命令值

描述

反馈命令值

0x01

厂商识别码验证请求

0x01

0x03

心跳

0x03

0xFE

获取平台时间

0xFE

0x26

上传车牌识别数据

0x26

注:

1、所有信息传输时,低字节在前,高字节在后。

2、信息的反馈

信息产生端发送数据包给信息处理端后,信息处理端反馈数据包格式和请求帧一致,定义如下:

表2.3.3 反馈数据帧

帧 头

2byte

帧长度

4byte

帧流水号

2byte

协议版本

1byte

命令

1byte

数据载荷

LEN byte

校验和

1byte

0x5A55

 0x0000

~0xFFFFFFFF

 同请求帧流水号

同请求帧协议版本

请求帧命令

——

0x00~0xFF

 

如表2.3.1所示,通信帧结构包括帧头子域、帧长度子域、帧流水号子域、协议版本子域、命令子域、数据载荷子域、校验和子域。其中,帧头为固定的2个字节(0x5A55);帧长度子域4个字节,其值为除帧头外实际数据帧长度,包括帧长度子域本身的长度;帧流水号子域2个字节,信息产生端上发数据是产生的帧流水号约定在1-1024数字范围内,对信息产生端主动上报的数据,信息处理端返回响应帧中的帧流水号同上报帧流水号,同样信息产生端响应平台请求帧的流水号也需相同,该帧流水号区分不同帧;协议版本子域1个字节,表示命令的协议版本;命令子域1个字节,其值定义如表所示;数据载荷子域的字节数LEN是根据不同的数据帧结构变化的,详见具体帧结构;校验和:从帧头0x5A55开始累加到校验和子域之前,包括帧头字节。

(2)文档分析

确定数据值为:帧头固定、帧流水号约到在1-1024之间、协议版本固定01、命令固定,

需要计算的值为:帧长度,数据载荷长度(数据载荷为json字符串,可详情参看河源对接文档)、校验和

需要小端排序字段:帧长度、帧流水号

(3)变量声明

   帧头为2字节,Java基本数据类型应声明为short

   帧长度为4字节,Java基本数据类型应声明为int

   帧流水号为2字节,Java基本数据类型应声明为short

   协议版本为1字节,Java基本数据类型应声明为byte

   命令为1字节,Java基本数据类型byte

   数据载荷为json字符串,Java基本数据类型应声明为String

   校验和为1字节,Java基本数据类型应声明为byte

(4)相关计算

   帧长度计算:

   帧长度是除帧头以为的数据长度,现在只有数据载荷长度未知,那么帧长度4+帧流水号长度2+协议版本长度1+命令长度1+数据载荷长度?+校验和长度1即为帧长度

   帧长度计算公式则变成:9+?数据载荷长度

   数据载荷长度计算:

   数据载荷为String,将String转为byte数组,获取byte数组的长度即为数据载荷长度

 

校验和计算:

校验和:从帧头0x5A55开始累加到校验和子域之前,包括帧头字节

(这个校验和计算是请教的硬件部门同事)

就是把帧头到数据载荷放到一个byte数组然后计算长度

(5)帧长度、帧流水号小端排序计算:

数据包组装:

   经和对接方确认tcp调试工具发送的是十六进制的数据包

   所以要将对接的数据转换为十六进制,然后拼接在一起形成一个完整的16进制数据包

(6)数据包调试

使用TCP调试助手以十六进制发送数据包,验证能否收到返回,能收到即说明数据包组装无误。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中没有专门的数据帧类,但是可以通过Java的网络编程API来实现数据帧的封装和传输。具体来说,可以使用Java的DatagramPacket和DatagramSocket类来实现数据帧的封装和传输。 DatagramPacket类表示一个数据报文,包含了数据报文的内容、目标地址和端口号等信息。DatagramSocket类表示一个套接字,用于发送和接收数据报文。使用这两个类可以实现基于UDP协议的数据帧的封装和传输。 下面是一个简单的示例代码,演示如何使用DatagramPacket和DatagramSocket类实现数据帧传输: ```java import java.net.*; public class DataFrameSimulator { public static void main(String[] args) { try { // 创建一个DatagramSocket对象 DatagramSocket socket = new DatagramSocket(); // 设置目标地址和端口号 InetAddress address = InetAddress.getByName("192.168.0.1"); int port = 1234; // 构造数据 byte[] data = "Hello, World!".getBytes(); // 构造数据帧 byte[] frame = new byte[data.length + 1]; // 添加控制信息 frame[0] = 0x01; // 控制字节 System.arraycopy(data, 0, frame, 1, data.length); // 数据部分 // 构造数据报 DatagramPacket packet = new DatagramPacket(frame, frame.length, address, port); // 发送数据报 socket.send(packet); // 关闭Socket对象 socket.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个示例中,我们使用Java的DatagramSocket类创建了一个Socket对象,并设置了目标地址和端口号。然后,我们构造了一个包含控制信息和数据部分的数据帧,并将其封装在一个数据报中。最后,我们使用Socket对象发送了这个数据报。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值