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<Session> 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() + 
 | 
                ']'; 
 | 
    } 
 | 
} 
 |