Skip to content

cuteLittleDevil/go-jt808

Repository files navigation

License: MIT Go Doc Perf WEB API codecov Go Report Card build status

go-jt808

JT/T 808(2011/2013/2019)+ JT/T 1078 音视频 + 主动安全附件(苏标等)的 Go 实现

设计目标:以二次开发和生产使用为首要目标,通过事件机制灵活扩展,不侵入核心协议

Go 1.23+

📑 目录

快速开始

cd example/quick_start
go run .

更多示例:

核心特性

  • 无锁会话管理 + 主动消息下发(带超时回复等待)
  • 内置终端模拟器,便于协议联调。提供适配器、分布式集群等示例
  • 高度可扩展:通过 WithCustomHandleFunc 自定义回复,实现几乎任意业务逻辑
说明 适用场景
service JT808 TCP 服务端 平台服务端核心
protocol 协议编解码 + 消息模型 自定义消息、报文分析
terminal 终端模拟/指令构造 测试、对接验证
adapter 多后端适配器 灰度迁移、同时对接多个平台
attachment 主动安全附件服务 报警附件文件接收
gb28181 GB28181 客户端 + 流转换 视频平台互通

核心协议实现测试100%覆盖率,纯 Go 实现,简洁优雅(核心逻辑极简)。

基本用法

启动 JT808 服务并自定义消息处理

goJt808 := service.New(
    service.WithHostPorts("0.0.0.0:808"),
    service.WithTerminalTimeout(30*time.Second, func(t service.TerminalTimeout) { /* 超时处理 */ }),
    service.WithCustomHandleFunc(func() map[consts.JT808CommandType]service.Handler {
        return map[consts.JT808CommandType]service.Handler{
            consts.T0200LocationReport: &myLocation{}, // 自定义经纬度处理
        }
    }),
)
go goJt808.Run()

自定义处理器示例(推荐模式:嵌入官方 model 并实现事件):

type myLocation struct{ model.T0x0200 }

func (l *myLocation) OnReadExecutionEvent(msg *service.Message) {
    _ = l.Parse(msg.JTMessage)
    // l.Longitude, l.Latitude, l.Speed, l.AlarmSignDetails ...
    log.Printf("收到位置 key=%s", msg.Key)
}

func (l *myLocation) OnWriteExecutionEvent(_ service.Message) {}

平台主动下发消息(带应答)

msg := service.NewActiveMessage(phone, consts.P8201QueryLocation, nil, 3*time.Second)
reply := goJt808.SendActiveMessage(msg)
if reply.ExtensionFields.Err != nil { /* 超时或终端不在线 */ }

详见:

常见案例

按场景分类的常用示例(每个都有完整可运行代码):

1. 真实项目对接 apifox文档 web详情 releases下载

web例子在线网页: http://124.221.30.46:18000/
真实案例: 根据壹品信息技术有限公司对接中农云设备修改

2. jt1078视频 详情

平台下发0x9101等指令 -> 模拟器开始推流等动作
流媒体 语言 描述 说明
rtvs 不开源
可使用
在线测试页面 https://124.221.30.46:44300/index.html
点击实时视频(0x9101)按钮播放
详情点击
lal go 在线播放地址 http://124.221.30.46:8080/live/1001_1.flv 详情点击
sky-java java 需要部署后 HTTP请求 10秒内拉流 参考格式如下
http://222.244.144.181:7777/video/1001-1-0-0.live.mp4
详情点击
monibuca go 对讲示例 https://124.221.30.46:12000 详情点击
ZLMediaKit c++ 对讲测试 https://124.221.30.46/static/?type=push
http://124.221.30.46:80/rtp/000000001003_1_0_0.live.mp4
详情点击
srs c++ http://101.35.2.3:8080/live/realtime--924654669559-1.flv 详情点击

3. jt808模拟gb28181客户端 gb28181使用 jt1078转ps流

原: 设备连接到原808服务
现: 设备连接到适配器, 适配器产生两个模拟链接, 一个连接到原808服务, 保证不影响原服务.
另一个连接到gb28181模拟服务, 产生一个gb28181客户端. (目前仅支持注册、目录查询、点播[jt1078转ps流])
信令服务 流媒体 在线测试 说明
monibuca monibuca http://101.35.2.3:12079/#/0/device/gb28181 详情
gb28181 ZLMediaKit 详情
wvp-GB28181-pro ZLMediaKit 详情
docker pull cdcddcdc/jt808-to-gb28181:latest
docker run -d \
-v /home/config.yaml:/app/jt808_to_gb28181/config.yaml \
--network host \
cdcddcdc/jt808-to-gb28181:latest

4. 兼容任意808服务 详情

真实设备连接到适配器, 适配器产生多个模拟设备连接多个808服务.

5. 主动安全附件 流程

默认支持苏标, 可自定义各事件扩展.(开始、传输进度、补传情况、完成、退出等事件)

6. 存储经纬度 详情

jt808服务端、模拟器、消息队列、数据库都运行在2核4G腾讯云服务器.
测试每秒保存5000条的情况、约5.5小时保存了近1亿的经纬度.

7. 分布式集群方案 详情

使用nginx把终端分配到多个808服务上, 下发数据使用广播. 存在则回复终端应答到新主题, 不存在则忽略.

8. 平台下发指令给终端 获取参数 立即拍摄 自定义指令

主动下发给设备指令 -> 获取应答的情况

9. 协议交互详情 代码参考

使用自定义模拟器, 可以轻松生成测试用的报文, 有详情描述.
可在apifox文档页面, 使用测试环境查看报文详情. https://vsh9jdgg5d.apifox.cn/250573462e0

10. 自定义协议扩展 自定义附加 自定义回复映射

自定义附加信息处理, 获取想要的扩展内容. 自定义平台下发和回复的映射和解析关系.

11. ftp例子 详情

把atop_cpu.png传输到ftp目录 (需要ftp服务)

12. 并发测试例子 详情

默认创建1000个客户端, 循环30秒心跳、5秒位置信息测试.

参考资料

2024 年 10 月前主流的 Go 实现较少或质量一般,以下为推荐参考(非 Go)。

项目名称 语言 日期 Star 数 链接
JT808 C# 2024-10-01 534 JT808 C#
jt808-server Java 2024-10-01 1.4k+ JT808 Java

性能测试

连接数测试

详情点击

  • 2台云服务器各开5w+客户端 总计10w+
服务端版本 场景 并发数 服务器配置 服务器使用资源情况 描述
v0.3.0 连接数测试 10w+ 2核4G 120%+cpu 1.7G内存 10.0.16.5: 服务端和模拟器
10.0.16.14: 模拟器

模拟经纬度存储测试

详情点击

  • save进程丢失了部分数据, channel队列溢出抛弃. (测试channel队列为100)
  • 保存1亿丢失826条, 保存4.32亿丢失1216条.(分两次测试)
服务端版本 客户端 服务器配置 描述
v0.3.0 1w go模拟器 2核4G 每秒5000 一共保存经纬度1亿
实际保存99999174 成功率99.999%
服务 cpu 内存 描述
server 35% 180.4MB 808服务端
client 23% 196MB 模拟客户端
save 18% 68.8MB 存储数据服务
nats-server 20% 14.8MB 消息队列
taosadapter 37% 124.3MB tdengine数据库适配
taosd 15% 124.7MB tdengine数据库

协议支持情况

JT808终端通讯协议

序号 消息 ID 完成情况 测试情况 消息体名称 2019 版本 2011 版本
1 0x0001 终端通用应答
2 0x8001 平台-通用应答
3 0x0002 终端心跳
4 0x8003 补传分包请求 被新增
5 0x0100 终端注册 修改 被修改
6 0x8100 平台-注册应答
8 0x0102 终端鉴权 修改
9 0x8103 平台-设置终端参数 修改且增加 被修改
10 0x8104 平台-查询终端参数
11 0x0104 查询终端参数应答
18 0x0200 位置信息汇报 增加附加信息 被修改
19 0x8201 平台-位置信息查询
20 0x0201 位置信息查询应答
21 0x8202 平台-临时位置跟踪控制
23 0x8300 平台-文本信息下发 修改 被修改
26 0x8302 平台-提问下发 删除
27 0x0302 提问应答 删除
49 0x0704 定位数据批量上传 修改 被新增
51 0x0800 多媒体事件信息上传 被修改
52 0x0801 多媒体数据上传 修改 被修改
53 0x8800 平台-多媒体数据上传应答 被修改
54 0x8801 平台-摄像头立即拍摄命令 修改
55 0x0805 摄像头立即拍摄命令应答 修改 被新增

JT1078扩展

序号 消息 ID 完成情况 测试情况 消息体名称
13 0x1003 终端上传音视频属性
14 0x1005 终端上传乘客流量
15 0x1205 终端上传音视频资源列表
16 0x1206 文件上传完成通知
17 0x9003 平台-查询终端音视频属性
18 0x9101 平台-实时音视频传输请求
19 0x9102 平台-音视频实时传输控制
20 0x9105 平台-实时音视频传输状态通知
21 0x9201 平台-下发远程录像回放请求
22 0x9202 平台-下发远程录像回放控制
23 0x9205 平台-查询资源列表
24 0x9206 平台-文件上传指令
25 0x9207 平台-文件上传控制

主动安全扩展

序号 消息 ID 完成情况 测试情况 消息体名称
1 0x1210 报警附件信息消息
2 0x1211 文件信息上传
3 0x1212 文件上传完成消息
4 0x9208 报警附件上传指令
5 0x9212 文件上传完成消息应答

About

jt808服务端 单机[2核4G]并发10w+ 100%测试覆盖率 例子丰富(每日保存亿+经纬度 JT1078流媒体播放 jt808转gb28181 兼容任意808服务 真实设备对接案例等)

Topics

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Contributors

Languages