
本项目已更好支持二次开发为目标 可通过各种自定义事件去完成相应功能
看飞哥的单机TCP百万并发 好奇有数据情况的表现 因此国庆准备试一试有数据的情况
- 性能测试 单机[2核4G机器]并发10w+ 每日保存4亿+经纬度 详情
- 支持JT808(2011/2013/2019) JT1078(需要其他流媒体服务)
- 支持分包和自动补传 支持主动安全扩展(苏标 黑标 广东标 湖南标 四川标)
| 特点 |
描述 |
| 安全可靠 |
核心协议部分测试覆盖率100% 纯原生go实现(不依赖任何库) |
| 简洁优雅 |
核心代码不到1000行 不使用任何锁 仅使用channel完成 |
| 易于扩展 |
方便二次开发 有适配任意jt808服务 分布式集群等案例 |
| 包名 |
描述 |
Go Report Card |
| shared |
jt808和1078指令常量 |
 |
| protocol |
jt808和1078协议实现 |
 |
| service |
jt808服务端 |
 |
| adapter |
jt808适配器 |
 |
| attachment |
jt808附件服务 |
 |
| terminal |
jt808客户端模拟器 |
 |
终端连接到web服务 通过http下发指令给终端
真实案例 根据壹品信息技术有限公司对接中农云设备修改
真实设备连接到适配器 适配器产生多个模拟设备连接多个808服务
默认支持苏标 可自定义各事件扩展(开始、传输进度、补传情况、完成、退出等事件)
jt808服务端 模拟器 消息队列 数据库都运行在2核4G腾讯云服务器
测试每秒保存5000条的情况 约5.5小时保存了近1亿的经纬度
使用nginx把终端分配到多个808服务上 下发数据使用广播
存在则回复终端应答到新主题 不存在则忽略
使用自定义模拟器 可以轻松生成测试用的报文 有详情描述
把atop_cpu.png传输到ftp目录 (需要ftp服务)
快速开始 完整项目例子
package main
import (
"fmt"
"github.com/cuteLittleDevil/go-jt808/protocol/jt808"
"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.WithNetwork("tcp"),
service.WithCustomHandleFunc(func() map[consts.JT808CommandType]service.Handler {
return map[consts.JT808CommandType]service.Handler{
consts.T0200LocationReport: &meLocation{}, // 自定义0x0200位置解析等
}
}),
)
go client("1001", "127.0.0.1:808") // 模拟一个设备连接
goJt808.Run()
}
type meLocation struct {
model.T0x0200
}
func (l *meLocation) Parse(jtMsg *jt808.JTMessage) error {
return l.T0x0200.Parse(jtMsg)
}
func (l *meLocation) OnReadExecutionEvent(msg *service.Message) {
_ = l.Parse(msg.JTMessage)
fmt.Println(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(1 * 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数据库 |
| 序号 |
消息 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 |
✅ |
✅ |
文件上传完成消息应答 |