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 实现,简洁优雅(核心逻辑极简)。
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 { /* 超时或终端不在线 */ }详见:
- example/quick_start/main.go
- example/protocol (各种主动指令、自定义回复映射)
按场景分类的常用示例(每个都有完整可运行代码):
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服务上, 下发数据使用广播. 存在则回复终端应答到新主题, 不存在则忽略.主动下发给设备指令 -> 获取应答的情况9. 协议交互详情 代码参考
使用自定义模拟器, 可以轻松生成测试用的报文, 有详情描述.
可在apifox文档页面, 使用测试环境查看报文详情. https://vsh9jdgg5d.apifox.cn/250573462e0自定义附加信息处理, 获取想要的扩展内容. 自定义平台下发和回复的映射和解析关系.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数据库 |
| 序号 | 消息 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 | ✅ | ✅ | 摄像头立即拍摄命令应答 | 修改 | 被新增 |
| 序号 | 消息 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 | ✅ | ✅ | 文件上传完成消息应答 |