因为硬件设备使用的udp协议,传输数据,客户端只顾着发数据,所以大部分操作都在我服务端进行操作,做到数据实时(定义为每秒客户端发送来一次数据)展示。
暂定方案为netty+redis+map
netty这块我就不多赘述了,不懂得可以先看netty得基础或者简单得demo学习一下;在开启服务后配置handler,在handler中尽量能不做操作就不要做出任何操作,只负责解析报文和处理数据,收到得数据放入缓存中,再由拿到得缓存另外处理,存入数据库也好,页面展示也好,都通过缓存进行操作
handler代码如下:
@Override
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg){
try{
//获取接收到得内容
ByteBuf content = msg.content();
//对数据进行解码
CCloudPacketParser decoder = new CCloudPacketParser();
InputStream io = new ByteBufInputStream(content);
CPacketDecoder parsePacket = decoder.parse(io);
//数据是否为我方数据,不是则丢弃
if (parsePacket != null) {
//数据类型
byte msg_type = parsePacket.getMsgType().getMsg_type();
//判断数据类型
if (msg_type == 4) {
ParsePacketUtil.parsePacket_4(parsePacket);
}
}else {
log.info("异常链接,传入异常IP地址为:" + msg.sender());
}
}catch (Exception e){
log.info("读取数据异常");
e.printStackTrace();
}
}
具体操作是在
parsePacket_4
里面,我使用的是
RedisTemplate
public static void parsePacket_4(CPacketDecoder packet){
CBasePacket cBasePacket = packet.getMsgType();
//设备ID
String driverId = String.valueOf(cBasePacket.getElevator_id());
//根据设备id获取数据
Object deviceEntity = redisUtil.get(driverId);
if (deviceEntity != null){
//转为实体类
JSONObject deviceJSONObject = JSONObject.parseObject(deviceEntity.toString());
ElevatorDevice elevatorDevice = JSONObject.toJavaObject(deviceJSONObject, ElevatorDevice.class);
//发现电动车进入
Byte byte_49 = packet.get(49);
String electricVehicleEntry = (byte_49 == 1) ? "触发发现电动车进入" : "解决发现电动车进入";
//告警数据更新后得map
Map<String, Object> faultMap = CacheUtil.resolveTheFault("electricVehicleEntry", electricVehicleEntry);
//先获取redis中故障数据
Map<Object, Object> cacheFaultMap = redisUtil.hmget(faultRedisID);
if (cacheFaultMap == null){
redisUtil.hmset(faultRedisID,faultMap);
}else {
//用于获取两个map之间得所有得不同点,并返回MapDifference对象
MapDifference<Object, Object> difference = Maps.difference(faultMap, cacheFaultMap);
//判断redis中得告警故障信息是否与当前故障缓存是否相同,数据发生变化则为false,无变化则为true
boolean isEqual = difference.areEqual();
//告警故障发生变化则进行更新redis,不变化则不操作
if (!isEqual){
redisUtil.del(faultRedisID);
redisUtil.hmset(faultRedisID,faultMap);
}
}
}
}
map首先判断是否已存在该数据,并判断客户端传来的数据与map中的数据是否有变化,对比里昂个map是否有变化的方法使用
//用于获取两个map之间得所有得不同点,并返回MapDifference对象
MapDifference<Object, Object> difference = Maps.difference(faultMap, cacheFaultMap);
//判断redis中得告警故障信息是否与当前故障缓存是否相同,数据发生变化则为false,无变化则为true
boolean isEqual = difference.areEqual();
map数据出现变化之后放入redis中,之后拿到redis进行操作即可。
版权声明:本文为ddd295569371原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。