同步操作将从 衷于栖/中国交通标准808协议解析二次开发包 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
这个二次开发包是基于作者之前做过项目的源码改造的,那个时候使用不是很标准,仅仅是解析车辆定位数据, 并没有实现所有的内容。现在有时间终于可以重构一下原来的项目源码。
auth
以及 authMsgId
用于控制权限DataService
接口有变动,重新实现 terminalLocation
、mediaPackage
两个方法即可。
连个接口增加了参数 mediaId,用于 0x0801 多媒体数据上传 时,连接多媒体消息、定位数据以及实体数据。
下面是基于maven简短的开发使用步骤,详细还请访问直播录屏
<dependency>
<groupId>com.zhoyq</groupId>
<artifactId>spring-boot-starter-jt808</artifactId>
<version>1.3.2</version>
</dependency>
@EnableJt808Server
注解。@SpringBootApplication
@EnableJt808Server
public class Application {
public static void main (String[] args) {
var app = new SpringApplication(Application.class);
// 不使用web容器 仅启动jt808服务
app.setWebApplicationType(WebApplicationType.NONE);
app.run(args);
}
}
import com.zhoyq.server.jt808.starter.service.DataService;
@Component
public class SimpleDataService implements DataService{}
application.yml
中添加配置:jt808:
enabled: true
use: mina
protocol: tcp
port: 10001
processCount: 2
corePoolSize: 1
maximumPoolSize: 10
# 单位毫秒
keepAliveTime: 1000
# 单位秒
idleTime: 10
idleCount: 6
readBufferSize: 2048
packageLength: 1024
threadCorePoolSize: 1
threadMaximumPoolSize: 10
# 单位毫秒
threadKeepAliveTime: 1000
masterSize: 1
slaveSize: 10
tcpNoDelay: true
keepAlive: true
auth: true
authMsgId: "0100,0102"
至此,启动程序,祝生活愉快。
因为很多时候处理逻辑并不是那么严谨,还是有需要自定义一些常规逻辑所以开放了对于单条命令的扩展方式,本节目标是使用自定义心跳包扩展,放弃原有心跳包逻辑定义。 只需要定义一个类即可,如下:
import com.zhoyq.server.jt808.starter.core.Jt808Pack;
import com.zhoyq.server.jt808.starter.core.PackHandler;
import com.zhoyq.server.jt808.starter.helper.ResHelper;
import lombok.extern.slf4j.Slf4j;
/**
* 0x0002 终端心跳
*/
@Slf4j
@Jt808Pack(msgId = 0x0002)
public class HeartbeatPackHandler implements PackHandler {
@Override
public byte[] handle(byte[] phoneNum, byte[] streamNum, byte[] msgId, byte[] msgBody) {
log.info("new heartbeat.");
return ResHelper.getPlatAnswer(phoneNum, streamNum, msgId, (byte) 0x00);
}
}
当然,应答需要自己组织,开发包里也提供了工具类 ResHelper
,只要定义好类,实现 PackHandler
接口并且使用 @Jt808Pack
注解即可。
当然也可以使用这种方式定义协议之外的消息,比如使用保留的消息位定义用户自己的消息类型。
答:首先,程序本身实现了鉴权逻辑,在没有进行终端注册和鉴权的情况下只接受这两个消息,并且返回失败应答;
其次,第一次进行终端注册的时候,会调用 DataService.terminalRegister
进行终端注册,此时返回的字符串就是鉴权码,
鉴权码会被缓存(推荐使用redis
,使用默认的 hashmap
会在重启后丢失鉴权信息),并在终端鉴权时使用,
如果没有实现 DataService.terminalRegister
这部分逻辑,也会导致失败应答;
最后,我在 1.2.4
版本之后加入了权限控制可选配置 auth
和 authMagId
选项,auth
代表是否检查权限,authMsgId
代表
权限开启时,可以不需要权限就访问的消息ID。这样就可以自己控制需要的权限了。
// ...
import com.zhoyq.server.jt808.starter.core.SessionManagement;
@RestController
public class TestController {
private SessionManagement session;
public TestController(SessionManagement session) {
this.session = session;
}
@GetMapping("/test")
public String test(String sim, byte[] data) {
// data 是不包含校验码以及转义的数据 因为发送之前会自动添加校验码以及转义数据
session.write(sim, data);
return "下发指令成功";
}
}
目前的规则就是按照版本滚动更新,旧版本(包含发布版本)不会提供升级补丁或者更新pr,作者升级会考虑兼容性,也会给出解决方案,
所以还是手动升级到最新版本比较好。另外,新的PR可以提交到 develop
分支 ( 如果能提交到 github 就更好了 ),其他分支(已经固定)暂时不接受 PR
提交。
二次开发包使用 MIT 授权
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。