package com.genersoft.iot.vmp.jt1078.session; import com.genersoft.iot.vmp.jt1078.proc.Header; import io.netty.channel.Channel; import io.netty.util.AttributeKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.atomic.AtomicInteger; /** * @author QingtaiJiang * @date 2023/4/27 18:54 * @email qingtaij@163.com */ public class Session { private final static Logger log = LoggerFactory.getLogger(Session.class); public static final AttributeKey KEY = AttributeKey.newInstance(Session.class.getName()); // Netty的channel protected final Channel channel; // 原子类的自增ID private final AtomicInteger serialNo = new AtomicInteger(0); // 是否注册成功 private boolean registered = false; // 设备ID private String devId; // 创建时间 private final long creationTime; // 协议版本号 private Integer protocolVersion; private Header header; protected Session(Channel channel) { this.channel = channel; this.creationTime = System.currentTimeMillis(); } public void writeObject(Object message) { log.info("<<<<<<<<<< cmd{},{}", this, message); channel.writeAndFlush(message); } /** * 获得下一个流水号 * * @return 流水号 */ public int nextSerialNo() { int current; int next; do { current = serialNo.get(); next = current > 0xffff ? 0 : current; } while (!serialNo.compareAndSet(current, next + 1)); return next; } /** * 注册session * * @param devId 设备ID */ public void register(String devId, Integer version, Header header) { this.devId = devId; this.registered = true; this.protocolVersion = version; this.header = header; SessionManager.INSTANCE.put(devId, this); } /** * 获取设备号 * * @return 设备号 */ public String getDevId() { return devId; } public boolean isRegistered() { return registered; } public long getCreationTime() { return creationTime; } public Integer getProtocolVersion() { return protocolVersion; } public Header getHeader() { return header; } @Override public String toString() { return "[" + "devId=" + devId + ", reg=" + registered + ", version=" + protocolVersion + ",ip=" + channel.remoteAddress() + ']'; } }