AIS报文解析

1 篇文章 0 订阅

!AIVDM,1,1,A,13u?etPv2;0n:dDPwUM1U1Cb069D,023*
我们知道消息内容就是13u?etPv2;0n:dDPwUM1U1Cb069D,这是一串ASCII码字符串,我们可以获取其对应的ASCII码数值。
在这里插入图片描述
但是在AIS的编码表不需要这么多符号,所以截取了其中一部分,如下表:
在这里插入图片描述
所以我们要想解码AIS报文,就需要把原始AIS报文中的ASCII码值转换为下面的值,然后再用下面的二进制拼接就可以了。
对比两张表我们很容易看出规律,就是AIS编码表0 ~ W(0 ~ 27)对应ASCII码中的48 ~ 87,(‘ ~ w) 对应96 ~ 119,所以我们可以初始化一个数组来转换:

		int[] toSixbit = new int[256 * 256];
        for (int chr = 0; chr < toSixbit.length; chr++) {
            if (chr < 48 || chr > 119 || chr > 87 && chr < 96) {
                toSixbit[chr] = -1;
            } else if (chr < 0x60) {
                toSixbit[chr] = chr - 48 & 0x3F;
            } else {
                toSixbit[chr] = chr - 56 & 0x3F;
            }
        }

接下来就只需要将转换后的数据的后六位拼接到一起就可以了,为了方便后面的取用,可以引入colt库使用BitVector来存储转换后的二进制数据:

        <dependency>
            <groupId>colt</groupId>
            <artifactId>colt</artifactId>
            <version>1.2.0</version>
        </dependency>

获取后6位拼接

   public static BitVector getBitVector(String ais) {
        String[] split = ais.split(",");
        String payload = split[5];
        BitVector bitVector = new BitVector(payload.length() * 6);
        for (int i = 0; i < payload.length(); i++) {
            char asciiChar = payload.charAt(i);
            int i1 = INT_TO_SIX_BIT[asciiChar];
            for (int j = 0; j < 6; j++) {
                if (((i1 >> (5 - j)) & 1) == 1) {
                    bitVector.set(i * 6 + j);
                }
            }
        }
        return bitVector;
    }

成功拿到二进制数据后,按照协议解析就可以了,比如我们根据协议知道开头的AIS报文的第8位到37位表示MMSI,那就可以获取二进制串中的8~37位转为数值即可:

    public static void main(String[] args) {
        String ais = "!AIVDM,1,1,,A,13u?etPv2;0n:dDPwUM1U1Cb069D,0*23";
        BitVector bitVector = getBitVector(ais);

        long value = bitVector.getLongFromTo(8, 37);
        long bits = 37 - 8 + 1;
        long temp = Long.reverse(value << (int) (64L - bits));
        System.out.println(temp);
    }

可以看到解析MMSI结果为:265547250

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
解析 AIS (Automatic Identification System) 报文可以使用 Java 编程语言实现。AIS 是一种海上船舶自动识别系统,用于提供船舶的位置、速度、航向等信息,以确保船舶安全。 在 Java解析 AIS 报文,首先需要了解 AIS 报文的结构和数据格式。AIS 报文由一系列特定的字段组成,每个字段包含不同的信息。可以通过定义类或使用现有的库来表示这些字段,在 Java 中进行解析和处理。 解析 AIS 报文的主要步骤如下: 1. 从数据源(例如文件、网络请求或数据库)读取 AIS 报文数据。 2. 将读取的数据按照特定的格式进行解析,提取出每个字段的值。可以使用 Java 中提供的字符串处理函数来分割数据,或使用正则表达式匹配字段的位置和长度。 3. 根据 AIS 报文的规范,将每个字段的值映射到相应的数据类型。例如,将数字字段解析为整数或浮点数,将日期字段解析为日期对象。 4. 将解析后的字段值存储在 Java 对象中,以便后续处理和分析。 5. 进行额外的处理,例如验证字段的有效性、计算衍生字段(如船舶的目的地)、过滤无效或重复的报文等。 6. 根据需求将解析后的数据输出,可以是保存到数据库、导出为其他格式的文件(如 CSV 或 JSON)或直接用于应用程序的其他模块。 在实现解析 AIS 报文的过程中,可以借助一些开源的 Java 库,如 Apache Commons CSV、Jackson、Gson 等来简化处理过程。这些库提供了现成的函数和类,可以用于处理 CSV、JSON 等常见数据格式,将 AIS 报文转换为 Java 对象。 总之,使用 Java 编程语言解析 AIS 报文需要对 AIS 报文的结构和数据格式有一定的了解,并使用合适的方法和工具来解析和处理报文数据,从而实现对船舶信息的提取和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixin_43169720

如果本文对你有所帮助,请打赏—

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

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

打赏作者

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

抵扣说明:

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

余额充值