Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
traffic-signal-platform
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
signal
traffic-signal-platform
Commits
723cd832
Commit
723cd832
authored
Jan 12, 2024
by
duanruiming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[update] 优化海信灯态数据;添加海信TCP协议;
parent
90c413f7
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
138 additions
and
22 deletions
+138
-22
HisenseApplication.java
...c/main/java/net/wanji/utc/hisense/HisenseApplication.java
+1
-2
DataBrainControlModeEnum.java
...ji/utc/hisense/common/enums/DataBrainControlModeEnum.java
+1
-1
TcpClient.java
.../src/main/java/net/wanji/utc/hisense/netty/TcpClient.java
+88
-0
CommandResultSign.java
...anji/utc/hisense/netty/commandsign/CommandResultSign.java
+4
-4
TcpClientHandler.java
...net/wanji/utc/hisense/netty/handler/TcpClientHandler.java
+13
-0
SystemScriptionRequest.java
...nji/utc/hisense/pojo/xml/pojo/SystemScriptionRequest.java
+6
-6
HeartBeatRequest.java
...isense/pojo/xml/pojo/messagecontent/HeartBeatRequest.java
+1
-1
SignalStatusServiceImpl.java
...nji/utc/hisense/service/impl/SignalStatusServiceImpl.java
+12
-5
XMLUtils.java
...ce/src/main/java/net/wanji/utc/hisense/util/XMLUtils.java
+9
-1
application-police.yaml
...isense-service/src/main/resources/application-police.yaml
+3
-2
No files found.
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/HisenseApplication.java
View file @
723cd832
package
net
.
wanji
.
utc
.
hisense
;
import
net.wanji.utc.hisense.netty.TcpClient
;
import
org.mybatis.spring.annotation.MapperScan
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.CommandLineRunner
;
...
...
@@ -33,6 +32,6 @@ public class HisenseApplication implements CommandLineRunner {
@Override
public
void
run
(
String
...
args
)
throws
Exception
{
//UdpClient.connection(localPort, remoteProt);
TcpClient
.
connection
(
remoteIp
,
remoteProt
);
//
TcpClient.connection(remoteIp, remoteProt);
}
}
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/common/enums/DataBrainControlModeEnum.java
View file @
723cd832
...
...
@@ -36,6 +36,6 @@ public enum DataBrainControlModeEnum {
return
value
.
getWjControl
();
}
}
return
null
;
return
11
;
// 默认定周期
}
}
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/netty/TcpClient.java
View file @
723cd832
package
net
.
wanji
.
utc
.
hisense
.
netty
;
import
cn.hutool.core.util.HexUtil
;
import
io.netty.bootstrap.Bootstrap
;
import
io.netty.buffer.Unpooled
;
import
io.netty.channel.Channel
;
import
io.netty.channel.ChannelFuture
;
import
io.netty.channel.ChannelInitializer
;
import
io.netty.channel.EventLoopGroup
;
import
io.netty.channel.nio.NioEventLoopGroup
;
import
io.netty.channel.socket.DatagramPacket
;
import
io.netty.channel.socket.nio.NioSocketChannel
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.utc.hisense.cache.CrossInfoCache
;
import
net.wanji.utc.hisense.cache.netty.NettyMessageCache
;
import
net.wanji.utc.hisense.common.enums.xml.MessageTypeEnum
;
import
net.wanji.utc.hisense.netty.codec.MessageDecoder
;
import
net.wanji.utc.hisense.netty.codec.MessageEnCoder
;
import
net.wanji.utc.hisense.netty.handler.TcpClientHandler
;
import
net.wanji.utc.hisense.pojo.netty.MessageResultPojo
;
import
net.wanji.utc.hisense.pojo.xml.pojo.messagecontent.HeartBeatRequest
;
import
net.wanji.utc.hisense.util.XMLUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.net.InetSocketAddress
;
import
java.time.LocalDateTime
;
import
java.time.ZoneOffset
;
import
java.util.concurrent.CountDownLatch
;
import
java.util.concurrent.TimeUnit
;
/**
* @author duanruiming
* @date 2024/01/08 17:33
...
...
@@ -18,6 +39,10 @@ import org.springframework.stereotype.Component;
@Slf4j
@Component
public
class
TcpClient
{
private
static
ChannelFuture
tcpChannelFuture
=
null
;
@Resource
(
name
=
"commonThreadPoolExecutor"
)
private
ThreadPoolTaskExecutor
commonThreadPoolExecutor
;
public
static
void
connection
(
String
host
,
int
port
)
throws
Exception
{
EventLoopGroup
group
=
new
NioEventLoopGroup
();
// 创建线程组
try
{
...
...
@@ -29,15 +54,78 @@ public class TcpClient {
protected
void
initChannel
(
Channel
ch
)
throws
Exception
{
//ch.pipeline().addLast(new XmlMessageDecoder()); // 添加自定义的解码器
//ch.pipeline().addLast(new XmlMessageEncoder()); // 添加自定义的编码器
ch
.
pipeline
().
addLast
(
new
MessageDecoder
());
ch
.
pipeline
().
addLast
(
new
MessageEnCoder
());
ch
.
pipeline
().
addLast
(
new
TcpClientHandler
());
// 添加自定义的处理器
}
});
// 启动客户端,连接到服务器端,并同步,生成ChannelFuture对象
ChannelFuture
f
=
b
.
connect
(
host
,
port
).
sync
();
tcpChannelFuture
=
f
;
// 对关闭通道进行监听
f
.
channel
().
closeFuture
().
sync
();
}
finally
{
group
.
shutdownGracefully
();
// 关闭线程组
}
}
public
static
void
sendMessage
(
String
ip
,
Integer
port
,
String
msg
)
{
byte
[]
bytes
=
HexUtil
.
decodeHex
(
msg
);
try
{
if
(
tcpChannelFuture
==
null
)
{
return
;
}
tcpChannelFuture
.
channel
()
.
writeAndFlush
(
new
DatagramPacket
(
Unpooled
.
copiedBuffer
(
bytes
),
new
InetSocketAddress
(
ip
,
port
))).
sync
();
log
.
debug
(
"发送信号机:{}/{}命令消息:{}"
,
ip
,
port
,
msg
);
}
catch
(
InterruptedException
e
)
{
log
.
error
(
"sendMsg is error"
,
e
);
}
}
public
static
MessageResultPojo
sendMessage
(
String
ip
,
Integer
port
,
String
msg
,
String
command
,
int
timeout
)
{
try
{
if
(
timeout
>
0
)
{
CountDownLatch
countDownLatch
=
new
CountDownLatch
(
1
);
String
key
=
StringUtils
.
join
(
"/"
,
ip
,
":"
,
port
,
"/"
,
command
);
long
now
=
LocalDateTime
.
now
().
toInstant
(
ZoneOffset
.
of
(
"+8"
)).
toEpochMilli
();
MessageResultPojo
messageResultPojo
=
new
MessageResultPojo
(
command
,
countDownLatch
,
now
,
timeout
,
null
);
NettyMessageCache
.
NETTY_RESULT_TIMEOUT_MAP
.
put
(
key
,
messageResultPojo
);
NettyMessageCache
.
COMMAND_RESULT_SIGN_MAP
.
put
(
key
,
CrossInfoCache
.
getCrossInfoByIp
(
ip
));
sendMessage
(
ip
,
port
,
msg
);
countDownLatch
.
await
(
timeout
,
TimeUnit
.
MILLISECONDS
);
return
NettyMessageCache
.
NETTY_RESULT_TIMEOUT_MAP
.
remove
(
key
);
}
}
catch
(
InterruptedException
e
)
{
log
.
error
(
"sendMsg is error"
,
e
);
}
return
null
;
}
@Scheduled
(
fixedRate
=
300
)
public
void
checkWaitTimeout
()
{
long
now
=
LocalDateTime
.
now
().
toInstant
(
ZoneOffset
.
of
(
"+8"
)).
toEpochMilli
();
NettyMessageCache
.
NETTY_RESULT_TIMEOUT_MAP
.
forEach
((
k
,
v
)
->
{
commonThreadPoolExecutor
.
execute
(()
->
{
if
(
now
-
v
.
getStartTime
()
>
v
.
getWaitMillisecond
())
{
log
.
warn
(
"wait {}ms [{}] timeout"
,
v
.
getWaitMillisecond
(),
k
);
v
.
getCountDownLatch
().
countDown
();
}
});
});
}
@Scheduled
(
fixedRate
=
1000
*
20
)
public
void
hearBeat
()
throws
Exception
{
try
{
HeartBeatRequest
heartBeatRequest
=
new
HeartBeatRequest
();
heartBeatRequest
.
setMessageType
(
MessageTypeEnum
.
HEARTBEAT_STATUS
.
getType
());
log
.
error
(
"心跳消息:{}"
,
XMLUtils
.
convertToXml
(
heartBeatRequest
));
tcpChannelFuture
.
channel
().
writeAndFlush
(
XMLUtils
.
strToHex
(
XMLUtils
.
convertToXml
(
heartBeatRequest
)));
}
catch
(
Exception
e
)
{
log
.
error
(
"每20秒心跳发送失败:"
,
e
);
throw
new
Exception
(
e
);
}
}
}
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/netty/commandsign/CommandResultSign.java
View file @
723cd832
package
net
.
wanji
.
utc
.
hisense
.
netty
.
commandsign
;
import
com.alibaba.fastjson.JSON
;
import
net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo
;
import
net.wanji.utc.hisense.util.XMLUtils
;
/**
* @author duanruiming
...
...
@@ -9,9 +9,9 @@ import net.wanji.utc.hisense.pojo.convert.RunningLightsStatusPojo;
*/
public
class
CommandResultSign
{
public
static
Object
getHexSign
(
String
data
)
{
Object
runningLightsStatusPojo
=
JSON
.
parseObject
(
data
,
RunningLightsStatusPojo
.
class
);
return
runningLightsStatusPojo
;
public
static
Object
getHexSign
(
String
data
)
throws
Exception
{
//
Object runningLightsStatusPojo = JSON.parseObject(data, RunningLightsStatusPojo.class);
return
XMLUtils
.
convertXmlStrToObject
(
RunningLightsStatusPojo
.
class
,
data
)
;
}
}
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/netty/handler/TcpClientHandler.java
View file @
723cd832
...
...
@@ -21,6 +21,7 @@ import org.springframework.stereotype.Component;
import
java.net.InetSocketAddress
;
import
java.nio.charset.StandardCharsets
;
import
java.util.Date
;
import
java.util.Map
;
import
java.util.Objects
;
...
...
@@ -32,6 +33,12 @@ import java.util.Objects;
@Component
public
class
TcpClientHandler
extends
SimpleChannelInboundHandler
<
DatagramPacket
>
{
@Override
public
void
channelActive
(
ChannelHandlerContext
ctx
)
throws
Exception
{
log
.
info
(
"海信服务连接成功:{}"
,
ctx
.
channel
());
ctx
.
fireChannelActive
();
}
/**
* 读取消息
*
...
...
@@ -94,4 +101,10 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<DatagramPacket
@Override
public
void
exceptionCaught
(
ChannelHandlerContext
ctx
,
Throwable
cause
)
throws
Exception
{
}
public
static
void
main
(
String
[]
args
)
{
Date
date
=
new
Date
(
1705024396764L
);
System
.
err
.
println
(
date
);
}
}
\ No newline at end of file
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/pojo/xml/pojo/SystemScriptionRequest.java
View file @
723cd832
...
...
@@ -24,8 +24,8 @@ public class SystemScriptionRequest implements Serializable {
// 实体类属性
// 子系统,海信接口服务器向外部系统发送时为Hisense
@XmlElement
(
name
=
"subSystem"
,
defaultValue
=
""
)
private
String
subSystem
;
@XmlElement
(
name
=
"subSystem"
,
defaultValue
=
"
Hisense
"
)
private
String
subSystem
=
"Hisense"
;
/**
* {@link MessageTypeEnum}
*/
...
...
@@ -33,18 +33,18 @@ public class SystemScriptionRequest implements Serializable {
private
int
messageType
;
// 1-请求 0-应答
@XmlElement
(
name
=
"isRequest"
,
defaultValue
=
""
)
private
String
isRequest
;
private
String
isRequest
=
""
;
// seq唯一,长度固定20, 采用YYYYMMDDHHMMSS + 6位顺序号,不足前补0
@XmlElement
(
name
=
"seq"
,
defaultValue
=
""
)
private
String
seq
;
// 是否需要应答,1-需要 0-不需要
@XmlElement
(
name
=
"needResponse"
,
defaultValue
=
""
)
private
int
needResponse
;
private
String
needResponse
=
""
;
// 针对所有消息, 1-成功 0-失败
@XmlElement
(
name
=
"result"
,
defaultValue
=
""
)
private
String
result
;
private
String
result
=
""
;
// 保留
@XmlElement
(
name
=
"flag"
,
defaultValue
=
""
)
private
boolean
flag
;
private
String
flag
=
""
;
}
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/pojo/xml/pojo/messagecontent/HeartBeatRequest.java
View file @
723cd832
...
...
@@ -16,7 +16,7 @@ import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
(
name
=
"systemScription"
)
public
class
HeartBeatRequest
extends
SystemScriptionRequest
{
private
HeartBeatContent
messageContent
;
private
HeartBeatContent
messageContent
=
new
HeartBeatContent
()
;
@Data
public
static
class
HeartBeatContent
{
}
...
...
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/service/impl/SignalStatusServiceImpl.java
View file @
723cd832
...
...
@@ -20,6 +20,7 @@ import net.wanji.utc.hisense.pojo.convert.HisenseLightStatusPojo;
import
net.wanji.utc.hisense.pojo.dto.CrossSchemePhaseCountDownDTO
;
import
net.wanji.utc.hisense.pojo.dto.PhaseCountDownDTO
;
import
net.wanji.utc.hisense.service.SignalStatusService
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
...
...
@@ -160,6 +161,7 @@ public class SignalStatusServiceImpl implements SignalStatusService {
int
runTime
=
period
-
cycleCountDown
;
int
planId
=
(
content
.
getPlanId
()
+
2
)
/
3
;
lightsStatusVO
.
setCrossId
(
crossId
);
lightsStatusVO
.
setCode
(
crossInfo
.
getCode
());
lightsStatusVO
.
setSchemeId
(
String
.
valueOf
(
planId
));
String
runMode
=
String
.
valueOf
(
DataBrainControlModeEnum
.
getWjControlMode
(
hiControlMode
));
lightsStatusVO
.
setRunMode
(
runMode
);
...
...
@@ -173,8 +175,9 @@ public class SignalStatusServiceImpl implements SignalStatusService {
lightsStatusVO
.
setManufacturerCode
(
"Hisense"
);
lightsStatusVO
.
setPhasePlanId
(
String
.
valueOf
(
planId
));
List
<
CrossSchemePhaseCountDownDTO
>
crossSchemePhaseCountDownList
=
CrossSchemePhaseTimeCountCache
.
crossSchemePhaseCountDownList
;
setLightsStatusVOPhaseNoAndCountDown
(
lightsStatusVO
,
crossId
,
runTime
,
planId
,
crossSchemePhaseCountDownList
);
SignalDataCache
.
runningStateInfoCacheNoLamp
.
put
(
crossId
,
lightsStatusVO
);
LightsStatusVO
lightsStatusVOCurrent
=
setLightsStatusVOPhaseNoAndCountDown
(
lightsStatusVO
,
crossId
,
runTime
,
planId
,
crossSchemePhaseCountDownList
);
log
.
error
(
"周期倒计时值:{}"
,
crossId
+
lightsStatusVOCurrent
.
getCyclePhaseCountDown
());
SignalDataCache
.
runningStateInfoCacheNoLamp
.
put
(
crossId
,
lightsStatusVOCurrent
);
}
}
}
...
...
@@ -189,8 +192,9 @@ public class SignalStatusServiceImpl implements SignalStatusService {
* @param planId
* @param crossSchemePhaseCountDownList
*/
private
static
void
setLightsStatusVOPhaseNoAndCountDown
(
LightsStatusVO
lightsStatusVO
,
String
crossId
,
int
runTime
,
int
planId
,
List
<
CrossSchemePhaseCountDownDTO
>
crossSchemePhaseCountDownList
)
{
private
static
LightsStatusVO
setLightsStatusVOPhaseNoAndCountDown
(
LightsStatusVO
lightsStatusVO
,
String
crossId
,
int
runTime
,
int
planId
,
List
<
CrossSchemePhaseCountDownDTO
>
crossSchemePhaseCountDownList
)
{
if
(!
CollectionUtils
.
isEmpty
(
crossSchemePhaseCountDownList
))
{
LightsStatusVO
lightsStatusVOTemp
=
new
LightsStatusVO
();
for
(
CrossSchemePhaseCountDownDTO
dto
:
crossSchemePhaseCountDownList
)
{
String
crossIdCache
=
dto
.
getCrossId
();
String
schemeNoCache
=
dto
.
getSchemeNo
();
...
...
@@ -208,11 +212,14 @@ public class SignalStatusServiceImpl implements SignalStatusService {
}
lastPhaseCountTime
=
changePhaseTime
;
}
lightsStatusVO
.
setPhaseId
(
phaseNo
);
lightsStatusVO
.
setCyclePhaseCountDown
(
phaseTimeCountDown
);
BeanUtils
.
copyProperties
(
lightsStatusVO
,
lightsStatusVOTemp
);
lightsStatusVOTemp
.
setPhaseId
(
phaseNo
);
lightsStatusVOTemp
.
setCyclePhaseCountDown
(
phaseTimeCountDown
);
return
lightsStatusVOTemp
;
}
}
}
return
null
;
}
/**
...
...
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/util/XMLUtils.java
View file @
723cd832
...
...
@@ -67,7 +67,7 @@ public class XMLUtils {
logOnMessageContent
.
setMessageContent
(
body
);
logOnMessageContent
.
setSubSystem
(
"Hisense"
);
logOnMessageContent
.
setFlag
(
Boolean
.
TRUE
);
logOnMessageContent
.
setFlag
(
"0"
);
logOnMessageContent
.
setIsRequest
(
""
);
System
.
err
.
println
(
convertToXml
(
logOnMessageContent
));
...
...
@@ -143,4 +143,12 @@ public class XMLUtils {
}
return
xmlObject
;
}
public
static
String
strToHex
(
String
str
)
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
char
c
:
str
.
toCharArray
())
{
sb
.
append
(
String
.
format
(
"%02X"
,
(
int
)
c
));
}
return
sb
.
toString
();
}
}
signal-utc-hisense-service/src/main/resources/application-police.yaml
View file @
723cd832
...
...
@@ -92,10 +92,11 @@ threadPoolConfig:
queueCapacity
:
200
keepAliveTime
:
6000
allowCoreTimeOut
:
false
#
东土
通讯端口配置
#
海信
通讯端口配置
portParam
:
localPort
:
55051
remotePort
:
55050
remotePort
:
10010
remoteIp
:
172.24.71.68
server
:
port
:
39003
servlet
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment