using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarLocalMeter
{
///
/// 摄像头车号获取
///
public class CarNoCls
{
#region
private bool m_bInitSDK = false;
private uint iLastErr = 0;
private Int32 m_lUserID = -1;
private Int32 m_lRealHandle = -1;
//int iFileNumber = 0;
private int[] iChannelNum = new int[96];
private Int32[] m_lAlarmHandle = new Int32[200];
private CHCNetSDK.MSGCallBack_V31 m_falarmData_V31 = null;
private CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo;
public delegate void MyDebugInfo(string str);
private bool bQj = true; //是否是枪机
#endregion
public CarNoCls()
{
m_bInitSDK = CHCNetSDK.NET_DVR_Init();
if (m_bInitSDK == false)
{
MessageBox.Show("NET_DVR_Init error!");
return;
}
else
{
//保存SDK日志 To save the SDK log
CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);
for (int i = 0; i < 64; i++)
{
iChannelNum[i] = -1;
}
//设置报警回调函数
if (m_falarmData_V31 == null)
{
m_falarmData_V31 = new CHCNetSDK.MSGCallBack_V31(MsgCallback_V31);
}
CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(m_falarmData_V31, IntPtr.Zero);
}
}
public bool MsgCallback_V31(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
//通过lCommand来判断接收到的报警信息类型,不同的lCommand对应不同的pAlarmInfo内容
AlarmMessageHandle(lCommand, ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
return true; //回调函数需要有返回,表示正常接收到数据
}
public void AlarmMessageHandle(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
if (lCommand == CHCNetSDK.COMM_ITS_PLATE_RESULT)
{
ProcessCommAlarm_ITSPlate(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
}
}
private void ProcessCommAlarm_ITSPlate(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
CHCNetSDK.NET_ITS_PLATE_RESULT struITSPlateResult = new CHCNetSDK.NET_ITS_PLATE_RESULT();
struITSPlateResult = (CHCNetSDK.NET_ITS_PLATE_RESULT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_ITS_PLATE_RESULT));
uint dwSize = (uint)Marshal.SizeOf(struITSPlateResult);
//上传结果
string stringPlateLicense = System.Text.Encoding.GetEncoding("GBK").GetString(struITSPlateResult.struPlateInfo.sLicense).TrimEnd('\0');
string stringAlarm = "抓拍上传," + "车牌:" + stringPlateLicense + ",车辆序号:" + struITSPlateResult.struVehicleInfo.dwIndex;
if (bQj)
CacleCls.voicCarNo = stringPlateLicense.Replace("黄", "").Replace("蓝", "").Replace("绿", "").Replace("白", ""); //枪机
else
CacleCls.voicCarNo2 = stringPlateLicense.Replace("黄", "").Replace("蓝", "").Replace("绿", "").Replace("白", ""); //球机
DebugInfo(stringAlarm);
}
public void Login(string Ip, int port, string uid, string pwd, bool flag = true)
{
bQj = flag;
if (string.IsNullOrEmpty(Ip) || string.IsNullOrEmpty(uid) || string.IsNullOrEmpty(pwd))
{
DebugInfo("请先载入摄像头信息");
}
if (m_lUserID < 0)
{
string DVRIPAddress = Ip; //设备IP地址或者域名 Device IP
Int16 DVRPortNumber = (Int16)port; //port
string DVRUserName = uid;//设备登录用户名 User name to login
string DVRPassword = pwd;//设备登录密码 Password to login
//登录设备 Login the device
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(DVRIPAddress, DVRPortNumber, DVRUserName, DVRPassword, ref DeviceInfo);
if (m_lUserID < 0)
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
//登录失败,输出错误号 Failed to login and output the error code
DebugInfo($"NET_DVR_Login_V30 failed, error code= {iLastErr}");
return;
}
else
{
//登录成功
DebugInfo("NET_DVR_Login_V30 succ!");
SetAlarm();
}
}
}
///
/// 登录后进行布防,布防后才能触发获取车号的功能
///
public void SetAlarm()
{
CHCNetSDK.NET_DVR_SETUPALARM_PARAM struAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM();
struAlarmParam.dwSize = (uint)Marshal.SizeOf(struAlarmParam);
struAlarmParam.byLevel = 1; //0- 一级布防,1- 二级布防
struAlarmParam.byAlarmInfoType = 1;//智能交通设备有效,新报警信息类型
struAlarmParam.byFaceAlarmDetection = 1;//1-人脸侦测
m_lAlarmHandle[m_lUserID] = CHCNetSDK.NET_DVR_SetupAlarmChan_V41(m_lUserID, ref struAlarmParam);
if (m_lAlarmHandle[m_lUserID] < 0)
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
string strErr = "布防失败,错误号:" + iLastErr; //布防失败,输出错误号
DebugInfo(strErr);
}
else
{
//"布防成功"
DebugInfo("布防成功");
}
}
public void LoginOut()
{
//注销登录 Logout the device
if (m_lRealHandle >= 0)
{
DebugInfo("Please stop live view firstly"); //登出前先停止预览 Stop live view before logout
return;
}
if (m_lAlarmHandle[m_lUserID] >= 0)
{
if (!CHCNetSDK.NET_DVR_CloseAlarmChan_V30(m_lAlarmHandle[m_lUserID]))
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
string strErr = "撤防失败,错误号:" + iLastErr;
DebugInfo(strErr);
}
else
{
m_lAlarmHandle[m_lUserID] = -1;
}
}
if (!CHCNetSDK.NET_DVR_Logout(m_lUserID))
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
DebugInfo($"NET_DVR_Logout failed, error code= {iLastErr}");
return;
}
DebugInfo("NET_DVR_Logout succ!");
m_lUserID = -1;
//程序退出的时候释放资源
CHCNetSDK.NET_DVR_Cleanup();
}
CHCNetSDK.NET_DVR_JPEGPARA jpegPara = new CHCNetSDK.NET_DVR_JPEGPARA();
public void CapturePictrue2(string fileUrl)
{
jpegPara.wPicQuality = 0;
jpegPara.wPicSize = 4;
string str = "";
Log.GetInstance().WriteLog(LogType.VoiceLog, "完成快速仪表拍照:" + "车号:" + CacleCls.lockCarNo + ";重量:" + CacleCls.lockWgt + ";时间:" + DateTime.Now.ToLongTimeString());
if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(m_lUserID, 1, ref jpegPara, fileUrl))
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
str = "NET_DVR_CaptureJPEGPicture failed, error code= " + iLastErr;
DebugInfo(str);
return;
}
Log.GetInstance().WriteLog(LogType.VoiceLog, "结束快速仪表拍照:" + "车号:" + CacleCls.lockCarNo + ";重量:" + CacleCls.lockWgt + ";时间:" + DateTime.Now.ToLongTimeString());
}
protected void DebugInfo(string strMsg)
{
try
{
string m_szRunPath;
m_szRunPath = System.Environment.CurrentDirectory;
if (System.IO.Directory.Exists(m_szRunPath + "\\log") == false)
{
System.IO.Directory.CreateDirectory(m_szRunPath + "\\log");
}
string strDate = System.DateTime.Now.ToString("yyyyMMdd");
string strPathFile = m_szRunPath + "\\log\\" + strDate;
if (!Directory.Exists(strPathFile))//如果不存在就创建file文件夹
{
Directory.CreateDirectory(strPathFile);
}
System.IO.TextWriter tw = new System.IO.StreamWriter(strPathFile + "\\视频_" + strDate + ".log", true);
tw.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
tw.WriteLine(strMsg);
tw.WriteLine("\r\n");
tw.Close();
}
catch { }
}
}
}