package com.netsdk.demo.customize;
|
|
import java.io.File;
|
import java.math.BigInteger;
|
import java.security.MessageDigest;
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.NetSDKLib.*;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
|
public class CloudUpgrader {
|
static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE;
|
static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE;
|
|
// 设备信息
|
private NET_DEVICEINFO_Ex deviceinfo = new NET_DEVICEINFO_Ex();
|
|
// 登陆句柄
|
private LLong m_loginHandle = new LLong(0);
|
|
// 下载句柄
|
private LLong m_hDownLoadHandle = new LLong(0);
|
|
// 暂停恢复下载
|
private boolean bPause = true;
|
|
// 订阅状态句柄
|
private LLong m_hAttachHandle = new LLong(0);
|
|
/*************************************************************************************
|
* 通用功能 *
|
*************************************************************************************/
|
// device disconnect callback
|
// call CLIENT_Init to set it, when device reconnect, sdk will call it.
|
public static class DisConnectCallback implements NetSDKLib.fDisConnect{
|
|
private DisConnectCallback() {}
|
|
private static class CallBackHolder {
|
private static final DisConnectCallback cb = new DisConnectCallback();
|
}
|
|
public static final DisConnectCallback getInstance() {
|
return CallBackHolder.cb;
|
}
|
|
public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("Device[%s] Port[%d] Disconnect!\n" , pchDVRIP , nDVRPort);
|
}
|
}
|
|
// device reconnect callback
|
// call CLIENT_SetAutoReconnect to set it, when device reconnect, sdk will call it.
|
public static class HaveReConnectCallback implements NetSDKLib.fHaveReConnect{
|
|
private HaveReConnectCallback() {}
|
|
private static class CallBackHolder {
|
private static final HaveReConnectCallback cb = new HaveReConnectCallback();
|
}
|
|
public static final HaveReConnectCallback getInstance() {
|
return CallBackHolder.cb;
|
}
|
|
public void invoke(LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
/**
|
* Init Sdk and Login Device
|
*/
|
public void InitTest()
|
{
|
// init sdk
|
netsdkApi.CLIENT_Init(DisConnectCallback.getInstance(), null);
|
|
// Set re-connection callback function after disconnection. Internal SDK auto connect again after disconnection (Optional)
|
netsdkApi.CLIENT_SetAutoReconnect(HaveReConnectCallback.getInstance(), null);
|
|
// Set device connection timeout value and trial times, Optional
|
int waitTime = 5000; // connection 5s timeout
|
int tryTimes = 3; // trial 3 times
|
netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes);
|
|
// Open SDK log, Optional
|
LOG_SET_PRINT_INFO setLog = new 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 !!!");
|
}
|
|
// login device
|
int nSpecCap = 0;
|
Pointer pCapParam = null;
|
IntByReference nError = new IntByReference(0);
|
m_loginHandle = netsdkApi.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser ,
|
m_strPassword ,nSpecCap,pCapParam, deviceinfo,nError);
|
|
if(m_loginHandle.longValue() != 0) {
|
System.out.printf("Login Device[%s] Port[%d] Success!\n" , m_strIp , m_nPort);
|
}
|
else {
|
System.out.printf("Login Device[%s] Port[%d] Failed. %s\n" , m_strIp , m_nPort , ToolKits.getErrorCode());
|
}
|
}
|
|
/**
|
* Logout Device And Cleanup Sdk
|
*/
|
public void EndTest()
|
{
|
if( m_loginHandle.longValue() != 0)
|
{
|
netsdkApi.CLIENT_Logout(m_loginHandle);
|
}
|
|
netsdkApi.CLIENT_Cleanup();
|
System.exit(0);
|
}
|
|
/*************************************************************************************
|
* 云升级功能 *
|
*************************************************************************************/
|
public static String GetMD5(String src) {
|
String value = "";
|
try {
|
MessageDigest md5 = MessageDigest.getInstance("MD5");
|
md5.update(src.getBytes());
|
BigInteger bi = new BigInteger(1, md5.digest());
|
value = bi.toString(16).toUpperCase();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return value;
|
}
|
|
/**
|
* 云下载升级软件
|
*/
|
public void cloudUpgraderDownLoad() {
|
NET_IN_UPGRADER_GETSERIAL stuSerialIn = new NET_IN_UPGRADER_GETSERIAL();
|
NET_OUT_UPGRADER_GETSERIAL stuSerialOut = new NET_OUT_UPGRADER_GETSERIAL();
|
|
if (!netsdkApi.CLIENT_GetUpdateSerial(m_loginHandle, stuSerialIn, stuSerialOut, 3000)) {
|
System.err.println("从设备获取信息失败!" + ToolKits.getErrorCode());
|
return;
|
}
|
|
if (stuSerialOut.nRetNum <= 0) {
|
System.err.println("从设备获取信息失败 返回个数为0!");
|
return;
|
}
|
|
// 检查云端是否有可升级软件
|
NET_IN_CLOUD_UPGRADER_CHECK stuCheckIn = new NET_IN_CLOUD_UPGRADER_CHECK();
|
stuCheckIn.emVendor = stuSerialOut.stuSerialInfo[0].emVendor; //
|
stuCheckIn.emStandard = stuSerialOut.stuSerialInfo[0].emStandard; // 视频制式
|
stuCheckIn.stuBuild = stuSerialOut.stuSerialInfo[0].stuBuild; // 发布日期
|
|
System.arraycopy(stuSerialOut.stuSerialInfo[0].szLanguage, 0, stuCheckIn.szLanguage, 0, stuSerialOut.stuSerialInfo[0].szLanguage.length); // 语言
|
System.arraycopy(stuSerialOut.stuSerialInfo[0].szSerial, 0, stuCheckIn.szSerial, 0, stuSerialOut.stuSerialInfo[0].szSerial.length); // 内部型号
|
System.arraycopy(stuSerialOut.stuSerialInfo[0].szSWVersion, 0, stuCheckIn.szSWVersion, 0, stuSerialOut.stuSerialInfo[0].szSWVersion.length); // 软件版本
|
System.arraycopy(stuSerialOut.stuSerialInfo[0].szSn, 0, stuCheckIn.szSN, 0, stuSerialOut.stuSerialInfo[0].szSn.length); // 序列号
|
System.arraycopy(stuSerialOut.stuSerialInfo[0].szTag, 0, stuCheckIn.szTag1, 0, stuSerialOut.stuSerialInfo[0].szTag.length);
|
System.arraycopy(stuSerialOut.stuSerialInfo[0].szTag2, 0, stuCheckIn.szTag2, 0, stuSerialOut.stuSerialInfo[0].szTag2.length);
|
|
|
// String deviceClass = "HDC-SMART7016-P-V1";
|
// System.arraycopy(deviceClass.getBytes(), 0, stuCheckIn.szClass, 0, deviceClass.getBytes().length); // 设备大类
|
//
|
// String language = "Chn";
|
// System.arraycopy(language.getBytes(), 0, stuCheckIn.szLanguage, 0, language.getBytes().length);
|
//
|
// String swversion="V1.002.0000000.0.R.20190611";
|
// System.arraycopy(swversion.getBytes(), 0, stuCheckIn.szSWVersion, 0, swversion.getBytes().length);
|
//
|
// String szTag1="DSS:SMART7016,OS:LINUX";
|
// System.arraycopy(szTag1.getBytes(), 0, stuCheckIn.szTag1, 0, szTag1.getBytes().length);
|
// stuCheckIn.stuBuild.dwYear = 2019;
|
// stuCheckIn.stuBuild.dwMonth = 6;
|
// stuCheckIn.stuBuild.dwDay = 11;
|
//
|
// stuCheckIn.emStandard = ENUM_STANDARD_TYPE.ENUM_STANDARD_TYPE_PAL;
|
//
|
String szUrl="https://funcpaasupgrade.lechange.cn:443";
|
System.arraycopy(szUrl.getBytes(), 0, stuCheckIn.szUrl, 0, szUrl.getBytes().length);
|
|
// String sn = "SMART701620190611001"; // sn码
|
// System.arraycopy(sn.getBytes(), 0, stuCheckIn.szSN, 0, sn.getBytes().length);
|
|
String sn = new String(stuCheckIn.szSN).trim(); // SN码
|
String accessKeyId = String.format("DHUPGRADE-V1\\%s", sn);
|
System.arraycopy(accessKeyId.getBytes(), 0, stuCheckIn.szAccessKeyId, 0, accessKeyId.getBytes().length);
|
|
String secretAccessKey = String.format("DHUPDATE@%s&PAAS", GetMD5(sn)); // secretAccessKey
|
System.out.println(secretAccessKey);
|
|
secretAccessKey = GetMD5(secretAccessKey);
|
System.out.println(secretAccessKey);
|
System.arraycopy(secretAccessKey.getBytes(), 0, stuCheckIn.szSecretAccessKey, 0, secretAccessKey.getBytes().length);
|
|
|
NET_OUT_CLOUD_UPGRADER_CHECK stuCheckOut = new NET_OUT_CLOUD_UPGRADER_CHECK();
|
if (!netsdkApi.CLIENT_CloudUpgraderCheck(stuCheckIn, stuCheckOut, 5000)) {
|
System.err.println("检查云端是否有可升级软件失败!" + ToolKits.getErrorCode());
|
return;
|
}
|
|
if (stuCheckOut.bHasNewVersion == 0) {
|
System.err.println("无可升级版本!");
|
return;
|
}
|
|
// 云下载
|
NET_IN_CLOUD_UPGRADER_DOWN stuIn = new NET_IN_CLOUD_UPGRADER_DOWN();
|
|
System.arraycopy(stuCheckOut.szPackageUrl, 0, stuIn.szPackageUrl, 0, stuIn.szPackageUrl.length); // 设备升级包的URL
|
|
String saveFile = "cloudUpgrader.bin"; // 保存文件名
|
System.arraycopy(saveFile.getBytes(), 0, stuIn.szSaveFile, 0, saveFile.getBytes().length);
|
stuIn.pfProcessCallback = CloudDownloadProcessCallback.getInstance(); // 进度回调
|
|
NET_OUT_CLOUD_UPGRADER_DOWN stuOut = new NET_OUT_CLOUD_UPGRADER_DOWN();
|
|
m_hDownLoadHandle = netsdkApi.CLIENT_CloudUpgraderDownLoad(stuIn, stuOut);
|
if(m_hDownLoadHandle.longValue() != 0) {
|
System.out.println("Downloading...");
|
} else {
|
System.err.println("CloudUpgrader Download Failed!" + ToolKits.getErrorCode());
|
}
|
}
|
|
//上报升级结果
|
public void report() {
|
|
NET_UPGRADE_REPORT stuReport = new NET_UPGRADE_REPORT();
|
|
stuReport.emResult = NET_UPGRADE_REPORT_RESULT.NET_UPGRADE_REPORT_RESULT_SUCCESS;
|
|
stuReport.nDeviceNum = 1;
|
String serial = "HDC-SMART7016-P-V1";
|
System.arraycopy(
|
serial.getBytes(), 0, stuReport.szDevSerialArr[0].szDevSerial, 0, serial.getBytes().length);
|
|
String szCode = "success";
|
System.arraycopy(szCode.getBytes(), 0, stuReport.szCode, 0, szCode.getBytes().length);
|
|
String szPacketID = "2d5f6831f9ff441e88a6a9aeea05d760";
|
System.arraycopy(
|
szPacketID.getBytes(), 0, stuReport.szPacketID, 0, szPacketID.getBytes().length);
|
|
NET_IN_UPGRADE_REPORT stuIn = new NET_IN_UPGRADE_REPORT();
|
stuIn.nCount = 1;
|
stuIn.pstuUpgradeReport = stuReport.getPointer();
|
|
String szUrl="https://funcpaasupgrade.lechange.cn:443";
|
System.arraycopy(szUrl.getBytes(), 0, stuIn.szUrl, 0, szUrl.getBytes().length);
|
|
String sn = "SMART701620190611001"; // sn码
|
String accessKeyId = String.format("DHUPGRADE-V1\\%s", sn);
|
System.arraycopy(accessKeyId.getBytes(), 0, stuIn.szAccessKeyId, 0, accessKeyId.getBytes().length);
|
|
String secretAccessKey = String.format("DHUPDATE@%s&PAAS", GetMD5(sn)); // secretAccessKey
|
System.out.println(secretAccessKey);
|
|
secretAccessKey = GetMD5(secretAccessKey);
|
System.out.println(secretAccessKey);
|
System.arraycopy(secretAccessKey.getBytes(), 0, stuIn.szSecretAccessKey, 0, secretAccessKey.getBytes().length);
|
|
NET_OUT_UPGRADE_REPORT stuOut = new NET_OUT_UPGRADE_REPORT();
|
|
if (!netsdkApi.CLIENT_CloudUpgraderReport(stuIn, stuOut, 5000)) {
|
System.err.println("上报升级结果失败!" + ToolKits.getErrorCode());
|
}else {
|
System.err.println("升级结果已上报!");
|
}
|
}
|
|
/**
|
* 停止云下载
|
*/
|
public void stopDownLoad() {
|
stopDownLoad(m_hDownLoadHandle);
|
}
|
|
/**
|
* 停止下载
|
* @param hDownLoadHandle 下载句柄
|
*/
|
private static void stopDownLoad(LLong hDownLoadHandle) {
|
if (hDownLoadHandle.longValue() == 0) {
|
return;
|
}
|
netsdkApi.CLIENT_CloudUpgraderStop(hDownLoadHandle);
|
}
|
|
/**
|
* 暂停或恢复云下载
|
*/
|
public void pauseDownLoad() {
|
String type = "暂停";
|
if (!bPause) {
|
type = "恢复";
|
}
|
|
if (netsdkApi.CLIENT_CloudUpgraderPause(m_hDownLoadHandle, bPause?1:0)) {
|
System.out.printf(type + "%s下载成功!");
|
bPause = !bPause;
|
} else {
|
System.err.println(type + "%s下载失败!" + ToolKits.getErrorCode());
|
}
|
}
|
|
/**
|
* 下载进度回调
|
* 回调建议写成单例模式, 回调里处理数据,需要另开线程
|
*/
|
public static class CloudDownloadProcessCallback implements NetSDKLib.fCloudDownload_Process_callback {
|
|
private CloudDownloadProcessCallback() {}
|
|
private static class CallBackHolder {
|
private static final CloudDownloadProcessCallback cb = new CloudDownloadProcessCallback();
|
}
|
|
public static final CloudDownloadProcessCallback getInstance() {
|
return CallBackHolder.cb;
|
}
|
|
@Override
|
public void invoke(LLong lDownHandle, int emState,
|
double dwDownloadSpeed, int dwProgressPercentage, Pointer dwUser) {
|
|
if (emState == emCloudDownloadState.emCloudDownloadState_Success) { // 下载成功停止下载
|
new StopDownloadTask(lDownHandle).start();
|
}
|
}
|
|
private class StopDownloadTask extends Thread {
|
private LLong lDownloadHandle;
|
|
public StopDownloadTask(LLong lDownloadHandle) {
|
this.lDownloadHandle = lDownloadHandle;
|
}
|
|
public void run() {
|
stopDownLoad(lDownloadHandle);
|
}
|
}
|
}
|
|
/**
|
* 订阅升级状态观察
|
*/
|
public void attachState() {
|
|
NET_IN_CLOUD_UPGRADER_ATTACH_STATE stuIn = new NET_IN_CLOUD_UPGRADER_ATTACH_STATE();
|
stuIn.cbUpgraderState = CloudDownloadProcessCallback.getInstance(); // 进度回调
|
|
NET_OUT_CLOUD_UPGRADER_ATTACH_STATE stuOut = new NET_OUT_CLOUD_UPGRADER_ATTACH_STATE();
|
m_hAttachHandle = netsdkApi.CLIENT_CloudUpgraderAttachState(m_loginHandle, stuIn, stuOut, 3000);
|
if(m_hAttachHandle.longValue() != 0) {
|
System.out.println("Attach State...");
|
} else {
|
System.err.println("Cloud Upgrader Attach State Failed!" + ToolKits.getErrorCode());
|
}
|
}
|
|
/**
|
* 升级状态回调
|
* 回调建议写成单例模式, 回调里处理数据,需要另开线程
|
*/
|
public static class UpgraderStateCallback implements NetSDKLib.fUpgraderStateCallback {
|
|
private UpgraderStateCallback() {}
|
|
private static class CallBackHolder {
|
private static final UpgraderStateCallback cb = new UpgraderStateCallback();
|
}
|
|
public static final UpgraderStateCallback getInstance() {
|
return CallBackHolder.cb;
|
}
|
|
@Override
|
public void invoke(LLong lLoginId, LLong lAttachHandle,
|
NET_CLOUD_UPGRADER_STATE pBuf, int dwBufLen, Pointer pReserved,
|
Pointer dwUser) {
|
// TODO
|
}
|
|
}
|
|
|
/**
|
* 取消订阅升级状态观察
|
*/
|
public void detachState() {
|
if(m_hAttachHandle.longValue() != 0) {
|
netsdkApi.CLIENT_CloudUpgraderDetachState(m_hAttachHandle);
|
m_hAttachHandle.setValue(0);
|
}
|
}
|
|
/**
|
* 获取升级状态
|
*/
|
public void getState() {
|
|
NET_IN_CLOUD_UPGRADER_GET_STATE stuIn = new NET_IN_CLOUD_UPGRADER_GET_STATE();
|
|
NET_OUT_CLOUD_UPGRADER_GET_STATE stuOut = new NET_OUT_CLOUD_UPGRADER_GET_STATE();
|
if(netsdkApi.CLIENT_CloudUpgraderGetState(m_loginHandle, stuIn, stuOut, 3000)) {
|
PrintStruct.print(stuOut);
|
} else {
|
System.err.println("Cloud Upgrader Get State Failed!" + ToolKits.getErrorCode());
|
}
|
}
|
|
/**
|
* 在线云升级
|
*/
|
public void executeCloudUpgrader() {
|
|
// 在线升级检查是否有可用升级包
|
NET_IN_CHECK_CLOUD_UPGRADER stuCheckIn = new NET_IN_CHECK_CLOUD_UPGRADER();
|
stuCheckIn.nWay = 0; // 直连升级服务器检测
|
NET_OUT_CHECK_CLOUD_UPGRADER stuCheckOut = new NET_OUT_CHECK_CLOUD_UPGRADER();
|
if(!netsdkApi.CLIENT_CheckCloudUpgrader(m_loginHandle, stuCheckIn, stuCheckOut, 3000)) {
|
System.err.println("Cloud Upgrader Get State Failed!" + ToolKits.getErrorCode());
|
return;
|
}
|
|
if (stuCheckOut.emState == EM_CLOUD_UPGRADER_CHECK_STATE.EM_CLOUD_UPGRADER_CHECK_STATE_UNKNOWN
|
|| stuCheckOut.emState == EM_CLOUD_UPGRADER_CHECK_STATE.EM_CLOUD_UPGRADER_CHECK_STATE_NONE) {
|
System.err.println("升级状态未知或没有检测到更新");
|
return;
|
}
|
|
// 执行在线云升级
|
NET_IN_EXECUTE_CLOUD_UPGRADER stuIn = new NET_IN_EXECUTE_CLOUD_UPGRADER();
|
stuIn.nWay = stuCheckIn.nWay; // 直连升级服务器检测
|
stuIn.stProxy = stuCheckIn.stProxy; // 代理服务器地址, nWay==1时有意义
|
System.arraycopy(stuCheckOut.szNewVersion, 0, stuIn.szNewVersion, 0, stuIn.szNewVersion.length); // 上一次check得到的新版本号
|
System.arraycopy(stuCheckOut.szNewVersion, 0, stuIn.szNewVersion, 0, stuIn.szNewVersion.length); // 上一次check得到的新版本号
|
System.arraycopy(stuCheckOut.szPackageURL, 0, stuIn.stInfo.szPackageURL, 0, stuIn.stInfo.szPackageURL.length); // 升级包下载地址(代理升级需要)
|
System.arraycopy(stuCheckOut.szPackageID, 0, stuIn.stInfo.szPackageID, 0, stuIn.stInfo.szPackageID.length); // 升级包ID
|
System.arraycopy(stuCheckOut.szCheckSum, 0, stuIn.stInfo.szCheckSum, 0, stuIn.stInfo.szCheckSum.length); // 升级包的SHA-256校验和
|
|
NET_OUT_EXECUTE_CLOUD_UPGRADER stuOut = new NET_OUT_EXECUTE_CLOUD_UPGRADER();
|
if(!netsdkApi.CLIENT_ExecuteCloudUpgrader(m_loginHandle, stuIn, stuOut, 3000)) {
|
System.err.println("Execute Cloud Upgrader Failed!" + ToolKits.getErrorCode());
|
return;
|
}
|
}
|
|
/**
|
* 获取云升级在线升级状态
|
*/
|
public void getOnlineUpgraderState() {
|
|
NET_IN_GET_CLOUD_UPGRADER_STATE stuIn = new NET_IN_GET_CLOUD_UPGRADER_STATE();
|
|
NET_OUT_GET_CLOUD_UPGRADER_STATE stuOut = new NET_OUT_GET_CLOUD_UPGRADER_STATE();
|
if(netsdkApi.CLIENT_GetCloudUpgraderState(m_loginHandle, stuIn, stuOut, 3000)) {
|
PrintStruct.print(stuOut);
|
} else {
|
System.err.println("Cloud Upgrader Get State Failed!" + ToolKits.getErrorCode());
|
}
|
}
|
|
|
////////////////////////////////////////////////////////////////
|
String m_strIp = "172.23.1.102";
|
int m_nPort = 37777;
|
String m_strUser = "admin";
|
String m_strPassword = "admin456";
|
////////////////////////////////////////////////////////////////
|
|
public void RunTest()
|
{
|
System.out.println("Run Test");
|
CaseMenu menu = new CaseMenu();
|
menu.addItem(new CaseMenu.Item(this , "云下载升级软件" , "cloudUpgraderDownLoad"));
|
menu.addItem(new CaseMenu.Item(this , "停止下载" , "stopDownLoad"));
|
menu.addItem(new CaseMenu.Item(this , "暂停或恢复下载" , "pauseDownLoad"));
|
|
menu.run();
|
}
|
|
public static void main(String[]args)
|
{
|
CloudUpgrader demo = new CloudUpgrader();
|
demo.InitTest();
|
demo.RunTest();
|
demo.EndTest();
|
}
|
}
|