go808

package module
v0.0.0-...-0f5426d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 27, 2021 License: MIT Imports: 24 Imported by: 0

README

部标 JT/T808(2013) 协议服务器

go808 是使用 Golang 语言开发的部标 JT/T808(2013) 协议服务器。此项目的目的是为了减少重复工作,加快开发速度。开发者无需关心 JT/T808 协议封包解包,自动进行字节流协议与结构体互转,只需专注具体业务的逻辑处理。

特点

易于扩展,开发者可自行添加自定义协议。

使用简单,几行代码即可启用一个支持 JT/T808 协议的服务器。

安装

$ go get gitee.com/coco/go808

示例

1. 上报位置
package main

import (
	"fmt"
	log "github.com/sirupsen/logrus"
	"gitee.com/coco/go808"
	"gitee.com/coco/go808/protocol"
	"gitee.com/coco/go808/protocol/extra"
)

// 处理上报位置
func handleReportLocation(session *go808.Session, message *protocol.Message) {
	// 打印消息
	entity := message.Body.(*protocol.T808_0x0200)
	fields := log.Fields{
		"IccID": message.Header.IccID,
		"警告":    fmt.Sprintf("0x%x", entity.Alarm),
		"状态":    fmt.Sprintf("0x%x", entity.Status),
		"纬度":    entity.Lat,
		"经度":    entity.Lng,
		"海拔":    entity.Altitude,
		"速度":    entity.Speed,
		"方向":    entity.Direction,
		"时间":    entity.Time,
	}

	for _, ext := range entity.Extras {
		switch ext.ID() {
		case extra.Extra_0x01{}.ID():
			fields["行驶里程"] = ext.(*extra.Extra_0x01).Value()
		case extra.Extra_0x02{}.ID():
			fields["剩余油量"] = ext.(*extra.Extra_0x02).Value()
		}
	}
	log.WithFields(fields).Info("上报终端位置信息")

	// 回复平台应答
	session.Reply(message, protocol.T808_0x8100_ResultSuccess)
}

func main() {
	server, _ := go808.NewServer(go808.Options{
		Keepalive:       60,
	})
	server.AddHandler(protocol.MsgT808_0x0200, handleReportLocation)
	server.Run("tcp", 8808)
}
2. 下发->应答回调
package main

import (
	"fmt"
	log "github.com/sirupsen/logrus"
	"gitee.com/coco/go808"
	"gitee.com/coco/go808/protocol"
)

// 处理终端鉴权
func handleAuthentication(session *go808.Session, message *protocol.Message) {
	// 回复平台应答
	session.Reply(message, protocol.T808_0x8100_ResultSuccess)

	// 查询终端参数
	session.Request(new(protocol.T808_0x8104), func(answer *protocol.Message) {
		response := answer.Body.(*protocol.T808_0x0104)
		for _, param := range response.Params {
			fmt.Println("参数ID", param.ID())
		}
	})
}

func main() {
	server, _ := go808.NewServer(go808.Options{
		Keepalive:       60,
	})
	server.AddHandler(protocol.MsgT808_0x0200, handleAuthentication)
	server.Run("tcp", 8808)
}
3. 分包合并
package main

import (
	log "github.com/sirupsen/logrus"
	"gitee.com/coco/go808"
	"gitee.com/coco/go808/protocol"
)

// 处理上传媒体
func handleUploadMediaPacket(session *go808.Session, message *protocol.Message) {
	entity := message.Body.(*protocol.T808_0x0801)

	// 读取完整数据包
	fullPacket := make([]byte, 1024*1024)
	entity.Packet.Read(fullPacket[:])

	session.Send(&protocol.T808_0x8800{
		MediaID: entity.MediaID,
	})
}

func main() {
	server, _ := go808.NewServer(go808.Options{
		Keepalive:       60,
		AutoMergePacket: true, // 自动合并分包
	})
	server.AddHandler(protocol.MsgT808_0x0801, handleUploadMediaPacket)
	server.Run("tcp", 8808)
}
4. 自定义协议

TODO...

开发进度

消息ID 消息名称 是否完成
0x0001 终端通用应答 √
0x8001 平台通用应答 √
0x0002 终端心跳 √
0x8003 补传分包请求 √
0x0100 终端注册 √
0x8100 终端注册应答 √
0x0003 终端注销 √
0x0102 终端鉴权 √
0x8103 设置终端参数 √
0x8104 查询终端参数 √
0x0104 查询终端参数应答 √
0x8105 终端控制 √
0x8106 查询指定终端参数 √
0x8107 查询终端属性 √
0x0107 查询终端属性应答 √
0x8108 下发终端升级包 √
0x0108 终端升级结果通知 √
0x0200 位置信息汇报 √
0x8201 位置信息查询 √
0x0201 位置信息查询应答 √
0x8202 临时位置跟踪控制 √
0x8203 人工确认报警消息 √
0x8300 文本信息下发 √
0x8301 事件设置 √
0x0301 事件报告 √
0x8302 提问下发 √
0x0302 提问应答 √
0x8303 信息点播菜单设置 √
0x0303 信息点播/取消 √
0x8304 信息服务 √
0x8400 电话回拨 √
0x8401 设置电话本 √
0x8500 车辆控制 √
0x0500 车辆控制应答 √
0x8600 设置圆形区域 √
0x8601 删除圆形区域 √
0x8602 设置矩形区域 √
0x8603 删除矩形区域 √
0x8604 设置多边形区域 √
0x8605 删除多边形区域 √
0x8606 设置路线 √
0x8607 删除路线 √
0x8700 行驶记录仪数据采集命令 √
0x0700 行驶记录仪数据上传 √
0x8701 行驶记录仪参数下传命令 √
0x0701 电子运单上报 √
0x0702 驾驶员身份信息采集上报 √
0x8702 上报驾驶员身份信息请求 √
0x0704 定位数据批量上传 √
0x0705 CAN 总线数据上传 √
0x0800 多媒体事件信息上传 √
0x0801 多媒体数据上传 √
0x8800 多媒体数据上传应答 √
0x8801 摄像头立即拍摄命令 √
0x0805 摄像头立即拍摄命令应答 √
0x8802 存储多媒体数据检索 √
0x0802 存储多媒体数据检索应答 √
0x8803 存储多媒体数据上传 √
0x8804 录音开始命令 √
0x8805 单条存储多媒体数据检索上传命令 √
0x8900 数据下行透传 √
0x0900 数据上行透传 √
0x0901 数据压缩上报 √
0x8A00 平台 RSA 公钥 √
0x0A00 终端 RSA 公钥 √

=======

jtt808

介绍

{以下是 Gitee 平台说明,您可以替换此简介 Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 https://gitee.com/enterprises}

软件架构

软件架构说明

安装教程
  1. xxxx
  2. xxxx
  3. xxxx
使用说明
  1. xxxx
  2. xxxx
  3. xxxx
参与贡献
  1. Fork 本仓库
  2. 新建 Feat_xxx 分支
  3. 提交代码
  4. 新建 Pull Request
特技
  1. 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md
  2. Gitee 官方博客 blog.gitee.com
  3. 你可以 https://gitee.com/explore 这个地址来了解 Gitee 上的优秀开源项目
  4. GVP 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
  5. Gitee 官方提供的使用手册 https://gitee.com/help
  6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 https://gitee.com/gitee-stars/

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func SetLogLevel

func SetLogLevel(level Level) error

设置日志级别

Types

type CountdownTimer

type CountdownTimer struct {
	// contains filtered or unexported fields
}

倒计时器

func NewCountdownTimer

func NewCountdownTimer(seconds int64, callback func(string)) *CountdownTimer

创建倒计时器

func (*CountdownTimer) Remove

func (timer *CountdownTimer) Remove(key string)

删除计时

func (*CountdownTimer) SetExpiration

func (timer *CountdownTimer) SetExpiration(seconds int64)

设置过期时间

func (*CountdownTimer) Update

func (timer *CountdownTimer) Update(key string)

更新时间

type Level

type Level string

日志等级

var (
	PanicLevel Level = "panic"
	FatalLevel Level = "fatal"
	ErrorLevel Level = "error"
	WarnLevel  Level = "warn"
	InfoLevel  Level = "info"
	DebugLevel Level = "debug"
	TraceLevel Level = "trace"
)

type MessageHandler

type MessageHandler func(*Session, *protocol.Message)

type MultipartFile

type MultipartFile struct {
	IccID uint64
	MsgID protocol.MsgID
	Tag   uint32
	Sum   uint16
}

多分包文件

func (MultipartFile) IsFull

func (m MultipartFile) IsFull() bool

是否完整

func (MultipartFile) Merge

func (m MultipartFile) Merge() (io.ReadCloser, error)

合并文件

func (MultipartFile) Write

func (m MultipartFile) Write(seq uint16, data []byte) error

写入分包文件

type Options

type Options struct {
	Keepalive       int64
	AutoMergePacket bool
	CloseHandler    func(*Session)
	PrivateKey      *rsa.PrivateKey
}

服务器选项

type Protocol

type Protocol struct {
	// contains filtered or unexported fields
}

func (Protocol) NewCodec

func (p Protocol) NewCodec(rw io.ReadWriter) (link.Codec, error)

创建编解码器

type ProtocolCodec

type ProtocolCodec struct {
	// contains filtered or unexported fields
}

编解码器

func (*ProtocolCodec) Close

func (codec *ProtocolCodec) Close() error

关闭读写

func (*ProtocolCodec) GetPublicKey

func (codec *ProtocolCodec) GetPublicKey() *rsa.PublicKey

获取RSA公钥

func (*ProtocolCodec) Receive

func (codec *ProtocolCodec) Receive() (interface{}, error)

接收消息

func (*ProtocolCodec) Send

func (codec *ProtocolCodec) Send(msg interface{}) error

发送消息

func (*ProtocolCodec) SetPublicKey

func (codec *ProtocolCodec) SetPublicKey(publicKey *rsa.PublicKey)

设置RSA公钥

type Server

type Server struct {
	// contains filtered or unexported fields
}

协议服务器

func NewServer

func NewServer(options Options) (*Server, error)

创建服务

func (*Server) AddHandler

func (server *Server) AddHandler(msgID protocol.MsgID, handler MessageHandler)

添加消息处理

func (*Server) Broadcast

func (server *Server) Broadcast(entity protocol.Entity) int

广播消息

func (*Server) GetPrivateKey

func (server *Server) GetPrivateKey() *rsa.PrivateKey

获取平台私钥

func (*Server) GetSession

func (server *Server) GetSession(id uint64) (*Session, bool)

获取Session

func (*Server) Run

func (server *Server) Run(network string, port int) error

运行服务

func (*Server) Stop

func (server *Server) Stop()

停止服务

type Session

type Session struct {
	UserData interface{}
	// contains filtered or unexported fields
}

终端会话

func (*Session) Close

func (session *Session) Close() error

关闭连接

func (*Session) GetPublicKey

func (session *Session) GetPublicKey() *rsa.PublicKey

获取RSA公钥

func (*Session) GetServer

func (session *Session) GetServer() *Server

获取服务实例

func (*Session) ID

func (session *Session) ID() uint64

获取ID

func (*Session) Reply

func (session *Session) Reply(msg *protocol.Message, result protocol.Result) (uint16, error)

回复消息

func (*Session) Reply8100

func (session *Session) Reply8100(msg *protocol.Message, result protocol.T808_0x8100_Result, authkey string) (uint16, error)

注册应答

func (*Session) Request

func (session *Session) Request(entity protocol.Entity, cb func(answer *protocol.Message)) (uint16, error)

发起请求

func (*Session) Send

func (session *Session) Send(entity protocol.Entity) (uint16, error)

发送消息

func (*Session) SetPublicKey

func (session *Session) SetPublicKey(publicKey *rsa.PublicKey)

设置RSA公钥

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL