diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/codec/netty/Jt808Handler.java b/src/main/java/com/genersoft/iot/vmp/jt1078/codec/netty/Jt808Handler.java index aa9ae00c6..59d77d706 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/codec/netty/Jt808Handler.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/codec/netty/Jt808Handler.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.jt1078.codec.netty; +import com.genersoft.iot.vmp.jt1078.event.ConnectChangeEvent; import com.genersoft.iot.vmp.jt1078.proc.response.Rs; import com.genersoft.iot.vmp.jt1078.session.Session; import com.genersoft.iot.vmp.jt1078.session.SessionManager; @@ -43,6 +44,13 @@ public class Jt808Handler extends ChannelInboundHandlerAdapter { Session session = SessionManager.INSTANCE.newSession(channel); channel.attr(Session.KEY).set(session); log.info("> Tcp connect {}", session); + if (session.getDevId() == null) { + return; + } + ConnectChangeEvent event = new ConnectChangeEvent(this); + event.setConnected(true); + event.setTerminalId(session.getDevId()); + applicationEventPublisher.publishEvent(event); } @Override @@ -50,8 +58,14 @@ public class Jt808Handler extends ChannelInboundHandlerAdapter { Session session = ctx.channel().attr(Session.KEY).get(); log.info("< Tcp disconnect {}", session); ctx.close(); + if (session.getDevId() == null) { + return; + } + ConnectChangeEvent event = new ConnectChangeEvent(this); + event.setConnected(false); + event.setTerminalId(session.getDevId()); + applicationEventPublisher.publishEvent(event); - applicationEventPublisher.publishEvent(); } @Override diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/dao/JTDeviceMapper.java b/src/main/java/com/genersoft/iot/vmp/jt1078/dao/JTDeviceMapper.java index f9932f3ef..ee5276953 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/dao/JTDeviceMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/dao/JTDeviceMapper.java @@ -88,4 +88,11 @@ public interface JTDeviceMapper { @Delete("delete from wvp_jt_device where terminal_id = #{terminalId}") void deleteDeviceByTerminalId(@Param("terminalId") String terminalId); + + @Update(value = {" "}) + void updateDeviceStatus(@Param("connected") boolean connected, @Param("terminalId") String terminalId); } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/event/ConnectChangeEvent.java b/src/main/java/com/genersoft/iot/vmp/jt1078/event/ConnectChangeEvent.java new file mode 100755 index 000000000..bdd916db8 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/event/ConnectChangeEvent.java @@ -0,0 +1,42 @@ +package com.genersoft.iot.vmp.jt1078.event; + +import com.genersoft.iot.vmp.jt1078.bean.JTDevice; +import org.springframework.context.ApplicationEvent; + +import java.time.Clock; + +/** + * 链接断或者连接的事件 + */ + +public class ConnectChangeEvent extends ApplicationEvent { + /** + * + */ + private static final long serialVersionUID = 1L; + + public ConnectChangeEvent(Object source) { + super(source); + } + + + private boolean connected; + + private String terminalId; + + public boolean isConnected() { + return connected; + } + + public void setConnected(boolean connected) { + this.connected = connected; + } + + public String getTerminalId() { + return terminalId; + } + + public void setTerminalId(String terminalId) { + this.terminalId = terminalId; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/event/eventListener/ConnectChangeEventListener.java b/src/main/java/com/genersoft/iot/vmp/jt1078/event/eventListener/ConnectChangeEventListener.java new file mode 100644 index 000000000..0f142fe6e --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/event/eventListener/ConnectChangeEventListener.java @@ -0,0 +1,34 @@ +package com.genersoft.iot.vmp.jt1078.event.eventListener; + +import com.genersoft.iot.vmp.jt1078.bean.JTDevice; +import com.genersoft.iot.vmp.jt1078.event.ConnectChangeEvent; +import com.genersoft.iot.vmp.jt1078.event.RegisterEvent; +import com.genersoft.iot.vmp.jt1078.proc.request.J0003; +import com.genersoft.iot.vmp.jt1078.service.Ijt1078Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +@Component +public class ConnectChangeEventListener implements ApplicationListener { + + private final static Logger log = LoggerFactory.getLogger(ConnectChangeEventListener.class); + + @Autowired + private Ijt1078Service service; + + @Override + public void onApplicationEvent(ConnectChangeEvent event) { + if (event.isConnected()) { + log.info("[JT-设备已连接] 终端ID: {}", event.getTerminalId()); + }else{ + log.info("[JT-设备连接已断开] 终端ID: {}", event.getTerminalId()); + } + JTDevice device = service.getDevice(event.getTerminalId()); + if (device != null) { + service.updateDeviceStatus(event.isConnected(), event.getTerminalId()); + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0100.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0100.java index accc4c124..35c54ba2d 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0100.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0100.java @@ -17,6 +17,7 @@ import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationEvent; import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import java.util.UUID; /** @@ -40,25 +41,18 @@ public class J0100 extends Re { if (version >= 1) { device.setCityId(buf.readUnsignedShort() + ""); // decode as 2019 - byte[] bytes11 = new byte[11]; - buf.readBytes(bytes11); - device.setMakerId(new String(bytes11).trim()); + device.setMakerId(buf.readCharSequence(11, Charset.forName("GBK")) + .toString().trim()); - byte[] bytes30 = new byte[30]; - buf.readBytes(bytes30); - device.setDeviceModel(new String(bytes30).trim()); + device.setDeviceModel(buf.readCharSequence(30, Charset.forName("GBK")) + .toString().trim()); - buf.readBytes(bytes30); - device.setDeviceId(new String(bytes30).trim()); + device.setDeviceId(buf.readCharSequence(30, Charset.forName("GBK")) + .toString().trim()); device.setPlateColor(buf.readByte()); - byte[] plateColorBytes = new byte[buf.readableBytes()]; - buf.readBytes(plateColorBytes); - try { - device.setPlateNo(new String(plateColorBytes, "GBK").trim()); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + device.setPlateNo(buf.readCharSequence(buf.readableBytes(), Charset.forName("GBK")) + .toString().trim()); } else { // decode as 2013 device.setCityId(buf.readUnsignedShort() + ""); diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0102.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0102.java index 8510dd71d..df09635bb 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0102.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0102.java @@ -1,14 +1,18 @@ package com.genersoft.iot.vmp.jt1078.proc.request; import com.genersoft.iot.vmp.jt1078.annotation.MsgId; +import com.genersoft.iot.vmp.jt1078.bean.JTDevice; import com.genersoft.iot.vmp.jt1078.proc.Header; import com.genersoft.iot.vmp.jt1078.proc.response.J8001; import com.genersoft.iot.vmp.jt1078.proc.response.Rs; import com.genersoft.iot.vmp.jt1078.service.Ijt1078Service; import com.genersoft.iot.vmp.jt1078.session.Session; import io.netty.buffer.ByteBuf; +import io.netty.util.CharsetUtil; import org.springframework.context.ApplicationEvent; +import java.nio.charset.Charset; + /** * 终端鉴权 * @@ -18,20 +22,31 @@ import org.springframework.context.ApplicationEvent; */ @MsgId(id = "0102") public class J0102 extends Re { + + private String authenticationCode; + @Override protected Rs decode0(ByteBuf buf, Header header, Session session) { int lenCode = buf.readUnsignedByte(); -// String code = buf.readCharSequence(lenCode, CharsetUtil.UTF_8).toString(); + byte[] authenticationCodeBytes = new byte[lenCode]; +// ByteBuf byteBuf = buf.readBytes(authenticationCodeBytes); + authenticationCode = buf.readCharSequence(lenCode, Charset.forName("GBK")).toString(); + System.out.println("设备鉴权: authenticationCode: " + authenticationCode); // if 2019 to decode next return null; } @Override protected Rs handler(Header header, Session session, Ijt1078Service service) { + JTDevice device = service.getDevice(header.getTerminalId()); J8001 j8001 = new J8001(); j8001.setRespNo(header.getSn()); j8001.setRespId(header.getMsgId()); - j8001.setResult(J8001.SUCCESS); + if (device == null || !device.getAuthenticationCode().equals(authenticationCode)) { + j8001.setResult(J8001.FAIL); + }else { + j8001.setResult(J8001.SUCCESS); + } return j8001; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0200.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0200.java index 2152be875..235198622 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0200.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0200.java @@ -20,6 +20,7 @@ import org.springframework.context.ApplicationEvent; public class J0200 extends Re { @Override protected Rs decode0(ByteBuf buf, Header header, Session session) { + return null; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8001.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8001.java index ec9e31f19..2072400b6 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8001.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J8001.java @@ -12,8 +12,15 @@ import io.netty.buffer.Unpooled; */ @MsgId(id = "8001") public class J8001 extends Rs { + public static final Integer SUCCESS = 0; + public static final Integer FAIL = 1; + + public static final Integer ERROR = 2; + public static final Integer NOT_SUPPORTED = 3; + public static final Integer ALARM_ACK = 3; + Integer respNo; String respId; Integer result; diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java index 02dc78d5f..85b38428e 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java @@ -15,4 +15,6 @@ public interface Ijt1078Service { void addDevice(JTDevice device); void deleteDeviceByDeviceId(String deviceId); + + void updateDeviceStatus(boolean connected, String terminalId); } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java index 3a68b6d48..86be01f70 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java @@ -47,4 +47,9 @@ public class jt1078ServiceImpl implements Ijt1078Service { public void deleteDeviceByDeviceId(String deviceId) { jtDeviceMapper.deleteDeviceByTerminalId(deviceId); } + + @Override + public void updateDeviceStatus(boolean connected, String terminalId) { + jtDeviceMapper.updateDeviceStatus(connected, terminalId); + } }