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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
package com.netsdk.demo.customize;
 
import java.io.File;
import java.util.Arrays;
import java.util.Scanner;
 
import com.netsdk.demo.util.CaseMenu;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.NetSDKLib.LLong;
import com.netsdk.lib.NetSDKLib.NET_IN_ATTACH_STATE;
import com.netsdk.lib.NetSDKLib.NET_OUT_ATTACH_STATE;
import com.netsdk.lib.NetSDKLib.NET_OUT_BURN_GET_STATE;
import com.netsdk.lib.ToolKits;
import com.netsdk.lib.NetSDKLib.*;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
 
// 刻录
public class Burner {
    static NetSDKLib netsdkApi     = NetSDKLib.NETSDK_INSTANCE;
    static NetSDKLib configApi     = NetSDKLib.CONFIG_INSTANCE;
    
    ////////////////////////////////////////////////////////////////
    String m_strIp             ="172.10.1.240";// "172.11.1.17";
    int    m_nPort             = 37777;
    String m_strUser         = "admin";
    String m_strPassword     = "admin123";//"admin123";
    ////////////////////////////////////////////////////////////////
    private String burnerName = "/dev/sg1";
    private NetSDKLib.NET_DEVICEINFO_Ex deviceinfo = new NetSDKLib.NET_DEVICEINFO_Ex();
    private static LLong loginHandle = new LLong(0);   //登陆句柄
    private static LLong lBurnSession = new LLong(0);
    private static LLong lAttachBurnStateHandle = new LLong(0);
    
    private volatile static boolean m_bNeetStop = false;   //附件刻录下载完成标志
    
    // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
    public static class fDisConnectCB implements NetSDKLib.fDisConnect{
        public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){
            System.out.printf("Device[%s] Port[%d] Disconnect!\n" , pchDVRIP , nDVRPort);
        }    
    }
    
    // 网络连接恢复,设备重连成功回调
    // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
    public static class HaveReConnect implements NetSDKLib.fHaveReConnect {
        public void invoke(LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
        }
    }
 
    private static fDisConnectCB      m_DisConnectCB   = new fDisConnectCB();
    private static HaveReConnect haveReConnect = new HaveReConnect(); 
    
    public void EndTest()
    {
        System.out.println("End Test");
        if( loginHandle.longValue() != 0)
        {
            netsdkApi.CLIENT_Logout(loginHandle);
            StopBurn();
        }
        System.out.println("See You...");
        
        netsdkApi.CLIENT_Cleanup();
        System.exit(0);
    }
 
    public void InitTest()
    {                
        // 初始化SDK库, 在启动工程的时候调用,只需要调用一次即可,属于初始化sdk的库
        netsdkApi.CLIENT_Init(m_DisConnectCB, null);
        
        // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作
        // 此操作为可选操作,但建议用户进行设置
        netsdkApi.CLIENT_SetAutoReconnect(haveReConnect, null);
        
        //设置登录超时时间和尝试次数,可选
        int waitTime = 5000; //登录请求响应超时时间设置为5S
        int tryTimes = 3;    //登录时尝试建立链接3次
        netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes);
        
        // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime 
        // 接口设置的登录设备超时时间和尝试次数意义相同,可选
        NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
        netParam.nConnectTime = 10000; //登录时尝试建立链接的超时时间
        netsdkApi.CLIENT_SetNetworkParam(netParam);    
        
        // 打开日志,可选
        NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
        
        File path = new File(".");            
        String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\" + System.currentTimeMillis() + ".log";
            
        setLog.bSetFilePath = 1;
        System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
    
        setLog.bSetPrintStrategy = 1;
        setLog.nPrintStrategy = 0;
        boolean bLogopen = netsdkApi.CLIENT_LogOpen(setLog);
        if (!bLogopen) {
            System.err.println("Failed to open NetSDK log !!!");
        }
        
        // 向设备登入
        int nSpecCap = 0;
        Pointer pCapParam = null;
        IntByReference nError = new IntByReference(0);
        loginHandle = netsdkApi.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser , 
                m_strPassword ,nSpecCap,pCapParam, deviceinfo,nError);
        
        if(loginHandle.longValue() != 0) {
            System.out.printf("Login Device[%s] Port[%d]Success!\n" , m_strIp , m_nPort);
            System.out.println("通道号个数:"+deviceinfo.byChanNum);
        }
        else {    
            System.out.printf("Login Device[%s] Port[%d]Fail. %s\n" , m_strIp , m_nPort , ToolKits.getErrorCode());
            EndTest();   
        }
    }
    
    /**
     * 查询刻录机信息
     */
    public void QueryBurnDevice() {
        NET_BURNING_DEVINFO burnDevInfo = new NET_BURNING_DEVINFO();
        IntByReference retLen = new IntByReference(0);
 
        burnDevInfo.write();
        if (!netsdkApi.CLIENT_QueryDevState(loginHandle, 
                                            NetSDKLib.NET_DEVSTATE_BURNING_DEV, 
                                            burnDevInfo.getPointer(), 
                                            burnDevInfo.size(), 
                                            retLen, 
                                            3000)) {
            System.err.println("查询刻录机信息失败, " + ToolKits.getErrorCode());
            return;
        }
        
        burnDevInfo.read();
        PrintStruct.print(burnDevInfo);
    }
    
    /**
     * 弹出刻录机光驱门
     */
    /*public void EjectBurner() {
 
        NET_CTRL_BURNERDOOR ctrlBurn = new NET_CTRL_BURNERDOOR();
        
        ctrlBurn.szBurnerName = new Memory(NetSDKLib.NET_BURNING_DEV_NAMELEN);
        ctrlBurn.szBurnerName.write(0, burnerName.getBytes(), 0, burnerName.getBytes().length);    
//        ctrlBurn.bSafeEject = 1;
 
        ctrlBurn.write();
        if (netsdkApi.CLIENT_ControlDevice(loginHandle, 
                                            NetSDKLib.CtrlType.CTRLTYPE_CTRL_EJECT_BURNER, 
                                            ctrlBurn.getPointer(),  
                                            3000)) {
            System.out.println("弹出刻录机光驱门成功!");
        }else {
            System.err.println("弹出刻录机光驱门失败!" + ToolKits.getErrorCode());
        }
    }
    
    /**
     * 关闭刻录机光驱门
     */
    /*public void CloseBurner() {
 
        NET_CTRL_BURNERDOOR ctrlBurn = new NET_CTRL_BURNERDOOR();
        
        ctrlBurn.szBurnerName = new Memory(NetSDKLib.NET_BURNING_DEV_NAMELEN);
        ctrlBurn.szBurnerName.write(0, burnerName.getBytes(), 0, burnerName.getBytes().length);    
 
        ctrlBurn.write();
        if (netsdkApi.CLIENT_ControlDevice(loginHandle, 
                                            NetSDKLib.CtrlType.CTRLTYPE_CTRL_CLOSE_BURNER, 
                                            ctrlBurn.getPointer(),  
                                            3000)) {
            System.out.println("关闭刻录机光驱门成功!");
        }else {
            System.err.println("关闭刻录机光驱门失败!" + ToolKits.getErrorCode());
        }
    }*/
 
    /**
     * 打开刻录会话
     */
    public boolean StartBurnSession() {
        
        if (lBurnSession.longValue() != 0)
        {
            return true;
        }
        
        NET_IN_START_BURN_SESSION stuInParam = new NET_IN_START_BURN_SESSION();
        NET_OUT_START_BURN_SESSION stuOutParam = new NET_OUT_START_BURN_SESSION();
        
        stuInParam.nSessionID = 0;
        lBurnSession = netsdkApi.CLIENT_StartBurnSession(loginHandle, stuInParam, stuOutParam, 3000);
        if(lBurnSession.longValue() != 0) {
            System.out.println("打开刻录会话成功!");
        } else {
            System.err.println("打开刻录会话失败, " + ToolKits.getErrorCode());
            return false;
        }
        
        return true;
    }
    
    /**
     * 关闭刻录会话
     */
    public void StopBurnSession() 
    {
        if (lBurnSession.longValue() != 0) {
            netsdkApi.CLIENT_StopBurnSession(lBurnSession);
        }    
    }
    // 画中画通道号最大值
    int allchannel;
    
    /**
     * 开始刻录
     */
    public void StartBurn() 
    {                                //使能下发                
        System.out.println("num: "+allchannel);
        String command = NetSDKLib.CFG_CMD_JUDICATURE;
        int channel = -1;
        CFG_JUDICATURE_INFO[] stuCfg = new CFG_JUDICATURE_INFO[allchannel+1];
        for (int i = 0; i < stuCfg.length; ++i) {
             stuCfg[i] = new CFG_JUDICATURE_INFO();
        }
        
        int flg = ToolKits.GetDevConfig(loginHandle, channel, command, stuCfg);
        System.out.println("个数:"+flg);
        for (int i = 0; i < stuCfg.length; i++) {
          stuCfg[i].bAttachFileEn=0;
        }            
        if(ToolKits.SetDevConfig(loginHandle, channel, command, stuCfg)) {
            System.out.println("设置使能成功");
        }else{
            System.err.println("设置使能失败, " + ToolKits.getErrorCode());
        };                
        
        if (!StartBurnSession()) {
            return;
        }
        NET_IN_START_BURN stuInParam = new NET_IN_START_BURN();
        NET_OUT_START_BURN stuOutParam = new NET_OUT_START_BURN();
        
        stuInParam.dwDevMask = 1;                                // 刻录设备掩码, 按位表示多个刻录设备组合
        stuInParam.emMode = NET_BURN_MODE.BURN_MODE_SYNC;          // 刻录模式
        stuInParam.emPack = NET_BURN_RECORD_PACK.BURN_PACK_MP4; // 刻录流格式
        stuInParam.nChannelCount = 1;                             // 刻录通道信息
        stuInParam.nChannels[0] = 0;                            // 刻录通道
        stuInParam.emExtMode = 1;                               // 额外刻录模式
 
        if (netsdkApi.CLIENT_StartBurn(lBurnSession, stuInParam, stuOutParam, 30000)) {
            System.out.println("开始刻录成功!");
        } else {
            System.err.println("开始刻录失败, " + ToolKits.getErrorCode());
        }
    }
    
    
    
    
    
 
//    打开刻录会话, 返回刻录会话句柄,pstInParam与pstOutParam内存由用户申请释放
//    CLIENT_NET_API LLONG CALL_METHOD CLIENT_StartBurnSession(LLONG lLoginID, const NET_IN_START_BURN_SESSION* pstInParam, NET_OUT_START_BURN_SESSION *pstOutParam, int nWaitTime); 
    
    /**
     * 监听刻录状态
     */
    public void AttachBurnState() {
        
        if (lBurnSession.longValue() == 0 || lAttachBurnStateHandle.longValue() != 0) {
            return;
        }
            
        NET_IN_ATTACH_STATE stIn = new NET_IN_ATTACH_STATE();
        stIn.szDeviceName = new Memory(NetSDKLib.NET_BURNING_DEV_NAMELEN);
        stIn.szDeviceName.write(0, burnerName.getBytes(), 0, burnerName.getBytes().length);    
        stIn.cbAttachStateEx = AttachBurnStateCB.getInstance();  // 回调函数
        stIn.lBurnSession = lBurnSession;
        
        NET_OUT_ATTACH_STATE stOut = new NET_OUT_ATTACH_STATE();
        lAttachBurnStateHandle = netsdkApi.CLIENT_AttachBurnState(loginHandle, stIn, stOut, 3000);
        
        if(lAttachBurnStateHandle.longValue() != 0) {
            System.out.println("监听刻录状态成功!");
        } else {
            System.err.println("监听刻录状态失败, " + ToolKits.getErrorCode());
        }
    }
    
    /**
     * 监听刻录状态回调
     */
    private static class AttachBurnStateCB implements fAttachBurnStateCBEx {
        private AttachBurnStateCB() {}
        
        private static class AttachBurnStateCBHolder {
            private static AttachBurnStateCB instance = new AttachBurnStateCB();
        }
        
        public static AttachBurnStateCB getInstance() {
            return AttachBurnStateCBHolder.instance;
        }
 
        @Override
        public void invoke(LLong lLoginID, LLong lAttachHandle,
                NET_OUT_BURN_GET_STATE pBuf, int nBufLen, Pointer dwUser) {
            
            System.out.println("监听到刻录状态: " + pBuf.emState); // 参见NET_BURN_STATE
        }
                        
    }
    /**
     * 刻录进度回调
     */
    private static class BurnFileCB implements fBurnFileCallBack {
        private BurnFileCB() {}
        
        private static class BurnFileCBHolder {
            private static BurnFileCB instance = new BurnFileCB();
        }
        
        public static BurnFileCB getInstance() {
            return BurnFileCBHolder.instance;
        }
        @Override
        public void invoke(LLong lLoginID, LLong lUploadHandle,  
                int nTotalSize, int nSendSize, Pointer dwUser){
             if (lUploadHandle.intValue() ==0 || lLoginID.intValue() == 0){
                 System.out.println((lUploadHandle.intValue() ==0) +" "+(lLoginID.intValue() == 0) +" finished");
                 m_bNeetStop=true;
             }     
             if (nTotalSize == nSendSize){
                 System.out.println("finished");
                 m_bNeetStop=true;
             }
             double percent=((double)nSendSize/(double)nTotalSize)*100;
             double frac=percent-Math.floor(percent);  //小数部分
             percent=Math.floor(percent);
             if(1-frac<10e-2){
                 percent+=1;
                 frac=1-frac;
             }
             //上传进度
             if(frac<10e-2)
                 System.out.println("Send: "+(double)nSendSize+"\tTotal: "+(double)nTotalSize
                         +"\t\t"+"Upload progress: "+(int)percent+"%");
             
//             if(nSendSize==-2){
//                 System.out.println("上传失败,上传需要先开始刻录(并最好稍作等待)");
//                 m_bNeetStop=true;
//             }
        }                    
    }
    
    /**
     * 取消监听刻录状态
     */
    public void DetachBurnState() {
        if(lAttachBurnStateHandle.longValue() != 0) {
            netsdkApi.CLIENT_DetachBurnState(lAttachBurnStateHandle);
            lAttachBurnStateHandle.setValue(0);
        }
    }
    
    /**
     * 获取刻录状态
     */
    public void BurnGetState() {
        
        NET_IN_BURN_GET_STATE stIn = new NET_IN_BURN_GET_STATE();
        NET_OUT_BURN_GET_STATE stOut = new NET_OUT_BURN_GET_STATE(); 
        
        if(netsdkApi.CLIENT_BurnGetState(lBurnSession, stIn, stOut, 3000)) {
            PrintStruct.print(stOut);
        } else {
            System.err.println("获取刻录状态失败!" + ToolKits.getErrorCode());
        }
    }
 
    /**
     * 暂停刻录
     */
    public void PauseBurn() 
    {
        if (lBurnSession.longValue() == 0) {
            System.err.println("请先开始刻录");
            return;
        }
        
        if (netsdkApi.CLIENT_PauseBurn(lBurnSession, 1)) {
            System.out.println("暂停刻录成功!");
        } else {
            System.err.println("暂停刻录失败, " + ToolKits.getErrorCode());
        }
    }
    
    /**
     * 恢复刻录
     */
    public void ResumeBurn() 
    {
        if (lBurnSession.longValue() == 0) {
            System.err.println("请先开始刻录");
            return;
        }
        
        if (netsdkApi.CLIENT_PauseBurn(lBurnSession, 0)) {
            System.out.println("恢复刻录成功!");
        } else {
            System.err.println("恢复刻录失败, " + ToolKits.getErrorCode());
        }
    }
    
    /**
     * 停止刻录
     */
    public void StopBurn() 
    {
        if (lBurnSession.longValue() != 0) {
            netsdkApi.CLIENT_StopBurn(lBurnSession);
            StopBurnSession();
        }    
    }
    
 
    /**
     * 查询画中画通道信息
     */
    public void QueryPicInPic() {
        IntByReference retLen = new IntByReference(0);
        int nSize = 4 * 1024;
        Pointer p = new Memory(nSize);
        p.clear(nSize);
        if (!netsdkApi.CLIENT_QueryDevState(loginHandle, NetSDKLib.NET_DEVSTATE_PICINPIC_CHN, p, nSize, retLen, 3000)) {
            System.err.println("查询画中画通道信息失败, " + ToolKits.getErrorCode());
            return;
        }
        int nNum = retLen.getValue()/4;
        System.out.println("画中画通道个数: " + nNum);
        int[] channels = new int[nNum];
        p.read(0, channels, 0, nNum);
        if(nNum>0) {
            for (int c : channels) {
                System.out.println(c);            
            }
            Arrays.parallelSort(channels);
            allchannel = channels[channels.length-1];
        }
    }
    
    
    
    /**
     * 查询设备在线状态
     */
    public void QueryOnlineState() {
 
        IntByReference retLen = new IntByReference(0);
        Pointer p = new Memory(Integer.SIZE);
        p.clear(Integer.SIZE);
        if (!netsdkApi.CLIENT_QueryDevState(loginHandle, 
                                            NetSDKLib.NET_DEVSTATE_ONLINE, 
                                            p, 
                                            Integer.SIZE, 
                                            retLen, 
                                            3000)) {
            System.err.println("查询设备在线状态失败, " + ToolKits.getErrorCode());
            return;
        }
        int []a = new int[1];
        p.read(0, a, 0, 1);
        System.out.println(a[0]);
    }
    
    /**
     * 刻录配置
     */
    public void SetJudicature() {
        String command = NetSDKLib.CFG_CMD_JUDICATURE;
        int channel = 0;
        CFG_JUDICATURE_INFO stuCfg = new CFG_JUDICATURE_INFO();
    
        // 获取
        if(ToolKits.GetDevConfig(loginHandle, channel, command, stuCfg)) {
            System.out.println("案件编号叠加使能 : " + stuCfg.bCaseNoOsdEn);
            if (stuCfg.bCaseNoOsdEn == 1) {
                System.out.println("案件编号 :" + new String(stuCfg.szCaseNo).trim());
            }
            
            // 设置,在获取的基础上设置
            stuCfg.bCaseNoOsdEn = 1; // 案件编号叠加使能
            String caseNo = "AJBH001"; // 案件编号
            System.arraycopy(caseNo.getBytes(), 0, stuCfg.szCaseNo, 0, caseNo.getBytes().length);
            if(ToolKits.SetDevConfig(loginHandle, channel, command, stuCfg)) {
                System.out.println("设置刻录配置成功!");
            } else {
                System.err.println("设置刻录配置失败!" + ToolKits.getErrorCode());
            }
            
        } else {
            System.err.println("设置刻录配置失败!" + ToolKits.getErrorCode());
        }
    }
    
    /**
     * 刻录密码修改
     */
    public void SetJudicatureSecret() {
        String command = NetSDKLib.CFG_CMD_JUDICATURE;
        int channel = 0;
        CFG_JUDICATURE_INFO stuCfg = new CFG_JUDICATURE_INFO();
 
        // 获取
        if(ToolKits.GetDevConfig(loginHandle, channel, command, stuCfg)) {
            
            System.out.println("愿密码:"+new String(stuCfg.szPassword).trim());
            System.out.println("愿密码长度:"+stuCfg.nPasswordLen);
            
            System.out.println("请输入新密码(支持数字和英文字母):");
            Scanner read=new Scanner(System.in);
            byte[] newPwd=read.next().getBytes();
            int newlen=newPwd.length;
            
//            stuCfg.szPassword=newPwd;
            stuCfg.nPasswordLen=newlen;
 
            System.arraycopy(newPwd, 0, stuCfg.szPassword, 0, newlen);
            if(ToolKits.SetDevConfig(loginHandle, channel, command, stuCfg)) {
                System.out.println("修改刻录密码成功!");
            } else {
                System.err.println("修改刻录密码失败!" + ToolKits.getErrorCode());
            }
            
        } else {
            System.err.println("修改刻录密码失败!" + ToolKits.getErrorCode());
        }
    }
    
    //附件刻录
    public void UploadFileBurned(){
        
        //使能下发
        String command = NetSDKLib.CFG_CMD_JUDICATURE;
        int channel = 0;
        CFG_JUDICATURE_INFO stuCfg = new CFG_JUDICATURE_INFO();
        if(ToolKits.GetDevConfig(loginHandle, channel, command, stuCfg)) {
//            System.out.println("原使能:"+stuCfg.bAttachFileEn);
            stuCfg.bAttachFileEn=1;
//            System.out.println("新使能:"+stuCfg.bAttachFileEn);
            if(ToolKits.SetDevConfig(loginHandle, channel, command, stuCfg))
                System.out.println("下发使能成功!");
            else 
                System.err.println("下发使能失败!" + ToolKits.getErrorCode());
        } else {
            System.err.println("下发使能失败!" + ToolKits.getErrorCode());
        }
        
            
        NET_IN_FILEBURNED_START stIn = new NET_IN_FILEBURNED_START();
        
        Scanner read=new Scanner(System.in);
        System.out.println("请输入要刻录的文件名:");  //即要上传的附件
        String szFilename=read.next();
        stIn.szFilename = new Memory(128);   //文件名 char[128]
        stIn.szFilename.write(0, szFilename.getBytes(), 0, szFilename.getBytes().length);
        
        //szMode
        System.out.println("请选择上传方式:\n"
                + "1.append, 追加模式,此时刻录文件名固定为 FILE.zip ,filename被忽\n"
                + "2.evidence, 证据等大附件, 要求单独刻录的光盘内");
        String szMode=read.nextInt()==1?"append":"evidence";
        stIn.szMode = new Memory(16);   
        stIn.szMode.write(0, szMode.getBytes(), 0, szMode.getBytes().length);    
//        read.close();  不可关闭,否则会退出main方法
        
        stIn.szDeviceName = new Memory(NetSDKLib.NET_BURNING_DEV_NAMELEN);
        stIn.szDeviceName.write(0, burnerName.getBytes(), 0, burnerName.getBytes().length);    
        
//        stIn.dwUser=null;
        stIn.cbBurnPos = BurnFileCB.getInstance();
        
        if (!StartBurnSession()) {
            System.err.println("open lBurnSession Error");
            return;
        }
        stIn.lBurnSession = lBurnSession;
        
        NET_OUT_FILEBURNED_START stOut = new NET_OUT_FILEBURNED_START();
 
        //开始刻录附件上传
        LLong lStartUploadFileBurnedHandle=netsdkApi.CLIENT_StartUploadFileBurned(loginHandle, stIn, stOut, 3000);
        if(0 == lStartUploadFileBurnedHandle.intValue()){
            System.err.println("开始刻录附件上传失败, " + ToolKits.getErrorCode());
            return ;
        }
 
        //刻录上传附件
        boolean bRet = netsdkApi.CLIENT_SendFileBurned(lStartUploadFileBurnedHandle);
        if(! bRet){
            System.err.println("上传刻录附件失败, " + ToolKits.getErrorCode());
            return ;
        }
        else System.out.println("上传刻录附件成功, ");
        
        //刻录附件上传停止
        while(!m_bNeetStop);
        bRet = netsdkApi.CLIENT_StopUploadFileBurned(lStartUploadFileBurnedHandle);
        if (bRet != true)
            System.err.println("刻录附件上传停止失败, " + ToolKits.getErrorCode());
        else
            System.out.println("刻录附件上传停止成功");
    }
    
    public void RunTest()
    {
        System.out.println("Run Test");        
        CaseMenu menu = new CaseMenu();
    
        menu.addItem(new CaseMenu.Item(this , "查询刻录机信息" , "QueryBurnDevice"));
//        menu.addItem(new CaseMenu.Item(this , "弹出刻录机光驱门" , "EjectBurner"));    // 设备暂不支持
//        menu.addItem(new CaseMenu.Item(this , "关闭刻录机光驱门" , "CloseBurner"));
        menu.addItem(new CaseMenu.Item(this , "开始刻录" , "StartBurn"));
        menu.addItem(new CaseMenu.Item(this , "监听刻录状态" , "AttachBurnState"));
        menu.addItem(new CaseMenu.Item(this , "取消监听刻录状态" , "DetachBurnState"));
        menu.addItem(new CaseMenu.Item(this , "获取刻录状态" , "BurnGetState"));
        menu.addItem(new CaseMenu.Item(this , "暂停刻录" , "PauseBurn"));
        menu.addItem(new CaseMenu.Item(this , "恢复刻录" , "ResumeBurn"));
        menu.addItem(new CaseMenu.Item(this , "停止刻录" , "StopBurn"));
        menu.addItem(new CaseMenu.Item(this , "查询画中画通道" , "QueryPicInPic"));
        menu.addItem(new CaseMenu.Item(this , "查询设备在线状态" , "QueryOnlineState"));
        menu.addItem(new CaseMenu.Item(this , "刻录配置" , "SetJudicature"));
        menu.addItem(new CaseMenu.Item(this , "刻录密码修改" , "SetJudicatureSecret"));
        menu.addItem(new CaseMenu.Item(this , "附件刻录" , "UploadFileBurned"));
        
//        menu.addItem(new CaseMenu.Item(this , "打开刻录会话" , "StartBurnSession"));
//        menu.addItem(new CaseMenu.Item(this , "关闭刻录会话" , "StopBurnSession"));
 
        menu.run(); 
    }
    
    public static void main(String[]args)
    {        
        Burner demo = new Burner();    
    
        demo.InitTest();
        demo.RunTest();
        demo.EndTest();
    }
}