jtt808

    Pure MoonBit JT/T 808 stack: framing, message catalog, terminal session and platform gateway.

    jtt808
    telematics
    protocol
    binary
    vehicle
    Download zip
    Author
    Version
    0.1.0
    License
    MIT
    Last updated
    10 hours ago
    Downloads
    3

    No dependencies

    #JTT

    用 MoonBit 写的 JT/T 808 协议栈。给需要接车联网平台的人一个不依赖 C、不依赖 JVM 的选择:帧、消息、会话,全部自己实现,能被 native / wasm 直接编进去。

    标准参考 JT/T 808-2013,同时读得懂 2019 版加宽后的消息头。moon run apps/jtt -- demo 的真实输出:

    demo

    ┌──────┬──────────────────────────────┬──────┬──────┐ │ 0x7E │ message header + body │ xor │ 0x7E │ └──────┴──────────────────────────────┴──────┴──────┘ 定界 转义后传输 校验

    #现在能做什么

    层内容状态
    帧定界、转义、XOR 校验、粘包拆分可用
    头2013 / 2019 双版本、分包、BCD 手机号可用
    会话注册、鉴权、心跳、注销、通用应答可用
    位置0x0200、附加项 TLV、0x0704 批量、0x0201 查询应答可用
    参数0x8103 设置、0x8104 查询可用
    指令0x8105 终端控制、0x8300 文本、0x8202 跟踪可用
    围栏0x8600 圆形、0x8602 矩形、删除可用
    文本GBK 编解码(车牌、文本下发)可用
    网关平台侧会话表、鉴权码签发、在线计数可用
    围栏扩展多边形、路线计划中
    媒体JT/T 1078 信令与封装头计划中

    没列出来的消息 ID 不会丢:解析器把它们原样保留在 Unknown 里,网关可以继续转发。

    #30 秒

    moon run apps/jtt -- demo

    会打印一次完整的「终端 ↔ 平台」握手,再补三条位置汇报,每一行都是真实帧:

    terminal register 7E0100002D0138001380000001000B... platform register_ack 7E810000090138001380000001000100415554482D31... terminal auth 7E010200060138001380000002415554482D31... platform platform_ack 7E800100050138001380000002000201020000...

    解一段抓包:

    moon run apps/jtt -- decode "7E02000029013800138000000400000004000000030260F2A0..."

    #目录

    octet/ 字节游标、写入器、BCD、hex、GBK wire/ 0x7E 封装:转义、校验、拆包 catalog/ 消息头、消息 ID、payload 信封 bodies/ 按消息族拆开的消息体 + 注册表 link/ 终端 / 平台两侧状态机、模拟轨迹、渲染 apps/jtt/ 命令行

    分层是单向的:bodies 依赖 catalog,catalog 依赖 wire,wire 依赖 octet。反过来没有依赖,所以任何一层都可以单独用。

    #几个取舍

    sans-IO。 核心只吃 Bytes、吐 Bytes,TCP 留给调用方。这样才能在测试里把一次握手完整跑完,也才能同时编到 native 和 wasm。

    未知消息不丢。 车联网现场的设备型号比文档多,网关不能因为库里没写某个 ID 就把包扔掉。

    GBK 是生成出来的。 octet/gbk_table.mbt 由 scripts/gen_gbk.py 生成并提交,构建时不依赖 Python;表按 23940 个槽位索引,未分配槽位保留 U+0000,编码时直接报错而不是猜。

    属性位决定长度。 围栏的时间窗、限速字段是否出现由区域属性决定,编解码都按属性分支,不假设固定尾巴。

    #验证

    moon check --deny-warn moon test --deny-warn # 50 个用例 moon fmt --check

    测试覆盖到字节级:真实帧的 hex 断言、截断与畸形输入、GBK 往返、双方握手闭环、围栏属性分支。

    #许可

    MIT,见 LICENSE。实现依据公开的 JT/T 808 标准文本,代码与文档均为自写。