Score
0
Watch 16 Star 87 Fork 28

matrixy / jtt808-simulatorJava

Create your Gitee Account
Explore and code with more than 5 million developers,Free private repositories !:)
Sign up
基于JT/T 808协议实现的终端模拟程序 spread retract

  • Java 48.9%
  • CSS 22.3%
  • JavaScript 17.3%
  • FreeMarker 8.2%
  • HTML 2.9%
  • Other 0.4%
Clone or download
README.md 6.20 KB
Copy Edit Web IDE Raw Blame History
matrixy authored 2020-07-04 01:13 . 更新项目进度

jtt808-simulator

本项目为 JT/T808部标协议 终端模拟程序,通过模拟正常车辆的行驶轨迹、停留、报警触发等,可达到部标服务器的压力测试,以及业务数据处理(区域驶入驶出、超速、超时行驶等)的要求。后续还会继续加入 JT/T 1078 实时音视频等功能特性。最终目标是让模拟器更加可控,更加逼真。

注意:本项目正处于开发中,尚有很多不完善的地方,请谨慎使用。 另外,本项目直接使用百度地图所产生的坐标做行驶轨迹的模拟,所以在平台端再显示到地图上时,需要注意坐标系问题。

特性

  • 本项目使用 SpringBootMyBatisH2文件数据库
  • 并发连接控制,使用 netty 作为终端连接到服务器端的连接管理,目标是10万辆车在线。
  • 协议版本,暂时只支持 JT/T 808 2013 版本,后续再加入 JT/T 808 2019 版的支持。
  • 参数配置,现在提供的配置参数还比较少,只是必需的几个,后续会加入 0x8103 指令所支持的绝大部分参数的动态获取与设置。
  • 协议交互日志,在调试模式下,记录每辆模拟车辆与服务器端交互的所有消息记录,便于联调测试。
  • 轨迹模拟,通过百度地图API来规划行驶路线,在每次行驶前,都会随机化轨迹,以确保每一次走的都是同路但不同点。
  • 车辆实时交互,实时调阅模拟车辆的所有参数、查询状态,并且能够手动触发报警等。
  • JT/T 1078音视频传输支持,模拟视频终端,便于音视频的服务器端联调与开发。

注意:目前使用的是JT/T808 2013版的协议,并且是按照5秒的时间间隔发送位置消息。

使用指南

线路管理

创建一条行驶线路,用于车辆模拟运行时的位置上报的轨迹点模拟,模拟车辆在行驶时,将会随机化轨迹点,确保每一次行驶时的轨迹点都不一样。创建线路时,可以设置行驶的最高、最低行驶速度,以及停留点,报警事件(尚未实现)等。

行程任务

通过已经创建好的线路,创建临时的行驶行程任务,目前要填写的项多达五项(车牌号、终端ID、SIM卡号、服务器IP与端口),后面会简化并提供批量创建的功能用于压力测试。

实时监控

  1. 实时行驶轨迹
  2. 实时设置报警状态位与车辆状态标志位

扩展开发指南

结构

待补充

流程

待补充

接口

通过继承AbstractDriveTask实现的SimpleDriveTask,是一个简易的终端模拟控制程序,项目使用 EventLoop 思路实现多线程多任务的处理流程管理,主要分为以下两大类: 事件回调定时/延时任务

事件回调

1. 事件分类

定义于 EventEnum 类中,主要是TCP连接状态和服务器端消息,细分如下:

  • data_received:收到数据时
  • data_sent:数据发送时
  • connected:连接建立成功时
  • disconnected:连接断开时
  • send_failed:发送失败时
  • message_received:收到服务器端消息时
  • message_sent:消息发送成功时
  • message_ignored:服务器端消息被忽略时,即收到了不支持的消息时触发
  • user_interact:用户触发

上面的事件分类,只实现了三个,但是已经满足了绝大部分场合的需求,其它未实现的,有没有用都还不确定 ,有可能会在后续的实现过程中删除掉。

2. 事件的触发与执行调度

事件可能由多种条件触发,最终统一交由 EventDispatcher 进行调度,并由 LoopRunner 进行执行。特别需要注意的是,服务器端发送过来的消息,有特别的路由机制,因为主动下发的消息指令很多,不可能一一定义,所以我定义了以下的注解,用于对事件的进一步细节,如普通事件 connected 的监听如下代码:

@Listen(when = EventEnum.connected)
public void onConnected()
{
	// to do something when connected to server
}

但是像 message_received 事件,如果由开发者另行路由,就有点太臃肿了,所以我为 @Listen 注解增加了 attachment 参数,用于进一步细分,如监听 0x8801 摄像头立即拍摄命令,可按以下方式实现:

@Listen(when = EventEnum.message_received, attachment = "8801")
public void onCameraCaptureCommand(JTT808Message msg)
{
	// 完成抓拍并发送到服务器端的过程
    // 注意,上面的方法名称没有要求,随便命名即可,attachment的值要是消息ID。
}
3. 事件触发后的回调处理

因为在分派 LoopRunner 时,是按照 AbstractDriveTaskhashcode 进行分配线程,所以每一个 AbstractDriveTask 的方法,除了 init()startup 方法外,都是在同一个线程之中(包括定时/延时任务),大可不必担心线程安全问题。

定时/延时任务

目前提供了定时/延时任务的API,定时/延时任务的执行,也是由 LoopRunner 线程运行,它与上一章节的事件执行处于同一个线程之中,不需要关心线程安全问题,方法原型定义如下:

// 延时任务
/**
 * 在milliseconds毫秒后执行Exectable
 * @param executable 需要执行的任务
 * @param milliseconds 等待的毫秒
 */

public final void executeAfter(Executable executable, int milliseconds);

// 定时重复执行的任务
/**
 * 按照interval毫秒的间隔执行Exectable
 * @param executable 需要执行的任务
 * @param interval 间隔时间,单位毫秒
 */

public final void executeConstantly(Executable executable, int interval);

后记

QQ群

群号:808432702,欢迎入群,与一帮子做部标协议开发的小伙伴一起交流。

推荐

  1. 我的博客
  2. jtt1078-video-server 1078开源音视频服务器java实现
  3. JT/1078音视频传输协议开发指南
  4. JT/1078 RTP消息包在线解析工具

Comment ( 0 )

Sign in for post a comment

Java
1
https://gitee.com/matrixy/jtt808-simulator.git
git@gitee.com:matrixy/jtt808-simulator.git
matrixy
jtt808-simulator
jtt808-simulator
master

Search