Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

347 строки
11 KiB

  1. package com.netsdk.demo.module;
  2. import java.awt.Panel;
  3. import com.netsdk.lib.NetSDKLib.CFG_DVRIP_INFO;
  4. import com.netsdk.lib.NetSDKLib.LLong;
  5. import com.netsdk.lib.NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY;
  6. import com.netsdk.lib.NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY;
  7. import com.netsdk.lib.NetSDKLib.fServiceCallBack;
  8. import com.netsdk.lib.NetSDKLib;
  9. import com.netsdk.lib.ToolKits;
  10. import com.sun.jna.Native;
  11. import com.sun.jna.Pointer;
  12. import com.sun.jna.ptr.IntByReference;
  13. public class AutoRegisterModule {
  14. // 监听服务句柄
  15. public static LLong mServerHandler = new LLong(0);
  16. // 设备信息
  17. public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
  18. // 语音对讲句柄
  19. public static LLong m_hTalkHandle = new LLong(0);
  20. private static boolean m_bRecordStatus = false;
  21. /**
  22. * 开启服务
  23. * @param address 本地IP地址
  24. * @param port 本地端口, 可以任意
  25. * @param callback 回调函数
  26. */
  27. public static boolean startServer(String address, int port, fServiceCallBack callback) {
  28. mServerHandler = LoginModule.netsdk.CLIENT_ListenServer(address, port, 1000, callback, null);
  29. if (0 == mServerHandler.longValue()) {
  30. System.err.println("Failed to start server." + ToolKits.getErrorCodePrint());
  31. } else {
  32. System.out.printf("Start server, [Server address %s][Server port %d]\n", address, port);
  33. }
  34. return mServerHandler.longValue() != 0;
  35. }
  36. /**
  37. * 结束服务
  38. */
  39. public static boolean stopServer() {
  40. boolean bRet = false;
  41. if(mServerHandler.longValue() != 0) {
  42. bRet = LoginModule.netsdk.CLIENT_StopListenServer(mServerHandler);
  43. mServerHandler.setValue(0);
  44. System.out.println("Stop server!");
  45. }
  46. return bRet;
  47. }
  48. /**
  49. * 登录设备(主动注册登陆接口)
  50. * @param m_strIp 设备IP
  51. * @param m_nPort 设备端口号
  52. * @param m_strUser 设备用户名
  53. * @param m_strPassword 设备密码
  54. * @param deviceId 设备ID
  55. * @return
  56. */
  57. public static LLong login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword, String deviceIds) {
  58. Pointer deviceId = ToolKits.GetGBKStringToPointer(deviceIds);
  59. //IntByReference nError = new IntByReference(0);
  60. //入参
  61. NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam=new NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY();
  62. pstInParam.nPort=m_nPort;
  63. pstInParam.szIP=m_strIp.getBytes();
  64. pstInParam.szPassword=m_strPassword.getBytes();
  65. pstInParam.szUserName=m_strUser.getBytes();
  66. pstInParam.emSpecCap = 2;// 主动注册方式
  67. pstInParam.pCapParam=deviceId;
  68. //出参
  69. NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam=new NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
  70. pstOutParam.stuDeviceInfo=m_stDeviceInfo;
  71. /*LLong m_hLoginHandle = LoginModule.netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword,
  72. tcpSpecCap, deviceId, m_stDeviceInfo, nError);*/
  73. LLong m_hLoginHandle=LoginModule.netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam);
  74. return m_hLoginHandle;
  75. }
  76. /**
  77. * 登出设备
  78. * @param m_hLoginHandle 登陆句柄
  79. * @return
  80. */
  81. public static boolean logout(LLong m_hLoginHandle) {
  82. boolean bRet = false;
  83. if(m_hLoginHandle.longValue() != 0) {
  84. bRet = LoginModule.netsdk.CLIENT_Logout(m_hLoginHandle);
  85. m_hLoginHandle.setValue(0);
  86. }
  87. return bRet;
  88. }
  89. /**
  90. * 开始预览
  91. * @param m_hLoginHandle 登陆句柄
  92. * @param channel 通道号
  93. * @param stream 码流类型
  94. * @param realPlayWindow 拉流窗口
  95. * @return
  96. */
  97. public static LLong startRealPlay(LLong m_hLoginHandle, int channel, int stream, Panel realPlayWindow) {
  98. LLong m_hPlayHandle = LoginModule.netsdk.CLIENT_RealPlayEx(m_hLoginHandle, channel, Native.getComponentPointer(realPlayWindow), stream);
  99. if(m_hPlayHandle.longValue() == 0) {
  100. System.err.println("Failed to start realplay." + ToolKits.getErrorCodePrint());
  101. } else {
  102. System.out.println("Success to start realplay");
  103. }
  104. return m_hPlayHandle;
  105. }
  106. /**
  107. * 停止预览
  108. * @param m_hPlayHandle 实时预览句柄
  109. * @return
  110. */
  111. public static boolean stopRealPlay(LLong m_hPlayHandle) {
  112. boolean bRet = false;
  113. if(m_hPlayHandle.longValue() != 0) {
  114. bRet = LoginModule.netsdk.CLIENT_StopRealPlayEx(m_hPlayHandle);
  115. m_hPlayHandle.setValue(0);
  116. }
  117. return bRet;
  118. }
  119. /**
  120. * 远程抓图
  121. * @param m_hLoginHandle 登陆句柄
  122. * @param chn 通道号
  123. * @return
  124. */
  125. public static boolean snapPicture(LLong m_hLoginHandle, int chn) {
  126. // 发送抓图命令给前端设备,抓图的信息
  127. NetSDKLib.SNAP_PARAMS msg = new NetSDKLib.SNAP_PARAMS();
  128. msg.Channel = chn; // 抓图通道
  129. msg.mode = 0; // 抓图模式
  130. msg.Quality = 3; // 画质
  131. msg.InterSnap = 0; // 定时抓图时间间隔
  132. msg.CmdSerial = 0; // 请求序列号,有效值范围 0~65535,超过范围会被截断为
  133. IntByReference reserved = new IntByReference(0);
  134. if (!LoginModule.netsdk.CLIENT_SnapPictureEx(m_hLoginHandle, msg, reserved)) {
  135. System.err.printf("SnapPictureEx Failed!" + ToolKits.getErrorCodePrint());
  136. return false;
  137. } else {
  138. System.out.println("SnapPictureEx success");
  139. }
  140. return true;
  141. }
  142. /**
  143. *设置抓图回调函数, 图片主要在m_SnapReceiveCB中返回
  144. * @param m_SnapReceiveCB
  145. */
  146. public static void setSnapRevCallBack(NetSDKLib.fSnapRev m_SnapReceiveCB){
  147. LoginModule.netsdk.CLIENT_SetSnapRevCallBack(m_SnapReceiveCB, null);
  148. }
  149. /**
  150. * 获取网络协议
  151. * @param m_hLoginHandle 登录句柄
  152. * @return
  153. */
  154. public static CFG_DVRIP_INFO getDVRIPConfig(LLong m_hLoginHandle) {
  155. CFG_DVRIP_INFO msg = new CFG_DVRIP_INFO();
  156. if(!ToolKits.GetDevConfig(m_hLoginHandle, -1, NetSDKLib.CFG_CMD_DVRIP, msg)) {
  157. return null;
  158. }
  159. return msg;
  160. }
  161. /**
  162. * 网络协议配置
  163. * @param m_hLoginHandle 登陆句柄
  164. * @param enable 使能
  165. * @param address 服务器地址
  166. * @param nPort 服务器端口号
  167. * @param deviceId 设备ID
  168. * @param info 获取到的网络协议配置
  169. * @return
  170. */
  171. public static boolean setDVRIPConfig(LLong m_hLoginHandle, boolean enable, String address, int nPort, byte[] deviceId, CFG_DVRIP_INFO info) {
  172. CFG_DVRIP_INFO msg = info;
  173. // 主动注册配置个数
  174. msg.nRegistersNum = 1;
  175. // 主动注册使能
  176. msg.stuRegisters[0].bEnable = enable? 1:0;
  177. // 服务器个数
  178. msg.stuRegisters[0].nServersNum = 1;
  179. // 服务器地址
  180. ToolKits.StringToByteArray(address, msg.stuRegisters[0].stuServers[0].szAddress);
  181. // 服务器端口号
  182. msg.stuRegisters[0].stuServers[0].nPort = nPort;
  183. // 设备ID
  184. ToolKits.ByteArrayToByteArray(deviceId, msg.stuRegisters[0].szDeviceID);
  185. return ToolKits.SetDevConfig(m_hLoginHandle, -1, NetSDKLib.CFG_CMD_DVRIP, msg);
  186. }
  187. /**
  188. * \if ENGLISH_LANG
  189. * Start Talk
  190. * \else
  191. * 开始通话
  192. * \endif
  193. */
  194. public static boolean startTalk(LLong m_hLoginHandle) {
  195. // 设置语音对讲编码格式
  196. NetSDKLib.NETDEV_TALKDECODE_INFO talkEncode = new NetSDKLib.NETDEV_TALKDECODE_INFO();
  197. talkEncode.encodeType = NetSDKLib.NET_TALK_CODING_TYPE.NET_TALK_PCM;
  198. talkEncode.dwSampleRate = 8000;
  199. talkEncode.nAudioBit = 16;
  200. talkEncode.nPacketPeriod = 25;
  201. talkEncode.write();
  202. if(LoginModule.netsdk.CLIENT_SetDeviceMode(m_hLoginHandle, NetSDKLib.EM_USEDEV_MODE.NET_TALK_ENCODE_TYPE, talkEncode.getPointer())) {
  203. System.out.println("Set Talk Encode Type Succeed!");
  204. } else {
  205. System.err.println("Set Talk Encode Type Failed!" + ToolKits.getErrorCodePrint());
  206. return false;
  207. }
  208. // 设置对讲模式
  209. NetSDKLib.NET_SPEAK_PARAM speak = new NetSDKLib.NET_SPEAK_PARAM();
  210. speak.nMode = 0;
  211. speak.bEnableWait = false;
  212. speak.nSpeakerChannel = 0;
  213. speak.write();
  214. if (LoginModule.netsdk.CLIENT_SetDeviceMode(m_hLoginHandle, NetSDKLib.EM_USEDEV_MODE.NET_TALK_SPEAK_PARAM, speak.getPointer())) {
  215. System.out.println("Set Talk Speak Mode Succeed!");
  216. } else {
  217. System.err.println("Set Talk Speak Mode Failed!" + ToolKits.getErrorCodePrint());
  218. return false;
  219. }
  220. // 设置语音对讲是否为转发模式
  221. NetSDKLib.NET_TALK_TRANSFER_PARAM talkTransfer = new NetSDKLib.NET_TALK_TRANSFER_PARAM();
  222. talkTransfer.bTransfer = 0; // 是否开启语音对讲转发模式, 1-true; 0-false
  223. talkTransfer.write();
  224. if(LoginModule.netsdk.CLIENT_SetDeviceMode(m_hLoginHandle, NetSDKLib.EM_USEDEV_MODE.NET_TALK_TRANSFER_MODE, talkTransfer.getPointer())) {
  225. System.out.println("Set Talk Transfer Mode Succeed!");
  226. } else {
  227. System.err.println("Set Talk Transfer Mode Failed!" + ToolKits.getErrorCodePrint());
  228. return false;
  229. }
  230. m_hTalkHandle = LoginModule.netsdk.CLIENT_StartTalkEx(m_hLoginHandle, AudioDataCB.getInstance(), null);
  231. if(m_hTalkHandle.longValue() == 0) {
  232. System.err.println("Start Talk Failed!" + ToolKits.getErrorCodePrint());
  233. return false;
  234. } else {
  235. System.out.println("Start Talk Success");
  236. if(LoginModule.netsdk.CLIENT_RecordStart()){
  237. System.out.println("Start Record Success");
  238. m_bRecordStatus = true;
  239. } else {
  240. System.err.println("Start Local Record Failed!" + ToolKits.getErrorCodePrint());
  241. stopTalk(m_hTalkHandle);
  242. return false;
  243. }
  244. }
  245. return true;
  246. }
  247. /**
  248. * \if ENGLISH_LANG
  249. * Stop Talk
  250. * \else
  251. * 结束通话
  252. * \endif
  253. */
  254. public static void stopTalk(LLong m_hTalkHandle) {
  255. if(m_hTalkHandle.longValue() == 0) {
  256. return;
  257. }
  258. if (m_bRecordStatus){
  259. LoginModule.netsdk.CLIENT_RecordStop();
  260. m_bRecordStatus = false;
  261. }
  262. if(!LoginModule.netsdk.CLIENT_StopTalkEx(m_hTalkHandle)) {
  263. System.err.println("Stop Talk Failed!" + ToolKits.getErrorCodePrint());
  264. } else {
  265. m_hTalkHandle.setValue(0);
  266. }
  267. }
  268. /**
  269. * \if ENGLISH_LANG
  270. * Audio Data Callback
  271. * \else
  272. * 语音对讲的数据回调
  273. * \endif
  274. */
  275. private static class AudioDataCB implements NetSDKLib.pfAudioDataCallBack {
  276. private AudioDataCB() {}
  277. private static AudioDataCB audioCallBack = new AudioDataCB();
  278. public static AudioDataCB getInstance() {
  279. return audioCallBack;
  280. }
  281. public void invoke(LLong lTalkHandle, Pointer pDataBuf, int dwBufSize, byte byAudioFlag, Pointer dwUser){
  282. if(lTalkHandle.longValue() != m_hTalkHandle.longValue()) {
  283. return;
  284. }
  285. if (byAudioFlag == 0) { // 将收到的本地PC端检测到的声卡数据发送给设备端
  286. LLong lSendSize = LoginModule.netsdk.CLIENT_TalkSendData(m_hTalkHandle, pDataBuf, dwBufSize);
  287. if(lSendSize.longValue() != (long)dwBufSize) {
  288. System.err.println("send incomplete" + lSendSize.longValue() + ":" + dwBufSize);
  289. }
  290. }else if (byAudioFlag == 1) { // 将收到的设备端发送过来的语音数据传给SDK解码播放
  291. LoginModule.netsdk.CLIENT_AudioDecEx(m_hTalkHandle, pDataBuf, dwBufSize);
  292. }
  293. }
  294. }
  295. }