package com.netsdk.demo.customize; import java.io.File; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NativeString; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.*; import com.sun.jna.Memory; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; /** * 广告机相关接口 * 1、增加节目信息,返回节目id,用于修改、删除、查询 * 2、增加即时计划,返回计划id,用于修改、删除、查询 * 3、增加定时计划,返回计划id,用于修改、删除、查询 * 4、增加计划,需要用到节目名称、节目id等相关信息 * 5、linux的中文编码格式UTF-8 * 6、广告机与播放盒在添加、修改计划的时候,没用到分屏ID * 7、添加节目后,需要添加计划,才会有效果。 如果修改节目,需要通过修改计划来更新计划。 */ public class PlayBox_linux { static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; private NET_DEVICEINFO_Ex deviceinfo = new NET_DEVICEINFO_Ex(); private LLong loginHandle = new LLong(0); //登陆句柄 //设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 public 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 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 fDisConnectCB m_DisConnectCB = new fDisConnectCB(); private HaveReConnect haveReConnect = new HaveReConnect(); public void EndTest() { System.out.println("End Test"); if( loginHandle.longValue() != 0) { netsdkApi.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netsdkApi.CLIENT_Cleanup(); System.exit(0); } public void InitTest() { //初始化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 // 接口设置的登录设备超时时间和尝试次数意义相同,可选 NET_PARAM netParam = new NET_PARAM(); netParam.nConnectTime = 10000; //登录时尝试建立链接的超时时间 netsdkApi.CLIENT_SetNetworkParam(netParam); // 打开日志,可选 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 !!!"); } // 向设备登入 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); } else { System.out.printf("Login Device[%s] Port[%d]Fail.Last Error[%x]\n" , m_strIp , m_nPort , netsdkApi.CLIENT_GetLastError()); EndTest(); } } /******************************************************************************* * * 素材的上传、查询、删除 ** *******************************************************************************/ /** * 素材上传 */ public void uploadFile(){ NET_IN_UPLOAD_REMOTE_FILE inUploadFile = new NET_IN_UPLOAD_REMOTE_FILE(); inUploadFile.pszFileDst = new NativeString("4.JPG").getPointer(); // 目标文件路径,文件格式不固定 inUploadFile.pszFolderDst = new NativeString("/Download/").getPointer(); // 目标文件夹路径,null时,为默认路径, ""或null指的是 /mnt/sdcard/; /Download 或者 /Download/ 指的是/mnt/sdcard/Download/ inUploadFile.pszFileSrc = new NativeString("d:/4.JPG").getPointer(); // 源文件路径 inUploadFile.nPacketLen = 1024*2; NET_OUT_UPLOAD_REMOTE_FILE outUploadFile = new NET_OUT_UPLOAD_REMOTE_FILE(); inUploadFile.write(); boolean bRet = netsdkApi.CLIENT_UploadRemoteFile(loginHandle, inUploadFile, outUploadFile, 3000); inUploadFile.read(); if (bRet) { System.out.println("upload Remote Succeed."); }else { System.err.println("upload Remote Failed." + netsdkApi.CLIENT_GetLastError()); return; } } /** * 素材信息查询 */ public void listRemoteFile() { String szPath = "Download/"; // 查询的文件路径,指的是 /mnt/sdcard/Download/ // 出参 NET_OUT_LIST_REMOTE_FILE stOut = new NET_OUT_LIST_REMOTE_FILE(); SDK_REMOTE_FILE_INFO[] remoteFile = ToolKits.ListRemoteFile(loginHandle, szPath, stOut); if(remoteFile != null) { System.out.println("nRetFileCount : " + stOut.nRetFileCount); for(int i = 0; i < stOut.nRetFileCount; i++) { System.out.println("szPath : " + new String(remoteFile[i].szPath).trim()); } } else { System.err.println("ListRemoteFile Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 素材删除 */ public void removeFiles() { String szPath = "Download/4.JPG"; // 指的是/mnt/sdcard/Download/4.JPG if(ToolKits.RemoveRemoteFiles(loginHandle, szPath)) { System.out.println("RemoveRemoteFiles Succeed!"); } else { System.err.println("RemoveRemoteFiles Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 监听下载进度事件 */ public boolean startListenAlarm() { /// 设置报警事件回调 netsdkApi.CLIENT_SetDVRMessCallBack(MessCallBack.getInstance(), null); return netsdkApi.CLIENT_StartListenEx(loginHandle); } // 回调建议写成单例模式 private static class MessCallBack implements fMessCallBack { private MessCallBack() {} static MessCallBack msgCallBack = new MessCallBack(); public static MessCallBack getInstance() { return msgCallBack; } public boolean invoke(int lCommand, final LLong lLoginID, Pointer pStuEvent, int dwBufLen, String strDeviceIP, NativeLong nDevicePort, Pointer dwUser) { /// 具体事件类, switch (lCommand) { case NetSDKLib.NET_ALARM_DOWNLOAD_REMOTE_FILE: { // 下载远程文件事件 ALARM_DOWNLOAD_REMOTE_FILE_INFO msg = new ALARM_DOWNLOAD_REMOTE_FILE_INFO(); ToolKits.GetPointerData(pStuEvent, msg); System.out.println("下载进度:" + msg.nProgress); // 下载进度[0,100] break; } default: break; } return true; } } /******************************************************************************* * * 广告机的节目和计划操作 * * *******************************************************************************/ /** * 播放盒与广告机节目 * 在播放盒上添加一个节目 */ public void addOneProgramToPlayBox() { ////////////// 入参 ///////////// NET_IN_ADD_ONE_PLAYBOX_PRAGROM stIn = new NET_IN_ADD_ONE_PLAYBOX_PRAGROM(); // 节目名称 System.arraycopy("DH测试sdk".getBytes(), 0, stIn.stuPlayBoxProgram.szProgrammeName, 0, "DH测试sdk".getBytes().length); // 节目是否启用 stIn.stuPlayBoxProgram.bEnable = 1; // 节目类型,选择相关类型,来设置相关节目。 主要有:LOGO节目/广告条节目/普通节目 stIn.stuPlayBoxProgram.emProgramType = EM_PLAYBOXPROGRAM_TYPE.EM_PROGRAM_ON_PLAYBOX_ORDINARY; // 普通节目 switch (stIn.stuPlayBoxProgram.emProgramType) { case 0: // LOGO节目 { // LOGO路径 String logoPath = ""; System.arraycopy(logoPath.getBytes(), 0, stIn.stuPlayBoxProgram.stuLogoInfo.szLogoPath, 0, logoPath.getBytes().length); // LOGO位置 stIn.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.left = 0; stIn.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.top = 0; stIn.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.right = 1920; stIn.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.bottom = 1080; // 透明度, 0~100 stIn.stuPlayBoxProgram.stuLogoInfo.nDiaphaneity = 0; break; } case 1: // 广告条节目,对应平台的 通知管理 { // 广告内容 String content = "DH广告"; System.arraycopy(content.getBytes(), 0, stIn.stuPlayBoxProgram.stuBarInfo.szContent, 0, content.getBytes().length); // 字体颜色 stIn.stuPlayBoxProgram.stuBarInfo.stuFontColor.nRed = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuFontColor.nGreen = 255; stIn.stuPlayBoxProgram.stuBarInfo.stuFontColor.nBlue = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuFontColor.nAlpha = 1; // 字体大小 stIn.stuPlayBoxProgram.stuBarInfo.nFontSize = 10; // 字体类型 String fontType = "黑体"; System.arraycopy(fontType.getBytes(), 0, stIn.stuPlayBoxProgram.stuBarInfo.szFontStyle, 0, fontType.getBytes().length); // 播放速度 stIn.stuPlayBoxProgram.stuBarInfo.nPlaySpeed = 1; // 广告条位置 stIn.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.left = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.top = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.right = 1920; stIn.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.bottom = 1080; // 广告条背景颜色 stIn.stuPlayBoxProgram.stuBarInfo.stuBackColor.nRed = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuBackColor.nGreen = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuBackColor.nBlue = 250; stIn.stuPlayBoxProgram.stuBarInfo.stuBackColor.nAlpha = 0; // 透明度,0~100 stIn.stuPlayBoxProgram.stuBarInfo.nDiaphaneity = 0; break; } case 2: // 普通节目,对应平台的 我的节目 { // 节目是否保存为模板 stIn.stuPlayBoxProgram.stuOrdinaryInfo.bTempletState = 1; // 画布宽高,即分辨率 stIn.stuPlayBoxProgram.stuOrdinaryInfo.nWidth = 1920; stIn.stuPlayBoxProgram.stuOrdinaryInfo.nHeight = 1080; // 窗口数量 stIn.stuPlayBoxProgram.stuOrdinaryInfo.nWinCount = 1; //////// 窗口信息设置 //////// setWindowsInfo(stIn.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[0]); } default: break; } //////////////// 出参/////////////// NET_OUT_ADD_ONE_PLAYBOX_PRAGROM stOut = new NET_OUT_ADD_ONE_PLAYBOX_PRAGROM(); boolean bRet = netsdkApi.CLIENT_AddOneProgramToPlayBox(loginHandle, stIn, stOut, 4000); if(bRet){ System.out.println("节目ID:" + new String(stOut.szProgrammeID).trim()); } else { System.err.println("AddOneProgramToPlayBox Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 设置窗口信息 * @param nWinCount 播放盒上窗口个数 * @param stuWindowsInfo 播放盒上窗口信息, 参数 pstElementsBuf 里可以放多个素材,(规则: 素材类型 对应的素材信息 素材类型 对应的素材信息 素材类型 对应的素材信息) * 一个素材元素类型结构体对应一个具体的素材元素信息结构体,按字段大小,放入pstElementsBuf */ public void setWindowsInfo(NET_PLAYBOX_WINDOWS_INFO stuWindowsInfo) { ///////////// 窗口元素类型结构体初始化 ///////////////////// int count = 4; // 添加几种素材元素 stuWindowsInfo.nElementsCount = count; // 诱导屏窗口素材元素个数 NET_ELEMENT_COMMON_INFO[] elementCommonInfo = new NET_ELEMENT_COMMON_INFO[count]; for(int i = 0; i < count; i++) { elementCommonInfo[i] = new NET_ELEMENT_COMMON_INFO(); } int size = elementCommonInfo[0].size(); // 窗口元素类型结构体的大小 elementCommonInfo[0].emElementsType = EM_ELEMENTS_TYPE.EM_ELEMENTS_VIDEO; elementCommonInfo[1].emElementsType = EM_ELEMENTS_TYPE.EM_ELEMENTS_PICTURE; elementCommonInfo[2].emElementsType = EM_ELEMENTS_TYPE.EM_ELEMENTS_TEXT; elementCommonInfo[3].emElementsType = EM_ELEMENTS_TYPE.EM_ELEMENTS_PLACEHOLDER; // 获取总的bufLen大小,并给指针pstElementsBuf申请内存, 用于添加相关素材信息 int bufLen = 0; for(int i = 0; i < count; i++) { bufLen += getPlayBoxElementBufLength(elementCommonInfo[i].emElementsType) + size; } stuWindowsInfo.nBufLen = bufLen; stuWindowsInfo.pstElementsBuf = new Memory(bufLen); stuWindowsInfo.pstElementsBuf.clear(bufLen); /** * 设置广告机窗口信息 */ // 窗口位置 stuWindowsInfo.stuRect.left = 0; stuWindowsInfo.stuRect.top = 0; stuWindowsInfo.stuRect.right = 1920; stuWindowsInfo.stuRect.bottom = 1080; // 窗口Z轴序, 如果有重叠的话,哪个窗口在上面,哪个窗口在下面 stuWindowsInfo.nZorder = 1; // 窗口音量,相对整屏音量的百分比 stuWindowsInfo.nVolume = 10; // 颜色RGBA stuWindowsInfo.stuBackColor.nRed = 0; stuWindowsInfo.stuBackColor.nGreen = 0; stuWindowsInfo.stuBackColor.nBlue = 250; stuWindowsInfo.stuBackColor.nAlpha = 0; // 窗口背景透明度 stuWindowsInfo.nDiaphaneity = 50; // 窗口轮训类型: 节目周期/计划周期/自定义周期 stuWindowsInfo.emTourPeriodType = EM_TOURPERIOD_TYPE.EM_TOURPERIOD_CUSTOM; // 自定义轮训时间,单位秒, 轮训类型 emTourPeriodType 为自定义轮训时有效 // 节目周期:节目里的素材轮巡 计划周期:计划轮巡 自定义周期:自定义轮巡间隔 stuWindowsInfo.nTourPeriodTime = 5 * 60; /** * 根据 emElementsType 来设置具体的素材信息 */ int offSet = 0; // 指针pstElementsBuf 对应结构体的偏移量 ToolKits.SetStructDataToPointer(elementCommonInfo[0], stuWindowsInfo.pstElementsBuf, offSet); // 窗口元素通有信息转为pstElementsBuf offSet = setPlayBoxElementInfo(EM_ELEMENTS_TYPE.EM_ELEMENTS_VIDEO, stuWindowsInfo.pstElementsBuf, offSet + size, "/mnt/sdcard/dc.MP4"); // 设置具体的素材信息,转为pstElementsBuf, offSet为返回的偏移量 ToolKits.SetStructDataToPointer(elementCommonInfo[1], stuWindowsInfo.pstElementsBuf, offSet); // 窗口元素通有信息转为pstElementsBuf offSet = setPlayBoxElementInfo(EM_ELEMENTS_TYPE.EM_ELEMENTS_PICTURE, stuWindowsInfo.pstElementsBuf, offSet +size, "/mnt/sdcard/16.jpg"); // 设置具体的素材信息,转为pstElementsBuf, offSet为返回的偏移量 ToolKits.SetStructDataToPointer(elementCommonInfo[2], stuWindowsInfo.pstElementsBuf, offSet); // 窗口元素通有信息转为pstElementsBuf offSet = setPlayBoxElementInfo(EM_ELEMENTS_TYPE.EM_ELEMENTS_TEXT, stuWindowsInfo.pstElementsBuf, offSet + size, ""); // 设置具体的素材信息,转为pstElementsBuf, offSet为返回的偏移量 ToolKits.SetStructDataToPointer(elementCommonInfo[3], stuWindowsInfo.pstElementsBuf, offSet); // 窗口元素通有信息转为pstElementsBuf offSet = setPlayBoxElementInfo(EM_ELEMENTS_TYPE.EM_ELEMENTS_PLACEHOLDER, stuWindowsInfo.pstElementsBuf, offSet + size, ""); // 设置具体的素材信息,转为pstElementsBuf, offSet为返回的偏移量 } /** * 设置广告机具体的素材信息 * @param emElementsType 元素类型 * @param pstElementsBuf 播放盒窗口元素信息缓存区, 根据类型对应不同的结构体, 填充多个元素信息, 每个元素信息内容为 NET_ELEMENT_COMMON_INFO + 元素类型对应的结构体 * @param offSet 偏移量 * @return 返回窗口元素通有信息对应的偏移量 * @param path 文件素材地址 */ public int setPlayBoxElementInfo(int emElementsType, Pointer pstElementsBuf, int offSet, String path) { int offSize = 0; switch(emElementsType) { case EM_ELEMENTS_TYPE.EM_ELEMENTS_VIDEO: { // 视频元素 // 创建数组,并初始化 NET_VIDEO_ELEMENT_INFO msg = new NET_VIDEO_ELEMENT_INFO(); offSize = offSet + msg.size(); /////////// 设置相关素材信息 /////////////// msg.bFillerState = 1; // 是否垫片,垫片就是在当广告机没有节目的时候,用一张图片代替出厂时候的屏幕图片 msg.nPlayCount = 2; // 播放次数 // 素材自定义名称 String name = "视频素材"; System.arraycopy(name.getBytes(), 0, msg.szName, 0, name.getBytes().length); /** * 素材文件地址,有俩种方式,如下: * 1、可以通过本页的 listRemoteFile(), 查询设备的素材的信息,获取路径 * 2、可以填远程url地址,设备端会处理,不需要其他操作,下载的目录 /mnt/sdcard/Download */ System.arraycopy(path.getBytes(), 0, msg.szPath, 0, path.getBytes().length); // 将 NET_VIDEO_ELEMENT_INFO 数组的信息转换为Pointer pstElementsBuf ToolKits.SetStructDataToPointer(msg, pstElementsBuf, offSet); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_PICTURE: { // 图片元素 // 创建数组,并初始化 NET_PICTURE_ELEMENT_INFO msg = new NET_PICTURE_ELEMENT_INFO(); offSize = offSet + msg.size(); /////////// 设置相关素材信息 /////////////// msg.bFillerState = 1; // 是否垫片 msg.nPlayTime = 10; // 播放时间, 单位秒 msg.nPlayCount = 5; // 播放次数 msg.nDiaphaneity = 0; // 透明度, 0-100 msg.emEnterStyle = EM_PIC_STYLE_TYPE.EM_PIC_STYLE_DEFAULT; // 切入风格 msg.emExitStyle = EM_PIC_STYLE_TYPE.EM_PIC_STYLE_DEFAULT; // 切出风格 // 素材自定义名称 String name = "图片素材"; System.arraycopy(name.getBytes(), 0, msg.szName, 0, name.getBytes().length); /** * 素材地址,有俩种方式,如下: * 1、可以通过本页的 listRemoteFile(), 查询设备的素材的信息,获取路径 * 2、可以填远程url地址,设备端会处理,不需要其他操作, 下载的目录 /mnt/sdcard/Download */ System.arraycopy(path.getBytes(), 0, msg.szPath, 0, path.getBytes().length); // 将 NET_VIDEO_ELEMENT_INFO 数组的信息转换为Pointer pstElementsBuf ToolKits.SetStructDataToPointer(msg, pstElementsBuf, offSet); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_TEXT: { // 文本元素 // 创建数组,并初始化 NET_TEXT_ELEMENT_INFO msg = new NET_TEXT_ELEMENT_INFO(); // 创建数组,并初始化 offSize = offSet + msg.size(); /////////// 设置相关素材信息 /////////////// msg.bFillerState = 1; // 是否垫片 msg.stuElementsText.emHoriAlign = EM_HORI_ALIGN_TYPE.EM_HORI_ALIGN_UNKNOWN; // 水平对齐方向 msg.stuElementsText.emVertAlign = EM_HORI_ALIGN_TYPE.EM_HORI_ALIGN_UNKNOWN; // 垂直对齐方向 msg.stuElementsText.emEnterStyle = EM_PIC_STYLE_TYPE.EM_PIC_STYLE_DEFAULT; // 切入风格 msg.stuElementsText.emExitStyle = EM_PIC_STYLE_TYPE.EM_PIC_STYLE_DEFAULT; // 切出风格 // 素材自定义名称 String name = "文本素材"; System.arraycopy(name.getBytes(), 0, msg.szName, 0, name.getBytes().length); msg.stuElementsText.nFontSize = 10; // 字体大小 // 字体颜色 msg.stuElementsText.stuFontColor.nRed = 0; msg.stuElementsText.stuFontColor.nGreen = 0; msg.stuElementsText.stuFontColor.nBlue = 0; msg.stuElementsText.stuFontColor.nAlpha = 0; // 字体类型 String fontType = "黑体"; System.arraycopy(fontType.getBytes(), 0, msg.stuElementsText.szFontStyle, 0, fontType.getBytes().length); msg.stuElementsText.dbLineHeight = 1; // 行高 // 文本内容 String content = "DH文本内容"; // 素材名称 System.arraycopy(content.getBytes(), 0, msg.stuElementsText.szContent, 0, content.getBytes().length); // 将 NET_VIDEO_ELEMENT_INFO 数组的信息转换为Pointer pstElementsBuf ToolKits.SetStructDataToPointer(msg, pstElementsBuf, offSet); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_PLACEHOLDER: { // 占位符元素 // 创建数组,并初始化 NET_PLACEHOLDER_ELEMENT_INFO msg = new NET_PLACEHOLDER_ELEMENT_INFO(); offSize = offSet + msg.size(); /////////// 设置相关素材信息 /////////////// msg.bFillerState = 1; // 是否垫片 // 素材自定义名称 String name = "占位符素材"; System.arraycopy(name.getBytes(), 0, msg.szName, 0, name.getBytes().length); // 将 NET_PLACEHOLDER_ELEMENT_INFO 数组的信息转换为Pointer pstElementsBuf ToolKits.SetStructDataToPointer(msg, pstElementsBuf, offSet); break; } default: break; } return offSize; } /** * 获取广告机相关元素的结构体大小 * @param emElementsType 素材元素类型 * @return 返回元素结构体大小,用于给pstElementsBuf申请内存 */ public int getPlayBoxElementBufLength(int emElementsType) { int bufLen = 0; switch(emElementsType) { case EM_ELEMENTS_TYPE.EM_ELEMENTS_VIDEO: { // 视频元素 NET_VIDEO_ELEMENT_INFO msg = new NET_VIDEO_ELEMENT_INFO(); bufLen = msg.size(); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_PICTURE: { // 图片元素 NET_PICTURE_ELEMENT_INFO msg = new NET_PICTURE_ELEMENT_INFO(); bufLen = msg.size(); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_TEXT: { // 文本元素 NET_TEXT_ELEMENT_INFO msg = new NET_TEXT_ELEMENT_INFO(); bufLen = msg.size(); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_PLACEHOLDER: { // 占位符元素 NET_PLACEHOLDER_ELEMENT_INFO msg = new NET_PLACEHOLDER_ELEMENT_INFO(); bufLen = msg.size(); break; } default: break; } return bufLen; } /** * 播放盒与广告机节目 * 在播放盒上修改指定ID的节目信息 */ public void modifyProgramOnPlayBoxById() { // 入参 NET_IN_MODIFY_PLAYBOX_PROGRAM_BYID stIn = new NET_IN_MODIFY_PLAYBOX_PROGRAM_BYID(); // 节目ID String programmeID = "1131656534"; System.arraycopy(programmeID.getBytes(), 0, stIn.stuPlayBoxProgram.szProgrammeID, 0, programmeID.getBytes().length); /////////////////修改信息///////////////// // 节目名称 String programmeName = "DH测试"; System.arraycopy(programmeName.getBytes(), 0, stIn.stuPlayBoxProgram.szProgrammeName, 0, programmeName.getBytes().length); // 节目是否启用 stIn.stuPlayBoxProgram.bEnable = 1; // 节目类型,根据需要设置。 主要有:LOGO节目/广告条节目/普通节目 stIn.stuPlayBoxProgram.emProgramType = EM_PLAYBOXPROGRAM_TYPE.EM_PROGRAM_ON_PLAYBOX_ORDINARY; // 普通节目 switch (stIn.stuPlayBoxProgram.emProgramType) { case 0: // LOGO节目 { // LOGO路径 String logoPath = ""; System.arraycopy(logoPath.getBytes(), 0, stIn.stuPlayBoxProgram.stuLogoInfo.szLogoPath, 0, logoPath.getBytes().length); // LOGO位置 stIn.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.left = 0; stIn.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.top = 0; stIn.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.right = 1920; stIn.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.bottom = 1080; // 透明度, 0~100 stIn.stuPlayBoxProgram.stuLogoInfo.nDiaphaneity = 0; break; } case 1: // 广告条节目,对应平台的 通知管理 { // 广告内容 String content = "DH广告"; System.arraycopy(content.getBytes(), 0, stIn.stuPlayBoxProgram.stuBarInfo.szContent, 0, content.getBytes().length); // 字体颜色 stIn.stuPlayBoxProgram.stuBarInfo.stuFontColor.nRed = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuFontColor.nGreen = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuFontColor.nBlue = 250; stIn.stuPlayBoxProgram.stuBarInfo.stuFontColor.nAlpha = 0; // 字体大小 stIn.stuPlayBoxProgram.stuBarInfo.nFontSize = 10; // 字体类型 String fontType = "黑体"; System.arraycopy(fontType.getBytes(), 0, stIn.stuPlayBoxProgram.stuBarInfo.szFontStyle, 0, fontType.getBytes().length); // 播放速度 stIn.stuPlayBoxProgram.stuBarInfo.nPlaySpeed = 1; // 广告条位置 stIn.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.left = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.top = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.right = 1920; stIn.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.bottom = 1080; // 广告条背景颜色 stIn.stuPlayBoxProgram.stuBarInfo.stuBackColor.nRed = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuBackColor.nGreen = 0; stIn.stuPlayBoxProgram.stuBarInfo.stuBackColor.nBlue = 250; stIn.stuPlayBoxProgram.stuBarInfo.stuBackColor.nAlpha = 0; // 透明度,0~100 stIn.stuPlayBoxProgram.stuBarInfo.nDiaphaneity = 0; break; } case 2: // 普通节目,对应平台的 我的节目 { // 节目是否保存为模板 stIn.stuPlayBoxProgram.stuOrdinaryInfo.bTempletState = 1; // 画布宽高 stIn.stuPlayBoxProgram.stuOrdinaryInfo.nWidth = 1920; stIn.stuPlayBoxProgram.stuOrdinaryInfo.nHeight = 1080; // 窗口数量 stIn.stuPlayBoxProgram.stuOrdinaryInfo.nWinCount = 1; //////// 窗口信息设置 //////// setWindowsInfo(stIn.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[0]); } default: break; } // 出参 NET_OUT_MODIFY_PLAYBOX_PROGRAM_BYID stOut = new NET_OUT_MODIFY_PLAYBOX_PROGRAM_BYID(); boolean bRet = netsdkApi.CLIENT_ModifyProgramOnPlayBoxById(loginHandle, stIn, stOut, 4000); if(bRet) { System.out.println("ModifyProgramOnPlayBoxById Succeed!"); } else { System.err.println("ModifyProgramOnPlayBoxById Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 播放盒与广告机节目 * 获取播放盒上全部节目信息 */ public void getAllProgramOnPlayBox() { // 出参 NET_OUT_GET_ALL_PLAYBOX_PROGRAM stOut = new NET_OUT_GET_ALL_PLAYBOX_PROGRAM(); NET_PROGRAM_ON_PLAYBOX[] playboxArr = ToolKits.GetAllProgramOnPlayBox(loginHandle, stOut); if(playboxArr != null) { System.out.println("nRetProgramCount : " + stOut.nRetProgramCount); for(int i = 0; i < stOut.nRetProgramCount; i++) { System.out.println("\n节目名称 : " + new String(playboxArr[i].szProgrammeName).trim()); System.out.println("节目ID : " + new String(playboxArr[i].szProgrammeID).trim()); System.out.println("节目是否启动:" + playboxArr[i].bEnable); switch (playboxArr[i].emProgramType) { case EM_PLAYBOXPROGRAM_TYPE.EM_PROGRAM_ON_PLAYBOX_LOGO: // LOGO节目 System.out.println("LOGO路径 : " + new String(playboxArr[i].stuLogoInfo.szLogoPath).trim()); System.out.println("LOGO位置:" + playboxArr[i].stuLogoInfo.stuBackgroundRect.toString()); System.out.println("LOGO透明度:" + playboxArr[i].stuLogoInfo.nDiaphaneity); break; case EM_PLAYBOXPROGRAM_TYPE.EM_PROGRAM_ON_PLAYBOX_BAR: // 广告条节目 System.out.println("广告内容:" + new String(playboxArr[i].stuBarInfo.szContent).trim()); System.out.println("字体颜色:" + playboxArr[i].stuBarInfo.stuFontColor.toString()); System.out.println("字体大小:" + playboxArr[i].stuBarInfo.nFontSize); System.out.println("字体类型:" + new String(playboxArr[i].stuBarInfo.szFontStyle).trim()); System.out.println("播放速度:" + playboxArr[i].stuBarInfo.nPlaySpeed); System.out.println("广告条位置:" + playboxArr[i].stuBarInfo.stuBackgroundRect.toString()); System.out.println("广告条背景颜色:" + playboxArr[i].stuBarInfo.stuBackColor.toString()); System.out.println("透明度:" + playboxArr[i].stuBarInfo.nDiaphaneity); break; case EM_PLAYBOXPROGRAM_TYPE.EM_PROGRAM_ON_PLAYBOX_ORDINARY: // 普通节目 System.out.println("节目是否保存为模板 : " + playboxArr[i].stuOrdinaryInfo.bTempletState); System.out.println("画布宽高:" + playboxArr[i].stuOrdinaryInfo.nWidth + "/" + playboxArr[i].stuOrdinaryInfo.nHeight); for(int j = 0; j < playboxArr[i].stuOrdinaryInfo.nWinCount; j++) { System.out.println("窗口位置:" + playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].stuRect.toString()); System.out.println("窗口Z轴序:" + playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].nZorder); // 如果有重叠的话,哪个窗口在上面,哪个窗口在下面 System.out.println("窗口背景颜色:" + playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].stuBackColor.toString()); System.out.println("窗口背景透明 :" + playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].nDiaphaneity); System.out.println("窗口轮训类型:" + playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].emTourPeriodType); if(playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].emTourPeriodType == EM_TOURPERIOD_TYPE.EM_TOURPERIOD_CUSTOM) { System.out.println("自定义轮训时间:" + playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].nTourPeriodTime); } int elementCount = playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].nElementsCount; // 诱导屏窗口元素个数 if(elementCount < 1) { return; } NET_ELEMENT_COMMON_INFO[] elementCommonInfo = new NET_ELEMENT_COMMON_INFO[elementCount]; // 一个元素类型,对应一个具体的结构体信息 for(int k = 0; k < elementCount; k++) { elementCommonInfo[k] = new NET_ELEMENT_COMMON_INFO(); } int size = elementCommonInfo[0].size(); // 元素类型结构体大小 int offSet = 0; // 偏移量,用于输出元素类型和具体的元素信息 for(int m = 0; m < elementCount; m++) { ToolKits.GetPointerDataToStruct(playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].pstElementsBuf, offSet, elementCommonInfo[m]); // 解析素材元素类型 offSet = printElementInfo(elementCommonInfo[m].emElementsType, playboxArr[i].stuOrdinaryInfo.stuWindowsInfo[j].pstElementsBuf, offSet + size); // 打印具体的素材信息 } } break; default: break; } } } else { System.err.println("getAllProgramOnPlayBox Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 输出素材元素信息 * @param emElementsType 素材元素类型 * @param pstElementsBuf 用于输出素材元素类型以及对应的素材信息 * @param offSet 偏移量 * @return */ public int printElementInfo(int emElementsType, Pointer pstElementsBuf, int offSet) { int offSize = 0; switch (emElementsType) { case EM_ELEMENTS_TYPE.EM_ELEMENTS_VIDEO: { // 视频元素 System.out.println("视频元素"); NET_VIDEO_ELEMENT_INFO msg = new NET_VIDEO_ELEMENT_INFO(); offSize = offSet + msg.size(); // 将获取到的Pointer pstElementsBuf 的信息输出到结构体数组 NET_VIDEO_ELEMENT_INFO ToolKits.GetPointerDataToStruct(pstElementsBuf, offSet, msg); // 打印输出Pointer的值 System.out.println("素材自定义名称 : " + new String(msg.szName).trim()); System.out.println("是否垫片 : " + msg.bFillerState); // 文件地址 System.out.println("文件路径 : " + new String(msg.szPath).trim()); System.out.println("播放次数 : " + msg.nPlayCount); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_PICTURE: { // 图片元素 System.out.println("图片元素"); NET_PICTURE_ELEMENT_INFO msg = new NET_PICTURE_ELEMENT_INFO(); // 将获取到的Pointer pstElementsBuf 的信息输出到结构体数组 NET_PICTURE_ELEMENT_INFO ToolKits.GetPointerDataToStruct(pstElementsBuf, offSet, msg); offSize = offSet + msg.size(); // 打印输出Pointer的值 System.out.println("素材自定义名称 : " + new String(msg.szName).trim()); System.out.println("是否垫片 : " + msg.bFillerState); System.out.println("图片地址 : " + new String(msg.szPath).trim()); System.out.println("播放次数 : " + msg.nPlayCount); System.out.println("透明度 : " + msg.nDiaphaneity); System.out.println("切入风格 : " + msg.emEnterStyle); System.out.println("切出风格 : " + msg.emExitStyle); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_TEXT: { // 文本元素 System.out.println("文本元素"); NET_TEXT_ELEMENT_INFO msg = new NET_TEXT_ELEMENT_INFO(); // 将获取到的Pointer pstElementsBuf 的信息输出到结构体数组 NET_TEXT_ELEMENT_INFO ToolKits.GetPointerDataToStruct(pstElementsBuf, offSet, msg); offSize = offSet + msg.size(); // 打印输出Pointer的值 System.out.println("素材自定义名称 : " + new String(msg.szName).trim()); System.out.println("是否垫片 : " + msg.bFillerState); System.out.println("文本内容 : " + new String(msg.stuElementsText.szContent).trim()); System.out.println("字体大小 : " + msg.stuElementsText.nFontSize); System.out.println("字体颜色 : " + msg.stuElementsText.stuFontColor.toString()); System.out.println("字体类型 : " + new String(msg.stuElementsText.szFontStyle).trim()); System.out.println("行高 : " + msg.stuElementsText.dbLineHeight); System.out.println("水平对齐方式 : " + msg.stuElementsText.emHoriAlign); System.out.println("垂直对齐方式 : " + msg.stuElementsText.emVertAlign); System.out.println("切入风格 : " + msg.stuElementsText.emEnterStyle); System.out.println("切出风格 : " + msg.stuElementsText.emExitStyle); break; } case EM_ELEMENTS_TYPE.EM_ELEMENTS_PLACEHOLDER: { // 占位符元素 System.out.println("占位符元素"); NET_PLACEHOLDER_ELEMENT_INFO msg = new NET_PLACEHOLDER_ELEMENT_INFO(); // 将获取到的Pointer pstElementsBuf 的信息输出到结构体数组 NET_PLACEHOLDER_ELEMENT_INFO ToolKits.GetPointerDataToStruct(pstElementsBuf, offSet, msg); offSize = offSet + msg.size(); // 打印输出Pointer的值 System.out.println("素材自定义名称 : " + new String(msg.szName).trim()); System.out.println("是否垫片 : " + msg.bFillerState); break; } default: break; } return offSize; } /** * 播放盒与广告机节目 * 通过programme ID 获取播放盒上对应的节目信息 */ public void getOneProgramByIdOnPlayBox() { // 入参 NET_IN_GET_PLAYBOX_PROGRAM_BYID stIn = new NET_IN_GET_PLAYBOX_PROGRAM_BYID(); // 节目ID String programmeID = "1042793549"; System.arraycopy(programmeID.getBytes(), 0, stIn.szProgrammeID, 0, programmeID.getBytes().length); // 出参 NET_OUT_GET_PLAYBOX_PROGRAM_BYID stOut = new NET_OUT_GET_PLAYBOX_PROGRAM_BYID(); for(int j = 0; j < NetSDKLib.MAX_WINDOWS_COUNT; j++) { // 申请一块内存,自己设置,设置大点 stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].pstElementsBuf = new Memory(100 * 1024); stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].pstElementsBuf.clear(100 * 1024); stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].nBufLen = 100 * 1024; } boolean bRet = netsdkApi.CLIENT_GetOneProgramByIdOnPlayBox(loginHandle, stIn, stOut, 4000); if(bRet) { System.out.println("节目名称 : " + new String(stOut.stuPlayBoxProgram.szProgrammeName).trim()); System.out.println("节目ID : " + new String(stOut.stuPlayBoxProgram.szProgrammeID).trim()); System.out.println("节目是否启动:" + stOut.stuPlayBoxProgram.bEnable); switch (stOut.stuPlayBoxProgram.emProgramType) { case EM_PLAYBOXPROGRAM_TYPE.EM_PROGRAM_ON_PLAYBOX_LOGO: // LOGO节目 System.out.println("LOGO路径 : " + new String(stOut.stuPlayBoxProgram.stuLogoInfo.szLogoPath).trim()); System.out.println("LOGO位置:" + stOut.stuPlayBoxProgram.stuLogoInfo.stuBackgroundRect.toString()); System.out.println("LOGO透明度:" + stOut.stuPlayBoxProgram.stuLogoInfo.nDiaphaneity); break; case EM_PLAYBOXPROGRAM_TYPE.EM_PROGRAM_ON_PLAYBOX_BAR: // 广告条节目 System.out.println("广告内容:" + new String(stOut.stuPlayBoxProgram.stuBarInfo.szContent).trim()); System.out.println("字体颜色:" + stOut.stuPlayBoxProgram.stuBarInfo.stuFontColor.toString()); System.out.println("字体大小:" + stOut.stuPlayBoxProgram.stuBarInfo.nFontSize); System.out.println("字体类型:" + new String(stOut.stuPlayBoxProgram.stuBarInfo.szFontStyle).trim()); System.out.println("播放速度:" + stOut.stuPlayBoxProgram.stuBarInfo.nPlaySpeed); System.out.println("广告条位置:" + stOut.stuPlayBoxProgram.stuBarInfo.stuBackgroundRect.toString()); System.out.println("广告条背景颜色:" + stOut.stuPlayBoxProgram.stuBarInfo.stuBackColor.toString()); System.out.println("透明度:" + stOut.stuPlayBoxProgram.stuBarInfo.nDiaphaneity); break; case EM_PLAYBOXPROGRAM_TYPE.EM_PROGRAM_ON_PLAYBOX_ORDINARY: // 普通节目 System.out.println("节目是否保存为模板 : " + stOut.stuPlayBoxProgram.stuOrdinaryInfo.bTempletState); System.out.println("画布宽高:" + stOut.stuPlayBoxProgram.stuOrdinaryInfo.nWidth + "/" + stOut.stuPlayBoxProgram.stuOrdinaryInfo.nHeight); for(int j = 0; j < stOut.stuPlayBoxProgram.stuOrdinaryInfo.nWinCount; j++) { System.out.println("窗口位置:" + stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].stuRect.toString()); System.out.println("窗口Z轴序:" + stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].nZorder); // 如果有重叠的话,哪个窗口在上面,哪个窗口在下面 System.out.println("窗口背景颜色:" + stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].stuBackColor.toString()); System.out.println("窗口背景透明 :" + stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].nDiaphaneity); System.out.println("窗口轮训类型:" + stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].emTourPeriodType); if(stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].emTourPeriodType == EM_TOURPERIOD_TYPE.EM_TOURPERIOD_CUSTOM) { System.out.println("自定义轮训时间:" + stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].nTourPeriodTime); } int elementCount =stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].nElementsCount; // 诱导屏窗口元素个数 if(elementCount < 1) { return; } NET_ELEMENT_COMMON_INFO[] elementCommonInfo = new NET_ELEMENT_COMMON_INFO[elementCount]; // 一个元素类型,对应一个具体的结构体信息 for(int k = 0; k < elementCount; k++) { elementCommonInfo[k] = new NET_ELEMENT_COMMON_INFO(); } int size = elementCommonInfo[0].size(); // 元素类型结构体大小 int offSet = 0; // 偏移量,用于输出元素类型和具体的元素信息 for(int m = 0; m < elementCount; m++) { ToolKits.GetPointerDataToStruct(stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].pstElementsBuf, offSet, elementCommonInfo[m]); // 解析素材元素类型 offSet = printElementInfo(elementCommonInfo[m].emElementsType, stOut.stuPlayBoxProgram.stuOrdinaryInfo.stuWindowsInfo[j].pstElementsBuf, offSet + size); // 打印具体的素材信息 } } break; default: break; } } else { System.err.println("getOneProgramByIdOnPlayBox Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 播放盒与广告机节目 * 批量删除节目信息 */ public void delMultiProgrammesById() { String[] szProGrammeIdList = {"1984467517", "698463547"}; if(ToolKits.DelMultiProgrammesById(loginHandle, szProGrammeIdList)) { System.out.println("DelMultiProgrammesById Succeed!"); } else { System.err.println("DelMultiProgrammesById Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 增加一个即时节目计划,返回即时计划id * 节目名称、节目id是需要添加计划的节目名称和id */ public void addOneImmediProgrammePlan() { // 入参, inAdd.stuImmePlan.szPlanID无效,通过接口返回获取,此参数用于修改、删除 NET_IN_ADD_IMME_PROGRAMMEPLAN stIn = new NET_IN_ADD_IMME_PROGRAMMEPLAN(); // 即时计划名称 String planName = "即时计划123"; System.arraycopy(planName.getBytes(), 0, stIn.stuImmePlan.szPlanName, 0, planName.getBytes().length); // 节目名称 String programmeName = "DH测试sdk"; System.arraycopy(programmeName.getBytes(), 0, stIn.stuImmePlan.szProgrammeName, 0, programmeName.getBytes().length); // 节目id String programmeId = "1131656534"; System.arraycopy(programmeId.getBytes(), 0, stIn.stuImmePlan.szProgrammeID, 0, programmeId.getBytes().length); stIn.stuImmePlan.bEnable = 1; // 计划是否启用 stIn.stuImmePlan.nPlayTime = 1; // 播放时长, 单位 : 分钟 // 出参 NET_OUT_ADD_PROGRAMMEPLAN stOut = new NET_OUT_ADD_PROGRAMMEPLAN(); boolean bRet = netsdkApi.CLIENT_AddOneImmediProgrammePlan(loginHandle, stIn, stOut, 5000); if(bRet) { System.out.println("AddOneImmediProgrammePlan Succeed!"); System.out.println("szPlanID : " + new String(stOut.szPlanID).trim()); } else { System.err.println("AddOneImmediProgrammePlan Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 修改一个即时节目计划 * 计划id是要修改的计划id,是不可修改的,节目名称和节目id也不可修改 * 2018-02-27 2018-02-28 08:00:00 20:00:00 表示27号的8点到20点 28号的8点到20点 */ public void modifyOneImmediProgrammePlan() { // 入参 NET_IN_MODIFY_IMME_PROGRAMMEPLAN stIn = new NET_IN_MODIFY_IMME_PROGRAMMEPLAN(); // 需要修改的即时计划id String planId = "1"; System.arraycopy(planId.getBytes(), 0, stIn.stuImmePlan.szPlanID, 0, planId.getBytes().length); // 节目计划名称 String planName = "12"; System.arraycopy(planName.getBytes(), 0, stIn.stuImmePlan.szPlanName, 0, planName.getBytes().length); // 节目名称 String programmeName = "节目123"; System.arraycopy(programmeName.getBytes(), 0, stIn.stuImmePlan.szProgrammeName, 0, programmeName.getBytes().length); // 节目id String programmeId = "1833456707"; System.arraycopy(programmeId.getBytes(), 0, stIn.stuImmePlan.szProgrammeID, 0, programmeId.getBytes().length); stIn.stuImmePlan.bEnable = 1; // 计划是否启用 stIn.stuImmePlan.nPlayTime = 1; // 播放时长, 单位 : 分钟 // 出参 NET_OUT_MODIFY_IMME_PROGRAMMEPLAN stOut = new NET_OUT_MODIFY_IMME_PROGRAMMEPLAN(); boolean bRet = netsdkApi.CLIENT_ModifyOneImmediProgrammePlan(loginHandle, stIn, stOut, 5000); if(bRet) { System.out.println("ModifyOneImmediProgrammePlan Succeed!"); } else { System.err.println("ModifyOneImmediProgrammePlan Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 增加一个定时节目计划,返回定时计划id * 节目名称、节目id是需要添加计划的节目名称和id */ public void addOneTimerProgrammePlan() { // 入参,inAdd.stuTimerPlan.szPlanID无效,通过接口返回,此参数用于修改、删除 NET_IN_ADD_TIMER_PROGRAMMEPLAN stIn = new NET_IN_ADD_TIMER_PROGRAMMEPLAN(); String planName = "定时计划123"; // 定时计划名称 System.arraycopy(planName.getBytes(), 0, stIn.stuTimerPlan.szPlanName, 0, planName.getBytes().length); // 节目计划日期类型,每月/每周/每日/自定义 // 类型为每月时,nDataCount为几天,nPlayDates对应具体哪一天 // 类型为每周,nDataCount为几天,nPlayDates对应具体周几 // 类型为每日,nDataCount为几小时,nPlayDates对应具体几点 // 类型为自定义,stuSatrtDate stuEndDate 有效 stIn.stuTimerPlan.emDataType = EM_TIMERPLAN_DATE_TYPE.EM_TIMERPLAN_DATE_CUSTOM; // 自定义 // // 节目计划日期个数 // stIn.stuTimerPlan.nDataCount = 1; // // // 节目播放日期列表 // stIn.stuTimerPlan.nPlayDates[0] = 1; /////////////// emDataType为自定义时有效 ///////////// // 节目开始时间, 年月日 stIn.stuTimerPlan.stuSatrtDate.dwYear = 2018; stIn.stuTimerPlan.stuSatrtDate.dwMonth = 2; stIn.stuTimerPlan.stuSatrtDate.dwDay = 6; // 节目结束时间,时分秒 stIn.stuTimerPlan.stuEndDate.dwYear = 2018; stIn.stuTimerPlan.stuEndDate.dwMonth = 2; stIn.stuTimerPlan.stuEndDate.dwDay = 6; stIn.stuTimerPlan.nProgrammes = 1; // 节目个数,可添加好几个节目,自己设置 String programmeName= "DH测试sdk"; // 节目名称 System.arraycopy(programmeName.getBytes(), 0, stIn.stuTimerPlan.stuProgrammes[0].szProgrammeName, 0, programmeName.getBytes().length); String programmeId= "1131656534"; // 节目id System.arraycopy(programmeId.getBytes(), 0, stIn.stuTimerPlan.stuProgrammes[0].szProgrammeID, 0, programmeId.getBytes().length); // 节目开始时间, 时分秒 stIn.stuTimerPlan.stuProgrammes[0].stuSatrtTime.dwHour = 18; stIn.stuTimerPlan.stuProgrammes[0].stuSatrtTime.dwMinute = 45; stIn.stuTimerPlan.stuProgrammes[0].stuSatrtTime.dwSecond = 1; // 节目结束时间,时分秒 stIn.stuTimerPlan.stuProgrammes[0].stuEndTime.dwHour = 20; stIn.stuTimerPlan.stuProgrammes[0].stuEndTime.dwMinute = 40; stIn.stuTimerPlan.stuProgrammes[0].stuEndTime.dwSecond = 1; stIn.stuTimerPlan.stuProgrammes[0].bIsBgProgramme = 1; // 是否背景节目 // 出参 NET_OUT_ADD_PROGRAMMEPLAN stOut = new NET_OUT_ADD_PROGRAMMEPLAN(); boolean bRet = netsdkApi.CLIENT_AddOneTimerProgrammePlan(loginHandle, stIn, stOut, 5000); if(bRet) { System.out.println("AddOneTimerProgrammePlan Succeed!"); System.out.println("szPlanID : " + new String(stOut.szPlanID).trim()); } else { System.err.println("AddOneTimerProgrammePlan Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 修改一个定时节目计划 * 计划id是要修改的计划id,是不可修改的,节目名称和节目id也不可修改 */ public void modifyOneTimerProgrammePlan() { // 入参 NET_IN_MODIFY_TIMER_PROGRAMMEPLAN stIn = new NET_IN_MODIFY_TIMER_PROGRAMMEPLAN(); // 需要修改的定时计划id String planId = "107796599"; System.arraycopy(planId.getBytes(), 0, stIn.stuTimerPlan.szPlanID, 0, planId.getBytes().length); String planName = "定时计划123"; // 定时计划名称 System.arraycopy(planName.getBytes(), 0, stIn.stuTimerPlan.szPlanName, 0, planName.getBytes().length); // 节目计划日期类型,每月/每周/每日/自定义 // 类型为每月时,nDataCount为几天,nPlayDates对应具体哪一天 // 类型为每周,nDataCount为几天,nPlayDates对应具体周几 // 类型为每日,nDataCount为几小时,nPlayDates对应具体几点 // 类型为自定义,stuSatrtDate stuEndDate 有效 stIn.stuTimerPlan.emDataType = EM_TIMERPLAN_DATE_TYPE.EM_TIMERPLAN_DATE_CUSTOM; // 自定义 // // 节目计划日期个数 // stIn.stuTimerPlan.nDataCount = 1; // // // 节目播放日期列表 // stIn.stuTimerPlan.nPlayDates[0] = 1; /////////////// emDataType为自定义时有效 ///////////// // 节目开始时间, 年月日 stIn.stuTimerPlan.stuSatrtDate.dwYear = 2018; stIn.stuTimerPlan.stuSatrtDate.dwMonth = 2; stIn.stuTimerPlan.stuSatrtDate.dwDay = 6; // 节目结束时间,时分秒 stIn.stuTimerPlan.stuEndDate.dwYear = 2018; stIn.stuTimerPlan.stuEndDate.dwMonth = 2; stIn.stuTimerPlan.stuEndDate.dwDay = 6; stIn.stuTimerPlan.nProgrammes = 1; // 节目个数,可添加好几个节目,自己设置 String programmeName= "DH测试"; // 节目名称 System.arraycopy(programmeName.getBytes(), 0, stIn.stuTimerPlan.stuProgrammes[0].szProgrammeName, 0, programmeName.getBytes().length); String programmeId= "1131656534"; // 节目id System.arraycopy(programmeId.getBytes(), 0, stIn.stuTimerPlan.stuProgrammes[0].szProgrammeID, 0, programmeId.getBytes().length); // 节目开始时间, 时分秒 stIn.stuTimerPlan.stuProgrammes[0].stuSatrtTime.dwHour = 10; stIn.stuTimerPlan.stuProgrammes[0].stuSatrtTime.dwMinute = 21; stIn.stuTimerPlan.stuProgrammes[0].stuSatrtTime.dwSecond = 1; // 节目结束时间,时分秒 stIn.stuTimerPlan.stuProgrammes[0].stuEndTime.dwHour = 21; stIn.stuTimerPlan.stuProgrammes[0].stuEndTime.dwMinute = 1; stIn.stuTimerPlan.stuProgrammes[0].stuEndTime.dwSecond = 1; stIn.stuTimerPlan.stuProgrammes[0].bIsBgProgramme = 1; // 是否背景节目 //出参 NET_OUT_MODIFY_TIMER_PROGRAMMEPLAN stOut = new NET_OUT_MODIFY_TIMER_PROGRAMMEPLAN(); boolean bRet = netsdkApi.CLIENT_ModifyOneTimerProgrammePlan(loginHandle, stIn, stOut, 5000); if(bRet) { System.out.println("ModifyOneTimerProgrammePlan Succeed!"); } else { System.err.println("ModifyTimerProgrammePlan Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 删除多个节目计划,只需要下发节目id */ public void delMultiProgrammePlans() { String[] szPlanID = {"415409775", "444457"}; if(ToolKits.DelMultiProgrammePlans(loginHandle, szPlanID)) { System.out.println("DelMultiProgrammePlans Succeed!"); } else { System.err.println("DelMultiProgrammePlans Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 获取所有节目的简要信息 */ public void getAllBrieflyProgrammes() { // 入参 NET_IN_GET_ALL_BRIEFLYPROGRAMMES stIn = new NET_IN_GET_ALL_BRIEFLYPROGRAMMES(); // 出参 NET_OUT_GET_ALL_BRIEFLYPROGRAMMES stOut = new NET_OUT_GET_ALL_BRIEFLYPROGRAMMES(); boolean bRet = netsdkApi.CLIENT_GetAllBrieflyProgrammes(loginHandle, stIn, stOut, 5000); if(bRet) { System.out.println("实际返回的节目简要信息个数 : " + stOut.nRetCnt); for(int i = 0; i < stOut.nRetCnt; i++) { System.out.println("节目名称 :" + new String(stOut.stuBriProgrammes[i].szProgrammeName).trim()); System.out.println("节目ID :" + new String(stOut.stuBriProgrammes[i].szProgrammeID).trim()); System.out.println("节目是否启用 :" + stOut.stuBriProgrammes[i].bEnable); System.out.println("节目是否保存为模板 :" + stOut.stuBriProgrammes[i].bTempletState); } } else { System.err.println("GetAllBrieflyProgrammes Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 获取所有节目计划信息 */ public void getAllProgrammePlans() { // 出参 NET_OUT_GET_ALL_PROGRAMMEPLANS stOut = new NET_OUT_GET_ALL_PROGRAMMEPLANS(); NET_PROGRAMME_PLANS_INFO planInfo = ToolKits.GetAllProgrammePlans(loginHandle, stOut); if(planInfo != null) { System.out.println("实际返回的即时节目计划个数 : " + stOut.nRetImmCnt); System.out.println("实际返回的定时节目计划个数 :" + stOut.nRetTimerCnt); for(int i = 0; i < stOut.nRetImmCnt; i++) { System.out.println("\n即时计划查询"); System.out.println("即时发布的节目名称 : " + new String(planInfo.szImmePlan[i].szProgrammeName).trim()); System.out.println("即时发布的节目ID : " + new String(planInfo.szImmePlan[i].szProgrammeID).trim()); System.out.println("节目计划名称 : " + new String(planInfo.szImmePlan[i].szPlanName).trim()); System.out.println("节目计划ID : " + new String(planInfo.szImmePlan[i].szPlanID).trim()); System.out.println("计划是否启用 : " + planInfo.szImmePlan[i].bEnable); System.out.println("播放时长 : " + planInfo.szImmePlan[i].nPlayTime); // 播放时长, 单位 : 分钟 } for(int i = 0; i < stOut.nRetTimerCnt; i++) { System.out.println("\n定时计划查询"); System.out.println("节目计划名称 : " + new String(planInfo.szTimerPlan[i].szPlanName).trim()); System.out.println("节目计划ID : " + new String(planInfo.szTimerPlan[i].szPlanID).trim()); System.out.println("节目开始日期 : " + planInfo.szTimerPlan[i].stuSatrtDate.toString()); System.out.println("节目结束日期 : " + planInfo.szTimerPlan[i].stuEndDate.toString()); for(int j = 0; j < planInfo.szTimerPlan[i].nProgrammes; j++) { System.out.println("节目名称 : " + new String(planInfo.szTimerPlan[i].stuProgrammes[j].szProgrammeName).trim()); System.out.println("节目ID : " + new String(planInfo.szTimerPlan[i].stuProgrammes[j].szProgrammeID).trim()); System.out.println("节目开始时间 : " + planInfo.szTimerPlan[i].stuProgrammes[j].stuSatrtTime.toString()); System.out.println("节目结束时间 : " + planInfo.szTimerPlan[i].stuProgrammes[j].stuEndTime.toString()); System.out.println("是否背景节目 : " + planInfo.szTimerPlan[i].stuProgrammes[j].bIsBgProgramme); } } } else { System.err.println("GetAllProgrammePlans Failed!" + netsdkApi.CLIENT_GetLastError()); } } /** * 通过节目计划ID 获取节目计划,入参只需要下发计划ID */ public void getOneProgrammePlanByID() { // 入参 NET_IN_GET_PROGRAMMEPLAN_BYID stIn = new NET_IN_GET_PROGRAMMEPLAN_BYID(); String planId = "188899095"; System.arraycopy(planId.getBytes(), 0, stIn.szPlanID, 0, planId.getBytes().length); // 出参 NET_OUT_GET_PROGRAMMEPLAN_BYID stOut = new NET_OUT_GET_PROGRAMMEPLAN_BYID(); stOut.emPlanType = EM_PROGRAMMEPLAN_TYPE.EM_PROGRAMMEPLAN_IMME; // 即时节目计划信息, NET_IMMEDIATELY_PLAN_INFO stuImmePlan有效 // stOut.emPlanType = EM_PROGRAMMEPLAN_TYPE.EM_PROGRAMMEPLAN_TIMER; // 定时节目计划信息, NET_TIMER_PLAN_INFO stuTimerPlan有效 boolean bRet = netsdkApi.CLIENT_GetOneProgrammePlanByID(loginHandle, stIn, stOut, 5000); if(bRet) { // 当stOut.emPlanType = EM_PROGRAMMEPLAN_TYPE.EM_PROGRAMMEPLAN_IMME 时, NET_IMMEDIATELY_PLAN_INFO stuImmePlan 有效 System.out.println("即时发布的节目名称 : " + new String(stOut.stuImmePlan.szProgrammeName).trim()); System.out.println("即时发布的节目ID : " + new String(stOut.stuImmePlan.szProgrammeID).trim()); System.out.println("节目计划名称 : " + new String(stOut.stuImmePlan.szPlanName).trim()); System.out.println("节目计划ID : " + new String(stOut.stuImmePlan.szPlanID).trim()); System.out.println("计划是否启用 : " + stOut.stuImmePlan.bEnable); System.out.println("播放时长 : " + stOut.stuImmePlan.nPlayTime); // 当stOut.emPlanType = EM_PROGRAMMEPLAN_TYPE.EM_PROGRAMMEPLAN_TIMER 时, NET_TIMER_PLAN_INFO stuTimerPlan 有效 System.out.println("定时节目计划名称 : " + new String(stOut.stuTimerPlan.szPlanName).trim()); System.out.println("节目计划ID : " + new String(stOut.stuTimerPlan.szPlanID).trim()); System.out.println("节目开始日期 : " + stOut.stuTimerPlan.stuSatrtDate.toString()); System.out.println("节目结束日期 : " + stOut.stuTimerPlan.stuEndDate.toString()); for(int j = 0; j < stOut.stuTimerPlan.nProgrammes; j++) { System.out.println("节目名称 : " + new String(stOut.stuTimerPlan.stuProgrammes[j].szProgrammeName).trim()); System.out.println("节目ID : " + new String(stOut.stuTimerPlan.stuProgrammes[j].szProgrammeID).trim()); System.out.println("节目开始时间 : " + stOut.stuTimerPlan.stuProgrammes[j].stuSatrtTime.toString()); System.out.println("节目结束时间 : " + stOut.stuTimerPlan.stuProgrammes[j].stuEndTime.toString()); System.out.println("是否背景节目 : " + stOut.stuTimerPlan.stuProgrammes[j].bIsBgProgramme); } } else { System.err.println("GetOneProgrammePlanByID Failed!" + netsdkApi.CLIENT_GetLastError()); } } //////////////////////////////////////////////////////////////// String m_strIp = "172.3.5.126"; int m_nPort = 37777; String m_strUser = "admin"; String m_strPassword = "admin"; //////////////////////////////////////////////////////////////// public void RunTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this , "素材上传", "uploadFile")); menu.addItem(new CaseMenu.Item(this , "素材信息查询", "listRemoteFile")); menu.addItem(new CaseMenu.Item(this , "素材删除", "removeFiles")); menu.addItem(new CaseMenu.Item(this , "监听下载进度", "startListenAlarm")); menu.addItem(new CaseMenu.Item(this , "播放盒上添加一个节目", "addOneProgramToPlayBox")); menu.addItem(new CaseMenu.Item(this , "在播放盒上修改指定ID的节目信息", "modifyProgramOnPlayBoxById")); menu.addItem(new CaseMenu.Item(this , "获取播放盒上全部节目信息", "getAllProgramOnPlayBox")); menu.addItem(new CaseMenu.Item(this , "通过programme ID 获取播放盒上对应的节目信息", "getOneProgramByIdOnPlayBox")); menu.addItem(new CaseMenu.Item(this , "删除节目", "delMultiProgrammesById")); menu.addItem(new CaseMenu.Item(this , "日计划制作(定时计划)", "addOneTimerProgrammePlan")); menu.addItem(new CaseMenu.Item(this , "修改日计划(定时计划)", "modifyOneTimerProgrammePlan")); menu.addItem(new CaseMenu.Item(this , "自定义计划制作(即时计划)", "addOneImmediProgrammePlan")); menu.addItem(new CaseMenu.Item(this , "修改自定义计划(即时计划)", "modifyOneImmediProgrammePlan")); menu.addItem(new CaseMenu.Item(this , "发布计划查询(获取所有节目计划信息)", "getAllProgrammePlans")); menu.addItem(new CaseMenu.Item(this , "发布计划查询(通过节目计划ID 获取节目计划)", "getOneProgrammePlanByID")); menu.addItem(new CaseMenu.Item(this , "发布计划删除", "delMultiProgrammePlans")); menu.run(); } public static void main(String[]args) { PlayBox_win demo = new PlayBox_win(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }