您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

9.1 KiB

JT808DotNetty

基于DotNetty封装的JT808DotNetty专注消息业务处理

了解JT808协议进这边

了解JT809协议进这边

玩一玩压力测试

MIT Licence

新网关的优势:

  1. 跨平台
  2. 借助 .NET Core模块化的思想
  3. 单机同时一万辆车在线不是梦(真有一万辆车那都很吃香了<( ̄3 ̄)> <( ̄3 ̄)> <( ̄3 ̄)> )
  4. 简单易上手

设计模型

design_model

NuGet安装

Package Name Version Downloads
Install-Package JT808DotNetty JT808DotNetty JT808DotNetty

集成功能实现

1.集成原包分发器

功能 说明 使用场景
ISourcePackageDispatcher 原包分发器(支持热更新、断线重连) 需要将原数据转给其他平台

2.集成WebApi服务器

2.1.统一下发设备消息服务 IJT808UnificationSendService

2.2.管理会话服务 IJT808SessionService

2.3.消息包计数服务 JT808AtomicCounterService 接口尚未实现

3.集成业务消息处理程序

功能 说明 使用场景
JT808MsgIdHandlerBase 业务消息处理程序 需要自定义实现业务消息处理程序

举个栗子1

1.实现业务消息处理程序JT808MsgIdHandlerBase

using JT808.DotNetty;
public class JT808MsgIdCustomHandler : JT808MsgIdHandlerBase
{
    private readonly ILogger<JT808MsgIdCustomHandler> logger;

    public JT808MsgIdCustomHandler(ILoggerFactory loggerFactory,
        JT808SessionManager sessionManager) : base(sessionManager)
    {
        logger = loggerFactory.CreateLogger<JT808MsgIdCustomHandler>();
    }

    public override JT808Response Msg0x0102(JT808Request request)
    {
        logger.LogDebug("Msg0x0102");
        return base.Msg0x0102(request);
    }
}

2.自定义业务消息处理程序替换默认实现

services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHandlerBase), typeof(JT808MsgIdCustomHandler), ServiceLifetime.Singleton));

3.使用JT808 Host

  UseJT808Host()

4.完整示例

// 默认网关端口:808
// 默认webapi端口:828
static async Task Main(string[] args)
{
    var serverHostBuilder = new HostBuilder()
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory);
            config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        })
        .ConfigureLogging((context, logging) =>
        {
            logging.AddConsole();  
            logging.SetMinimumLevel(LogLevel.Error);
        })
        .ConfigureServices((hostContext, services) =>
        {
            services.AddSingleton<ILoggerFactory, LoggerFactory>();
            services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
            services.Replace(new ServiceDescriptor(typeof(JT808MsgIdHandlerBase), typeof(JT808MsgIdCustomHandler), ServiceLifetime.Singleton));
        })
        .UseJT808Host();
    await serverHostBuilder.RunConsoleAsync();
}

提供WebApi接口服务(默认端口828)

基地址:http://localhost:828/jt808api/

数据格式:只支持Json格式

统一对象返回 JT808ResultDto<T>

属性 数据类型 参数说明
Message string 消息描述
Code int 状态码
Data T(泛型) 数据

返回Code[状态码]说明:

状态码 说明
200 返回成功
201 内容为空
404 没有该服务
500 服务内部错误

统一下发设备消息接口

请求地址:UnificationSend

请求方式:POST

请求参数:

属性 数据类型 参数说明
TerminalPhoneNo string 设备终端号
Data byte[] JT808 byte[]数组

返回数据:

属性 数据类型 参数说明
Data bool 是否成功

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":true
}

会话服务接口

统一会话信息对象返回 JT808SessionInfoDto
属性 数据类型 参数说明
ChannelId string 通道Id
LastActiveTime DateTime 最后上线时间
StartTime DateTime 上线时间
TerminalPhoneNo string 终端手机号
1.获取实际连接数(存在其他平台转发过来的数据,这时候通道Id和设备属于一对多的关系)

请求地址:Session/GetRealLinkCount

请求方式:GET

返回数据:

属性 数据类型 参数说明
Data int 实际连接数

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":10
}
2.获取设备相关连的连接数

请求地址:Session/GetRelevanceLinkCount

请求方式:GET

返回数据:

属性 数据类型 参数说明
Data int 设备相关连的连接数

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":10
}
3.获取实际会话集合

请求地址:Session/GetRealAll

请求方式:GET

返回数据:

属性 数据类型 参数说明
Data List<JT808SessionInfoDto> 实际会话信息集合

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":[
        {
            "ChannelId":"eadad23",
            "LastActiveTime":"2018-11-27 20:00:00",
            "StartTime":"2018-11-25 20:00:00",
            "TerminalPhoneNo":"123456789012"
        },{
            "ChannelId":"eadad23",
            "LastActiveTime":"2018-11-27 20:00:00",
            "StartTime":"2018-11-25 20:00:00",
            "TerminalPhoneNo":"123456789013"
        }
    ]
}
4.获取设备相关联会话集合

请求地址:Session/GetRelevanceAll

请求方式:

返回数据:

属性 数据类型 参数说明
Data List<JT808SessionInfoDto> 设备相关联会话信息集合

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":[
        {
            "ChannelId":"eadad23",
            "LastActiveTime":"2018-11-27 20:00:00",
            "StartTime":"2018-11-25 20:00:00",
            "TerminalPhoneNo":"123456789012"
        }, {
            "ChannelId":"eadad24",
            "LastActiveTime":"2018-11-26 20:00:00",
            "StartTime":"2018-11-22 20:00:00",
            "TerminalPhoneNo":"123456789013"
        }
    ]
}
5.通过通道Id移除对应会话

请求地址:Session/RemoveByChannelId

请求方式:POST

请求参数:

属性 数据类型 参数说明
channelId string 通道Id
返回数据:
属性 数据类型 参数说明
:------: :------: :------
Data bool 是否成功

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":true
}
6.通过设备终端号移除对应会话

请求地址:Session/RemoveByTerminalPhoneNo

请求方式:POST

请求参数:

属性 数据类型 参数说明
terminalPhoneNo string 设备终端号

返回数据:

属性 数据类型 参数说明
Data bool 是否成功

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":true
}
7.通过通道Id获取会话信息

请求地址:Session/GetByChannelId

请求方式:POST

请求参数:

属性 数据类型 参数说明
channelId string 通道Id

返回数据:

属性 数据类型 参数说明
Data JT808SessionInfoDto 会话信息对象

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":{
        "ChannelId":"eadad24",
        "LastActiveTime":"2018-11-26 20:00:00",
        "StartTime":"2018-11-22 20:00:00",
        "TerminalPhoneNo":"123456789013"
    }
}
8.通过设备终端号获取会话信息

请求地址:Session/GetByTerminalPhoneNo

请求方式:POST

请求参数:

属性 数据类型 参数说明
terminalPhoneNo string 设备终端号

返回数据:

属性 数据类型 参数说明
Data JT808SessionInfoDto 会话信息对象

返回结果:

{
    "Message":"",
    "Code":200,
    "Data":{
        "ChannelId":"eadad24",
        "LastActiveTime":"2018-11-26 20:00:00",
        "StartTime":"2018-11-22 20:00:00",
        "TerminalPhoneNo":"123456789013"
    }
}