最近有个项目,需要根据卡号生成韦根信号,然后发送给韦根转换器,再让韦根转换器把我发送的内容解析成韦根信号
用的韦根转换器是这家公司的: 韦根26转网络维根转TCP/网络转韦根26TCP转维根
根据人家的协议规定,生成的韦根信号代码如下:
public String wgTransform(String wgNumber){
StringBuilder sb = new StringBuilder();
sb.append("02");
// 传入的卡号,如果不足 10 位,则在前面以 0 补足
if (wgNumber.length() < 10){
wgNumber = StringUtils.leftPad(wgNumber, 10, '0');
}
for (int i = 0; i < wgNumber.length(); i++) {
String res = "3" + wgNumber.charAt(i);
sb.append(res);
}
String tailNumber = "0D0A1A03";
Integer wg_type = 26;
if (34 == wg_type){
tailNumber = " 0D0A2203";
}
sb.append(tailNumber);
log.info("wgnumber is : {}", sb.toString());
return sb.toString();
}
接下来就是将我生成的韦根信号发送给韦根转换器了
因为它是使用 udp 通信的,所以使用 DatagramSocket
即可
详细代码如下:
// 将传入的卡号转换成韦根信号
String result = wgTransform(wgNumber);
DatagramSocket socket = null;
try {
socket = new DatagramSocket();
socket.setSoTimeout(2000);
String ip = "127.0.0.1";
byte[] data = result.getBytes(Charset.forName("ISO-8859-1"));
DatagramPacket packet = new DatagramPacket(data, data.length,
InetAddress.getByName(ip),3663);
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
} finally {
socket.close();
}
接下来神奇的事情发生了
比如,我得到的 result
结果是 12345678
,然后通过 socket.send(packet)
方法发送出去的数据就成了下面这样
在我的 12345678
前面每一个都加了个 3
, emmm
这根本就不是我想要的嘛
这里其实就是进制问题, udp 通信发送的是 16 进制报文,所以将 16 进制的字符串转成字符数组即可
具体代码如下:
// 将 16 进制的字符串转成字符数组
public static byte[] getHexBytes(String str){
byte[] bytes = new byte[str.length() / 2];
for(int i = 0; i < str.length() / 2; i++) {
String subStr = str.substring(i * 2, i * 2 + 2);
bytes[i] = (byte) Integer.parseInt(subStr, 16);
}
return bytes;
}
生成完韦根信号之后,直接调用 getHexBytes
方法即可,详细如下:
String result = wgTransform(wgNumber);
DatagramSocket socket = null;
try {
socket = new DatagramSocket();
socket.setSoTimeout(2000);
byte[] data = getHexBytes(result);
DatagramPacket packet = new DatagramPacket(data,data.length,
InetAddress.getByName(relayIp),3663);
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
} finally {
socket.close();
}
以上
上面聊的是发送的内容
接收到的内容是 16 进制,同样也涉及到将 16 进制内容转换成数组
这个方法也贴一下:
//将 16 进制的 byte 数组转换成字符串
public static String getBufHexStr(byte[] raw){
String HEXES = "0123456789ABCDEF";
if ( raw == null ) {
return null;
}
final StringBuilder hex = new StringBuilder( 2 * raw.length );
for ( final byte b : raw ) {
hex.append(HEXES.charAt((b & 0xF0) >> 4))
.append(HEXES.charAt((b & 0x0F)));
}
return hex.toString();
}