whycxzp
2025-04-30 71403cc4d3fe8f41355ac4d6795cc8d268a0ee2f
设备状态ws
4个文件已添加
207 ■■■■■ 已修改文件
src/main/java/com/whyc/mapper/DevDfuStateMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/DevDfuState.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/DevDfuStateService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/webSocket/DevStateSocket.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/DevDfuStateMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.DevDfuState;
public interface DevDfuStateMapper extends CustomMapper<DevDfuState> {
}
src/main/java/com/whyc/pojo/DevDfuState.java
New file
@@ -0,0 +1,68 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import org.apache.ibatis.type.Alias;
@Data
@ToString
@Alias("DevDfuState")
@TableName(schema = "db_battery_gwm",value = "tb_dev_dfustate")
public class DevDfuState {
    private Integer num;
    private String stationProvince;
    private String stationCity;
    private String stationCounty;
    private String stationName;
    private String devName;
    private String battName;
    private Integer monCount;
    @TableField("monstdcap")
    private Float monStdCap;
    @TableField("monstdvol")
    private Float monStdVol;
    private Float loadCurr;
    @TableField("record_datetime")
    private String recordTime;
    @ApiModelProperty("在线状态: 0-离线,1-在线")
    @TableField(exist = false)
    private Integer online;
    private String devIp;
    private String snCode;
    private String serialNumber;
    private String materialCode;
    private String version;
    private String dfuFile;
    @ApiModelProperty("升级标识符")
    private Integer dfuEn;
    private Integer dfuWrStat;
    @ApiModelProperty("当前数据包")
    @TableField("dfu_data_blocknum")
    private Integer dfuDataBlockNum;
    @ApiModelProperty("数据包大小")
    @TableField("dfu_data_blocklen")
    private Integer dfuDataBlockLen;
    private String dfuPassword;
    @ApiModelProperty("文件长度")
    private Integer dfuFileLen;
    @ApiModelProperty("错误代码[0:无;1:文件未找到;2:参数错误;3:文件发送超时;4:远程停止]")
    private Integer errorCode;
    @TableField("dev_commcount")
    private Integer devCommCount;
    @TableField("dev_errcommcount")
    private Integer devErrCommCount;
    @ApiModelProperty("设备连续通信错误计数")
    @TableField("dev_rxnullerrcount")
    private Integer devRxNullErrCount;
}
src/main/java/com/whyc/service/DevDfuStateService.java
New file
@@ -0,0 +1,29 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.Response;
import com.whyc.mapper.DevDfuStateMapper;
import com.whyc.pojo.DevDfuState;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class DevDfuStateService {
    @Resource
    private DevDfuStateMapper mapper;
    public Response getPage(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        QueryWrapper<DevDfuState> query = Wrappers.query();
        query.orderByDesc("recordTime");
        List<DevDfuState> list = mapper.selectList(query);
        PageInfo<DevDfuState> pageInfo = new PageInfo<>(list);
        return new Response().set(1, pageInfo);
    }
}
src/main/java/com/whyc/webSocket/DevStateSocket.java
New file
@@ -0,0 +1,104 @@
package com.whyc.webSocket;
import com.github.pagehelper.PageInfo;
import com.whyc.config.WebSocketConfig;
import com.whyc.dto.Response;
import com.whyc.service.DevDfuStateService;
import com.whyc.util.ActionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
/**
 * 设备信息推送
 */
@Component
@ServerEndpoint(value = "/devState",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
public class DevStateSocket {
    private Session session;
    private static final int executeTime = 2000;
    private Thread thread;
    private volatile boolean runFlag=true;
    private volatile Map<String,Thread> threadMap = new HashMap<>();
    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
    private static DevDfuStateService service;
    @Autowired
    public void setService(DevDfuStateService service) {
        DevStateSocket.service = service;
    }
    @OnOpen
    public void onOpen(Session session){
        this.session=session;
    }
    @OnMessage
    public void onMessage(Session session, String message){
        this.session=session;
        PageInfo pageInfo = ActionUtil.getGson().fromJson(message, PageInfo.class);
        thread = new Thread("Thread_DevStateSocket") {
            @Override
            public void run() {
                while (runFlag && !isInterrupted()) {
                    Thread thread = currentThread();
                    threadFlagMap.put(thread.getId(), true);
                    try {
                        Response res = service.getPage(pageInfo.getPageNum(), pageInfo.getPageSize());
                        if (session.isOpen()) {
                            //推送信息
                            synchronized (session) {
                                session.getBasicRemote().sendObject(res);
                            }
                            threadFlagMap.put(thread.getId(), false);
                        }
                        sleep(executeTime);
                        //} catch (IOException | InterruptedException | EncodeException e) {
                    } catch (Exception e) {
                        interrupt();
                    }
                }
            }
        };
        thread.start();
        threadFlagMap.put(thread.getId(),true);
        //停止老的socket线程
        Thread threadBefore = threadMap.get(session.getId());
        if(threadBefore !=null && threadBefore.isAlive()){
            while (threadFlagMap.get(threadBefore.getId())){
            }
            threadBefore.interrupt();
        }
        //将线程存储,便于调用定位
        threadMap.put(session.getId(), this.thread);
    }
    @OnClose
    public void onClose(CloseReason closeReason){
        System.err.println("closeReason = " + closeReason);
        runFlag = false;
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
}