
本项目以支持二次开发为主要目标,可通过自定义事件灵活扩展功能.
受“飞哥单机 TCP 百万并发”启发,于2024年国庆期间测试了有实际数据流的情况.
- 支持JT808(2011/2013/2019)协议,以及JT1078视频扩展.(需配合其他流媒体服务)
- 支持分包、重传、主动安全扩展(苏标、黑标、广东标、湖南标、四川标等)
- 性能测试: 单机[2核4G机器]、并发10w+每日保存4亿+经纬度 详情
| 特点 |
描述 |
| 安全可靠 |
核心协议实现测试覆盖率 100%,纯 Go 原生代码 |
| 简洁优雅 |
核心代码不到1000行,采用无锁设计 |
| 易于扩展 |
提供丰富的自定义事件和适配器机制,便于二次开发 |
| 包名 |
描述 |
Go Report Card |
| shared |
jt808和1078指令常量 |
 |
| protocol |
jt808和1078协议实现 |
 |
| service |
jt808服务端 |
 |
| adapter |
jt808适配器 |
 |
| attachment |
jt808附件服务 |
 |
| terminal |
jt808客户端模拟器 |
 |
| gb28181 |
gb28181客户端 |
 |
web例子在线网页: http://124.221.30.46:18000/
真实案例: 根据壹品信息技术有限公司对接中农云设备修改
平台下发0x9101等指令 -> 模拟器开始推流等动作
原: 设备连接到原808服务
现: 设备连接到适配器, 适配器产生两个模拟链接, 一个连接到原808服务, 保证不影响原服务.
另一个连接到gb28181模拟服务, 产生一个gb28181客户端. (目前仅支持注册、目录查询、点播[jt1078转ps流])
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
真实设备连接到适配器, 适配器产生多个模拟设备连接多个808服务.
默认支持苏标, 可自定义各事件扩展.(开始、传输进度、补传情况、完成、退出等事件)
jt808服务端、模拟器、消息队列、数据库都运行在2核4G腾讯云服务器.
测试每秒保存5000条的情况、约5.5小时保存了近1亿的经纬度.
使用nginx把终端分配到多个808服务上, 下发数据使用广播. 存在则回复终端应答到新主题, 不存在则忽略.
使用自定义模拟器, 可以轻松生成测试用的报文, 有详情描述.
可在apifox文档页面, 使用测试环境查看报文详情. https://vsh9jdgg5d.apifox.cn/250573462e0
自定义附加信息处理, 获取想要的扩展内容. 自定义平台下发和回复的映射和解析关系.
把atop_cpu.png传输到ftp目录 (需要ftp服务)
默认创建1000个客户端, 循环30秒心跳、5秒位置信息测试.
快速开始 完整项目例子
package main
import (
"fmt"
"github.com/cuteLittleDevil/go-jt808/protocol/model"
"github.com/cuteLittleDevil/go-jt808/service"
"github.com/cuteLittleDevil/go-jt808/shared/consts"
"github.com/cuteLittleDevil/go-jt808/terminal"
"log/slog"
"net"
"os"
"strings"
"time"
)
func init() {
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
AddSource: true,
Level: slog.LevelDebug,
ReplaceAttr: nil,
}))
slog.SetDefault(logger)
}
func main() {
goJt808 := service.New(
service.WithHostPorts("0.0.0.0:808"),
service.WithCustomHandleFunc(func() map[consts.JT808CommandType]service.Handler {
return map[consts.JT808CommandType]service.Handler{
consts.T0200LocationReport: &meLocation{}, // 自定义0x0200位置解析等,每一个连接是独立的map.
}
}),
)
go client("1001", "127.0.0.1:808") // 模拟一个设备连接
goJt808.Run()
}
type meLocation struct {
model.T0x0200
}
func (l *meLocation) OnReadExecutionEvent(msg *service.Message) {
_ = l.Parse(msg.JTMessage)
fmt.Println(time.Now().Format(time.DateTime), l.String()) // 打印经纬度等信息
}
func (l *meLocation) OnWriteExecutionEvent(_ service.Message) {}
func (l *meLocation) String() string {
body := l.T0x0200.Encode()
return strings.Join([]string{
"数据体对象:{",
fmt.Sprintf("\t%s:[%x]", l.Protocol(), body),
l.T0x0200LocationItem.String(),
l.AlarmSignDetails.String(),
l.StatusSignDetails.String(),
"}",
}, "\n")
}
func client(phone string, address string) {
time.Sleep(time.Second)
t := terminal.New(terminal.WithHeader(consts.JT808Protocol2013, phone))
location := t.CreateDefaultCommandData(consts.T0200LocationReport)
conn, err := net.Dial("tcp", address)
if err != nil {
return
}
defer func() {
_ = conn.Close()
}()
ticker := time.NewTicker(5 * time.Second)
for range ticker.C {
_, _ = conn.Write(location)
}
}
- 目前(2024-10-01)前的go语言版本个人觉得都不好因此都不推荐参考 推荐参考资料如下
| 项目名称 |
语言 |
日期 |
Star 数 |
链接 |
| JT808 |
C# |
2024-10-01 |
534 |
JT808 C# |
| jt808-server |
Java |
2024-10-01 |
1.4k+ |
JT808 Java |
- java模拟器(QQ群下载 373203450)
- go模拟器 详情点击
详情点击
| 服务端版本 |
场景 |
并发数 |
服务器配置 |
服务器使用资源情况 |
描述 |
| 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数据库 |