【问题标题】:Hikvision camera SDK [Delphi] - error 7 NET_DVR_NETWORK_FAIL_CONNECT海康威视摄像机 SDK [Delphi] - 错误 7 NET_DVR_NETWORK_FAIL_CONNECT
【发布时间】:2019-05-30 02:39:32
【问题描述】:

海康摄像头连接不上,NET_DVR_Login_V30返回-1,NET_DVR_GetLastError返回7: “NET_DVR_NETWORK_FAIL_CONNECT - 连接设备失败。设备离线或网络连接超时。”

相机已100%在线并已配置,我可以使用ClientDemo.exe成功连接!

在wireshark中我看到它甚至没有尝试连接。

type
  LPNET_DVR_DEVICEINFO_V30 = ^NET_DVR_DEVICEINFO_V30;

  NET_DVR_DEVICEINFO_V30 = Record
    sSerialNumber: array [0 .. 47] of BYTE;
    byAlarmInPortNum: BYTE;
    byAlarmOutPortNum: BYTE;
    byDiskNum: BYTE;
    byDVRType: BYTE;
    byChanNum: BYTE;
    byStartChan: BYTE;
    byAudioChanNum: BYTE;
    byIPChanNum: BYTE;
    byZeroChanNum: BYTE;
    byMainProto: BYTE;
    bySubProto: BYTE;
    bySupport: BYTE;
    bySupport1: BYTE;
    byRes1: BYTE;
    wDevType: Word;
    byRes2: array [0 .. 15] of BYTE;
  end;

  (...)

var
  Form1: TForm1;
  ErrorValues: LongWord;
  lUserID: LONG;
  struDeviceInfo: NET_DVR_DEVICEINFO_V30;
  DVRIP, DVRUserName, DVRPassWord: String;


function NET_DVR_Init(): boolean; stdcall;
  external 'HCNetSDK.dll' name 'NET_DVR_Init';

function NET_DVR_Cleanup(): boolean; stdcall;
  external 'HCNetSDK.dll' name 'NET_DVR_Cleanup';

function NET_DVR_SetConnectTime(dwWaitTime, dwTryTimes: DWORD): boolean;
  stdcall; external 'HCNetSDK.dll' name 'NET_DVR_SetConnectTime';

function NET_DVR_SetReconnect(dwInterval: DWORD; bEnableRecon: boolean)
  : boolean; stdcall; external 'HCNetSDK.dll' name 'NET_DVR_SetReconnect';

function NET_DVR_GetLastError(): LongWord; stdcall;
  external 'HCNetSDK.dll' name 'NET_DVR_GetLastError';

function NET_DVR_Login_V30(sDVRIP: PChar; wDVRPort: Word; sUserName: PChar;
  sPassword: PChar; lpDeviceInfo: LPNET_DVR_DEVICEINFO_V30): LONG; stdcall;
  external 'HCNetSDK.dll' name 'NET_DVR_Login_V30';

function NET_DVR_Logout_V30(lUserID: LONG): boolean; stdcall;
  external 'HCNetSDK.dll' name 'NET_DVR_Logout_V30';


implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
  DVRIP := 'xxx.xxx.xxx.xxx';
  DVRUserName := 'demo';
  DVRPassWord := '12345';

  NET_DVR_Init();

  NET_DVR_SetConnectTime(2000, 1);
  NET_DVR_SetReconnect(10000, true);

  lUserID := NET_DVR_Login_V30(PChar(DVRIP), 8000, PChar(DVRUserName),
    PChar(DVRPassWord), @struDeviceInfo);
  Memo1.Lines.Add('lUserID:' + inttostr(lUserID));

  ErrorValues := NET_DVR_GetLastError();
  Memo1.Lines.Add('ErrorValues:' + inttostr(ErrorValues));

  NET_DVR_Logout_V30(lUserID);
  NET_DVR_Cleanup();

end;

问候

【问题讨论】:

  • 您使用哪个 Delphi 版本?也许您需要使用 PAnsiChar 而不是 PChar。我不知道 SDK。
  • 德尔福 10.1 柏林。 PAnsiChar 而不是 PChar 没有区别。上面在互联网上找到的代码已经很老了。
  • 不熟悉 SDK,但您有实际的 DVR 设置吗?如果没有,也许 API 有办法直接连接到相机……
  • SDK 由 2 个基本形式的 dll 组成。我正在使用与正确连接的 ClientDemo 相同的 dll。 Camera 有一个基于 http 的 API,它工作正常,但它有一些缺点,所以我正在尝试使用 SDK。
  • @GWimpassinger PAnsiChar 是关键!我没有纠正的一件事是从 String 到 AnsiString 的变量声明。谢谢。

标签: delphi hikvision


【解决方案1】:

要使其正常工作,原始代码需要 2 个修复:
1. 更正从 String 到 AnsiString 的变量声明
2. 将字符串作为 PAnsiChar 传递给 dll(正如 G Wimpassinger 指出的那样)

DVRIP, DVRUserName, DVRPassWord: AnsiString;
...

function NET_DVR_Login_V30(sDVRIP: PAnsiChar; wDVRPort: Word; sUserName: PAnsiChar;
  sPassword: PAnsiChar; lpDeviceInfo: LPNET_DVR_DEVICEINFO_V30): LONG; stdcall;
  external 'HCNetSDK.dll' name 'NET_DVR_Login_V30';
...

lUserID := NET_DVR_Login_V30(PAnsiChar(DVRIP), 8000, PAnsiChar(DVRUserName),
  PAnsiChar(DVRPassWord), @struDeviceInfo);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2019-07-12
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2020-10-01
    相关资源
    最近更新 更多