1
zhanghua
2024-09-26 c775c6953d9759e70f08acbfa8f6d7490aaae3d1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
package com.netsdk.demo.customize.JordanPSD;
 
import com.netsdk.demo.customize.JordanPSD.module.AutoRegisterModule;
import com.netsdk.demo.customize.JordanPSD.module.LogonModule;
import com.netsdk.demo.customize.JordanPSD.module.SdkUtilModule;
import com.netsdk.demo.util.CaseMenu;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.enumeration.ENUMERROR;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
 
/**
 * @author 47040
 * @since Created at 2021/5/28 19:17
 */
public class Launcher33C300 {
 
    // 初始化测试
    public void InitTest() {
        SdkUtilModule.Init();  // 初始化SDK库
    }
 
    ///////////////////////////// 主动注册 /////////////////////////////
    ///////////////////////////////////////////////////////////////////
 
    // 用户存储注册上来的设备信息的缓存 Map 项目中请替换成其他中间件
    private final Map<String, DeviceInfo> deviceInfoMap = new ConcurrentHashMap<>();
 
    // 监听句柄
    private NetSDKLib.LLong m_hListenHandle = new NetSDKLib.LLong(0);
 
    /**
     * 开启监听
     */
    public void serverStartListen() {
        m_hListenHandle = AutoRegisterModule.ServerStartListen(serverIpAddr, serverPort, RegisterServiceCallBack.getInstance());
        if (m_hListenHandle.longValue() == 0) return;
        taskIsOpen = true;
        new Thread(this::eventListTask).start();
    }
 
    /**
     * 结束监听
     */
    public void serverStopListen() {
        AutoRegisterModule.ServerStopListen(m_hListenHandle);
        // 清空队列
        taskIsOpen = false;
        deviceInfoMap.clear();
        RegisterServiceCallBack.ServerInfoQueue.clear();
    }
 
    private volatile Boolean taskIsOpen = false;
 
    // 获取监听回调数据并放入缓存
    public void eventListTask() {
        while (taskIsOpen) {
            try {
                // 稍微延迟一下,避免循环的太快
                Thread.sleep(10);
                // 阻塞获取
                ListenInfo listenInfo = RegisterServiceCallBack.ServerInfoQueue.poll(50, TimeUnit.MILLISECONDS);
                if (listenInfo == null) continue;
                // 结果放入缓存
                if (!deviceInfoMap.containsKey(listenInfo.devSerial)) {
                    deviceInfoMap.put(listenInfo.devSerial, new DeviceInfo(listenInfo.devIpAddress, listenInfo.devPort));
                    System.out.println("有新设备上报注册信息... Serial:" + listenInfo.devSerial);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * 查看上报的监听数据
     */
    public void checkRegisterDevInfo() {
        // 浅拷贝一个快照
        Map<String, DeviceInfo> deviceInfos = new HashMap<>(deviceInfoMap);
        if (deviceInfos.isEmpty()) System.out.println("没有任何设备上报注册信息.");
 
        StringBuilder info = new StringBuilder();
        for (String label : deviceInfos.keySet()) {
            info.append(String.format("Serial: %s %s\n", label, deviceInfos.get(label).printRegisterInfo()));
        }
        System.out.println(info.toString());
    }
 
    /**
     * 登录指定设备
     */
    public void deviceLogin() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入设备的注册 Serial");
        String key = sc.nextLine().trim();
 
        DeviceInfo deviceInfo = deviceInfoMap.get(key);
        if (deviceInfo == null) {
            System.out.println("注册上报的设备中没有该 Serial");
            return;
        }
 
        String ipAddr = deviceInfo.ipAddress;
        int port = deviceInfo.port;
 
        System.out.println("请输入用户名");
        String username = sc.nextLine().trim();
        System.out.println("请输入密码");
        String password = sc.nextLine().trim();
 
        // 主动注册登录设备
        //NetSDKLib.LLong m_hLoginHandle = LogonModule.AutoRegisterLogin(key, ipAddr, port, username, password, deviceInfo.m_stDeviceInfo);
        
        // 高安全登录  主动注册  TLS加密
        NetSDKLib.LLong m_hLoginHandle = LogonModule.AutoRegisterLoginWithHighSecurity(key, ipAddr, port, username, password, deviceInfo.m_stDeviceInfo);
        if (m_hLoginHandle.longValue() == 0) {
            System.err.println("登录失败:" + ENUMERROR.getErrorMessage());
            return;
        }
        deviceInfo.m_hLoginHandle = m_hLoginHandle;
        deviceInfo.isLogin = true;
 
        // 启动子 Demo
        Demo33C300 demo = new Demo33C300(deviceInfo);
        demo.RunTest();
 
        // 结束测试后登出设备
        LogonModule.logout(m_hLoginHandle);
        deviceInfoMap.remove(key); // 清除此注册信息 请等待重新上报后再重新登录
    }
 
    // 加载测试内容
    public void RunTest() {
        CaseMenu menu = new CaseMenu();
        menu.addItem(new CaseMenu.Item(this, "开始监听", "serverStartListen"));
        menu.addItem(new CaseMenu.Item(this, "结束监听", "serverStopListen"));
        menu.addItem(new CaseMenu.Item(this, "查看上报信息", "checkRegisterDevInfo"));
        menu.addItem(new CaseMenu.Item(this, "开始登录设备", "deviceLogin"));
        menu.run();
        System.out.println("主测试已退出");
    }
 
    // 结束测试
    public void EndTest() {
        System.out.println("End Test");
        if (m_hListenHandle.longValue() != 0) serverStopListen();
        System.out.println("See You...");
        SdkUtilModule.cleanup();             // 清理资源
    }
 
    /////////////// 注册地址(服务器 这里是运行此Demo的电脑IP) 监听端口 //////////////////////
    private final String serverIpAddr = "10.34.3.83";//10.34.3.83 //172.23.28.2 //10.38.156.87
    private final int serverPort = 9500;   // 注意不要和其他程序发生冲突
    /////////////////////////////////////////////////////////////////////////////////////
 
    public static void main(String[] args) {
        Launcher33C300 launcher = new Launcher33C300();
        launcher.InitTest();
        launcher.RunTest();
        launcher.EndTest();
    }
}