[计算机网络]java 实现 udp 通信发送 16 进制报文

最近有个项目,需要根据卡号生成韦根信号,然后发送给韦根转换器,再让韦根转换器把我发送的内容解析成韦根信号

用的韦根转换器是这家公司的: 韦根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();
  }
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值