本文彙整服務端非核心但實用的四大功能模組:客戶端連線驗證(IP 與帳號密碼)、動態調整編碼畫質、OSD 字幕疊加(LOGO/時間)、讀取板卡序列號,並提供完整 C# 封裝程式碼。
// 回調委派
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int CheckIP(int nChannel, string nIP);
// 註冊
HikServer.MP4_ServerCheckIP(new CheckIP(CheckIPCallback));
// 實作
public int CheckIPCallback(int nChannel, string nIP)
{
// 例:拒絕特定 IP
// if (nIP == "192.168.0.200") return -1;
return 0; // 0=允許, -1=拒絕
}
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int CheckPassword(string username, ushort namelen, string password, ushort passlen);
HikServer.MP4_ServerCheckPassword(new CheckPassword(CheckPasswordCallback));
public int CheckPasswordCallback(string username, ushort namelen, string password, ushort passlen)
{
// 實際驗證邏輯(查資料庫、比對雜湊等)
// 注意:namelen/passlen 固定為 50,非實際長度
return ValidateUser(username, password) ? 0 : -1;
}
關鍵:委派必須聲明為類別成員,否則會被 GC 回收導致驗證失效。
對應 VC++ SetEncoderPictureFormat,支援即時切換:
public enum PictureFormat
{
ENC_QCIF_FORMAT = 0, // 低畫質
ENC_CIF_FORMAT = 1, // 中畫質
ENC_DCIF_FORMAT = 2, // 中高畫質
ENC_4CIF_FORMAT = 3 // 高畫質
}
public static void SetCurrentEncoderPictureFormat(IntPtr[] channelHandles, PictureFormat format)
{
foreach (var handle in channelHandles)
HikVisionSDK.SetEncoderPictureFormat(handle, format);
}
設定後畫面即時生效,無需重啟服務。

private const ushort OSD_BASE = 0x9000;
private const ushort OSD_YEAR4 = OSD_BASE + 0;
private const ushort OSD_MONTH2 = OSD_BASE + 3;
private const ushort OSD_DAY = OSD_BASE + 4;
private const ushort OSD_HOUR24 = OSD_BASE + 7;
private const ushort OSD_MINUTE = OSD_BASE + 9;
private const ushort OSD_SECOND = OSD_BASE + 10;
public void SetOsd(IntPtr[] channelHandles, bool enable)
{
if (enable)
{
// 第一行:固定文字 "HIKVISION"
ushort[] fmt1 = { 48, 16, 'H','I','K','V','I','S','I','O','N', '\0' };
// 第二行:時間格式 YYYY-MM-DD HH:MM:SS
ushort[] fmt2 = { 24, 50, OSD_YEAR4, '-', OSD_MONTH2, '-', OSD_DAY, '-', OSD_HOUR24, ':', OSD_MINUTE, ':', OSD_SECOND, '\0' };
foreach (var h in channelHandles)
{
HikVisionSDK.SetOsdDisplayMode(h, 255, true, 0, fmt1, fmt2);
HikVisionSDK.SetOsd(h, true);
}
}
else
{
foreach (var h in channelHandles)
HikVisionSDK.SetOsd(h, false);
}
}
中文顯示補充:將 fmt1 中對應字元替換為 Unicode 內碼(如「保」= 0xB1A3)即可顯示漢字。
public static string GetBoardSN()
{
uint count = HikVisionSDK.GetBoardCount();
StringBuilder sn = new StringBuilder();
for (uint i = 0; i < count; i++)
{
DS_BOARD_DETAIL detail = new DS_BOARD_DETAIL();
HikVisionSDK.GetBoardDetail(i, ref detail);
for (int j = 0; j < 12; j++)
sn.Append((char)(detail.sn[j] + 0x30));
break; // 只取第一張
}
return sn.ToString();
}
注意:結構體需 ref 傳遞;sn 陣列實際僅前 12 位有效。
服務端核心功能至此完結,後續將進入播放器篇。感謝持續關注本系列!