单位的项目需要测温,同事买了个海康威视的人体测温机芯,型号位:TB-4117-3/S,给了一份pdf的说明书。

按说明书把设备连接设置好,从官网下载vb.net教程了sdk,我的个乖乖,压缩包就有70多M,把他家的所有东西都给了我,有各种Demo,就是没有测温的,晕死,差点想打退堂鼓不玩了。

最后,最后得到如下
c#教程成果:

一、所需的DLL

HCCore.dll
HCCoreDevCfg.dll 这玩意必须在运行目录
HCGeneralCfgMgr.dll 这鬼也必须在运行目录
HCNetSDK.dll
libeay32.dll
ssleay32.dll
以上6个文件必须的,干啥用俺也不知道,反正缺一不可。
二、委托、dll封装、数据结果

       public delegate void LOGINRESULTCALLBACK(int lUserID, int dwResult, IntPtr lpDeviceInfo, IntPtr pUser);public delegate void UpdateTextStatusCallback(string strLogStatus, IntPtr lpDeviceInfo);public delegate void RemoteConfigCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData);#region DllWrapperconst string DllFileName = "HCNetSDK.dll";[DllImport(DllFileName)]public static extern bool NET_DVR_Init();[DllImport(DllFileName)]public static extern int NET_DVR_Login_V40(ref NET_DVR_USER_LOGIN_INFO pLoginInfo, ref NET_DVR_DEVICEINFO_V40 lpDeviceInfo);[DllImportAttribute(DllFileName)]public static extern int NET_DVR_StartRemoteConfig(int lUserID, int dwCommand, IntPtr lpInBuffer, Int32 dwInBufferLen, RemoteConfigCallback cbStateCallback, IntPtr pUserData);[DllImport(DllFileName)]public static extern bool NET_DVR_Logout(int iUserID);[DllImport(DllFileName)]public static extern bool NET_DVR_Cleanup();[DllImport(DllFileName)]public static extern uint NET_DVR_GetLastError();#endregion#region Data[StructLayout(LayoutKind.Sequential)]public struct NET_DVR_THERMOMETRY_UPLOAD{public uint dwSize;public uint dwRelativeTime;     // 相对时标public uint dwAbsTime;            // 绝对时标[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)]public byte[] szRuleName;//规则名称public byte byRuleID;//规则ID号public byte byRuleCalibType;//规则标定类型 0-点,1-框,2-线public ushort wPresetNo; //预置点号[MarshalAs(UnmanagedType.Struct)]public NET_DVR_POINT_THERM_CFG struPointThermCfg;[MarshalAs(UnmanagedType.Struct)]public NET_DVR_LINEPOLYGON_THERM_CFG struLinePolygonThermCfg;public byte byThermometryUnit;//测温单位: 0-摄氏度(℃),1-华氏度(℉),2-开尔文(K)public byte byDataType;//数据状态类型:0-检测中,1-开始,2-结束public byte byRes1;/*bit0-中心点测温:0-不支持,1-支持;bit1-最高点测温:0-不支持,1-支持;bit2-最低点测温:0-不支持,1-支持;*/public byte bySpecialPointThermType;// 是否支持特殊点测温public float fCenterPointTemperature;//中心点温度,精确到小数点后一位(-40-1500),(浮点数+100)*10 (由bySpecialPointThermType判断是否支持中心点)public float fHighestPointTemperature;//最高点温度,精确到小数点后一位(-40-1500),(浮点数+100)*10(由bySpecialPointThermType判断是否支持最高点)public float fLowestPointTemperature;//最低点温度,精确到小数点后一位(-40-1500),(浮点数+100)*10(由bySpecialPointThermType判断是否支持最低点)[MarshalAs(UnmanagedType.Struct)]public NET_VCA_POINT struHighestPoint;//线、框测温最高温度位置坐标(当规则标定类型为线、框的时候生效)[MarshalAs(UnmanagedType.Struct)]public NET_VCA_POINT struLowestPoint;//线、框测温最低温度位置坐标(当规则标定类型为线、框的时候生效)public byte byIsFreezedata;//是否数据冻结 0-否 1-是[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)]public byte[] byRes2;public uint dwChan; //通道号,查询条件中通道号为0xffffffff时该字段生效[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 88, ArraySubType = UnmanagedType.I1)]public byte[] byRes;}[StructLayout(LayoutKind.Sequential)]public struct NET_DVR_POINT_THERM_CFG{public float fTemperature;public NET_VCA_POINT struPoint;[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 120, ArraySubType = UnmanagedType.I1)]public byte[] byRes;}[StructLayout(LayoutKind.Sequential)]public struct NET_DVR_LINEPOLYGON_THERM_CFG{public float fMaxTemperature;public float fMinTemperature;public float fAverageTemperature;public float fTemperatureDiff;public NET_VCA_POLYGON struRegion;[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)]public byte[] byRes;}public const int VCA_MAX_POLYGON_POINT_NUM = 10;//检测区域最多支持10个点的多边形[StructLayoutAttribute(LayoutKind.Sequential)]public struct NET_VCA_POLYGON{/// DWORD->unsigned intpublic uint dwPointNum;[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = VCA_MAX_POLYGON_POINT_NUM, ArraySubType = UnmanagedType.Struct)]public NET_VCA_POINT[] struPos;}[StructLayoutAttribute(LayoutKind.Sequential)]public struct NET_VCA_POINT{public float fX;// X轴坐标, 0.001~1public float fY;//Y轴坐标, 0.001~1}[StructLayout(LayoutKind.Sequential)]public struct NET_DVR_REALTIME_THERMOMETRY_COND{public uint dwSize;public uint dwChan;//通道号,从1开始,0xffffffff代表获取全部通道public byte byRuleID; //规则ID 0-代表获取全部规则,具体规则ID从1开始 /*1-定时模式:设备每隔一秒上传各个规则测温数据的最高温、最低温和平均温度值、温差2-温差模式:若上一秒与下一秒的最高温或者最低温或者平均温或者温差值的温差大于等于2摄氏度,则上传最高温、最低温和平均温度值。若大于等于一个小时温差值均小于2摄氏度,则上传最高温、最低温、平均温和温差值*/public byte byMode; //长连接模式, 0-保留(为兼容老设备),1-定时模式,2-温差模式public ushort wInterval; //上传间隔,仅温差模式支持,1~3600S,填0则默认3600S上传一次[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 60, ArraySubType = UnmanagedType.I1)]public byte[] byRes; //保留}public const int NET_DVR_DEV_ADDRESS_MAX_LEN = 129;public const int NET_DVR_LOGIN_USERNAME_MAX_LEN = 64;public const int NET_DVR_LOGIN_PASSWD_MAX_LEN = 64;[StructLayout(LayoutKind.Sequential)]public struct NET_DVR_USER_LOGIN_INFO{[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_DEV_ADDRESS_MAX_LEN, ArraySubType = UnmanagedType.I1)]public byte[] sDeviceAddress;public byte byUseTransport;public ushort wPort;[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_LOGIN_USERNAME_MAX_LEN, ArraySubType = UnmanagedType.I1)]public byte[] sUserName;[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NET_DVR_LOGIN_PASSWD_MAX_LEN, ArraySubType = UnmanagedType.I1)]public byte[] sPassword;public LOGINRESULTCALLBACK cbLoginResult;public IntPtr pUser;public bool bUseAsynLogin;public byte byProxyType; //0:不使用代理,1:使用标准代理,2:使用EHome代理public byte byUseUTCTime;    //0-不进行转换,默认,1-接口上输入输出全部使用UTC时间,SDK完成UTC时间与设备时区的转换,2-接口上输入输出全部使用平台本地时间,SDK完成平台本地时间与设备时区的转换public byte byLoginMode; //0-Private, 1-ISAPI, 2-自适应public byte byHttps;    //0-不适用tls,1-使用tls 2-自适应public int iProxyID;    //代理服务器序号,添加代理服务器信息时,相对应的服务器数组下表值public byte byVerifyMode;  //认证方式,0-不认证,1-双向认证,2-单向认证;认证仅在使用TLS的时候生效;    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 119, ArraySubType = UnmanagedType.I1)]public byte[] byRes3;}[StructLayout(LayoutKind.Sequential)]public struct NET_DVR_DEVICEINFO_V40{public NET_DVR_DEVICEINFO_V30 struDeviceV30;public byte bySupportLock;        //设备支持锁定功能,该字段由SDK根据设备返回值来赋值的。bySupportLock为1时,dwSurplusLockTime和byRetryLoginTime有效public byte byRetryLoginTime;     //剩余可尝试登陆的次数,用户名,密码错误时,此参数有效public byte byPasswordLevel;      //admin密码安全等级0-无效,1-默认密码,2-有效密码,3-风险较高的密码。当用户的密码为出厂默认密码(12345)或者风险较高的密码时,上层客户端需要提示用户更改密码。      public byte byProxyType;//代理类型,0-不使用代理, 1-使用socks5代理, 2-使用EHome代理public uint dwSurplusLockTime; //剩余时间,单位秒,用户锁定时,此参数有效public byte byCharEncodeType;     //字符编码类型public byte bySupportDev5;//支持v50版本的设备参数获取,设备名称和设备类型名称长度扩展为64字节public byte bySupport;  //能力集扩展,位与结果:0- 不支持,1- 支持// bySupport & 0x1:  保留// bySupport & 0x2:  0-不支持变化上报 1-支持变化上报public byte byLoginMode; //登录模式 0-Private登录 1-ISAPI登录public int dwOEMCode;public int iResidualValidity;   //该用户密码剩余有效天数,单位:天,返回负值,表示密码已经超期使用,例如“-3表示密码已经超期使用3天”public byte byResidualValidity; // iResidualValidity字段是否有效,0-无效,1-有效[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 243, ArraySubType = UnmanagedType.I1)]public byte[] byRes2;}public const int SERIALNO_LEN = 48;//序列号长度//NET_DVR_Login_V30()参数结构[StructLayoutAttribute(LayoutKind.Sequential)]public struct NET_DVR_DEVICEINFO_V30{[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)]public byte[] sSerialNumber;  //序列号public byte byAlarmInPortNum;               //报警输入个数public byte byAlarmOutPortNum;              //报警输出个数public byte byDiskNum;                  //硬盘个数public byte byDVRType;                    //设备类型, 1:DVR 2:ATM DVR 3:DVS ......public byte byChanNum;                  //模拟通道个数public byte byStartChan;                    //起始通道号,例如DVS-1,DVR - 1public byte byAudioChanNum;                //语音通道数public byte byIPChanNum;                   //最大数字通道个数,低位  public byte byZeroChanNum;            //零通道编码个数 //2010-01-16public byte byMainProto;          //主码流传输协议类型 0-private, 1-rtsp,2-同时支持private和rtsppublic byte bySubProto;             //子码流传输协议类型0-private, 1-rtsp,2-同时支持private和rtsppublic byte bySupport;        //能力,位与结果为0表示不支持,1表示支持,//bySupport & 0x1, 表示是否支持智能搜索//bySupport & 0x2, 表示是否支持备份//bySupport & 0x4, 表示是否支持压缩参数能力获取//bySupport & 0x8, 表示是否支持多网卡//bySupport & 0x10, 表示支持远程SADP//bySupport & 0x20, 表示支持Raid卡功能//bySupport & 0x40, 表示支持IPSAN 目录查找//bySupport & 0x80, 表示支持rtp over rtsppublic byte bySupport1;        // 能力集扩充,位与结果为0表示不支持,1表示支持//bySupport1 & 0x1, 表示是否支持snmp v30//bySupport1 & 0x2, 支持区分回放和下载//bySupport1 & 0x4, 是否支持布防优先级   //bySupport1 & 0x8, 智能设备是否支持布防时间段扩展//bySupport1 & 0x10, 表示是否支持多磁盘数(超过33个)//bySupport1 & 0x20, 表示是否支持rtsp over http    //bySupport1 & 0x80, 表示是否支持车牌新报警信息2012-9-28, 且还表示是否支持NET_DVR_IPPARACFG_V40结构体public byte bySupport2; /*能力,位与结果为0表示不支持,非0表示支持                          bySupport2 & 0x1, 表示解码器是否支持通过URL取流解码bySupport2 & 0x2,  表示支持FTPV40bySupport2 & 0x4,  表示支持ANRbySupport2 & 0x8,  表示支持CCD的通道参数配置bySupport2 & 0x10,  表示支持布防报警回传信息(仅支持抓拍机报警 新老报警结构)bySupport2 & 0x20,  表示是否支持单独获取设备状态子项bySupport2 & 0x40,  表示是否是码流加密设备*/public ushort wDevType;              //设备型号public byte bySupport3; //能力集扩展,位与结果为0表示不支持,1表示支持//bySupport3 & 0x1, 表示是否多码流// bySupport3 & 0x4 表示支持按组配置, 具体包含 通道图像参数、报警输入参数、IP报警输入、输出接入参数、// 用户参数、设备工作状态、JPEG抓图、定时和时间抓图、硬盘盘组管理 //bySupport3 & 0x8为1 表示支持使用TCP预览、UDP预览、多播预览中的"延时预览"字段来请求延时预览(后续都将使用这种方式请求延时预览)。而当bySupport3 & 0x8为0时,将使用 "私有延时预览"协议。//bySupport3 & 0x10 表示支持"获取报警主机主要状态(V40)"。//bySupport3 & 0x20 表示是否支持通过DDNS域名解析取流public byte byMultiStreamProto;//是否支持多码流,按位表示,0-不支持,1-支持,bit1-码流3,bit2-码流4,bit7-主码流,bit-8子码流public byte byStartDChan;       //起始数字通道号,0表示无效public byte byStartDTalkChan;    //起始数字对讲通道号,区别于模拟对讲通道号,0表示无效public byte byHighDChanNum;       //数字通道个数,高位public byte bySupport4;public byte byLanguageType;// 支持语种能力,按位表示,每一位0-不支持,1-支持  //  byLanguageType 等于0 表示 老设备//  byLanguageType & 0x1表示支持中文//  byLanguageType & 0x2表示支持英文[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 9, ArraySubType = UnmanagedType.I1)]public byte[] byRes2;        //保留}#endregion三、测温const string IPAddress = "192.168.1.64";const string UserName = "admin";const string Password = "13245678";const ushort PortNo = 8000;static void Main(string[] args){//初始化if (!NET_DVR_Init()){Console.WriteLine("NET_DVR_Init error!");return;}//登陆var struLogInfo = new NET_DVR_USER_LOGIN_INFO();//设备IP地址或者域名byte[] byIP = System.Text.Encoding.Default.GetBytes(IPAddress);struLogInfo.sDeviceAddress = new byte[129];byIP.CopyTo(struLogInfo.sDeviceAddress, 0);//设备用户名byte[] byUserName = System.Text.Encoding.Default.GetBytes(UserName);struLogInfo.sUserName = new byte[64];byUserName.CopyTo(struLogInfo.sUserName, 0);//设备密码byte[] byPassword = System.Text.Encoding.Default.GetBytes(Password);struLogInfo.sPassword = new byte[64];byPassword.CopyTo(struLogInfo.sPassword, 0);struLogInfo.wPort = PortNo;//设备服务端口号struLogInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 var DeviceInfo = new NET_DVR_DEVICEINFO_V40();//登录设备 Login the devicevar m_lUserID = NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);if (m_lUserID < 0){Console.WriteLine("登陆失败,错误代码:" + NET_DVR_GetLastError()); //登录失败,输出错误号return;}//配置测温var size = Marshal.SizeOf(typeof(NET_DVR_REALTIME_THERMOMETRY_COND));NET_DVR_REALTIME_THERMOMETRY_COND struThermCond = new NET_DVR_REALTIME_THERMOMETRY_COND();struThermCond.dwSize = (uint)size;struThermCond.byRuleID = 0;       //规则ID,0代表获取全部规则,具体规则ID从1开始struThermCond.dwChan = 1;// dwChannel; //从1开始,0xffffffff代表获取全部通道IntPtr pCond = Marshal.AllocCoTaskMem(size);Marshal.StructureToPtr(struThermCond, pCond, false);var ret = NET_DVR_StartRemoteConfig(m_lUserID, 3629, pCond, size, Callback, IntPtr.Zero);if (ret < 0){Console.WriteLine("配置测温失败, 错误代码:" + NET_DVR_GetLastError()); //登录失败,输出错误号return;}Console.WriteLine("开始测温...");Console.ReadKey();//退出登录NET_DVR_Logout(m_lUserID);NET_DVR_Cleanup();}/// <summary>/// 只显示最高温度/// </summary>/// <param name="dwType"></param>/// <param name="lpBuffer"></param>/// <param name="dwBufLen"></param>/// <param name="pUserData"></param>static void Callback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData){var ret = Marshal.PtrToStructure<NET_DVR_THERMOMETRY_UPLOAD>(lpBuffer);Console.WriteLine(ret.struLinePolygonThermCfg.fMaxTemperature);}

哎,就这么点事,弄得很复杂。

[C#] 折腾海康威视的人体测温 模组相关推荐

  1. CORE-ESP32C3|eink|墨水屏日历+时间日期+温度显示|I2C软件模拟| LuatOS-SOC接口|官方demo|学习(14):墨水屏动态日历+oled日期显示+ AHT10测温模组

    目录 参考博文 源于网友oled+eink+aht10项目 源代码修改及复现说明 主要修改 显示效果 ​编辑硬件准备 软件版本 日志及soc下载工具 软件使用 接线说明 天气显示屏 硬件接线 温度采集 ...

  2. 基于红外传感器人体测温系统设计(STC89C51单片机)

    目 录 摘 要 I ABSTRACT II 目 录 III 1绪论 1 1.1选题背景及依据 1 1.2国内外研究现状 1 1.3研究内容 3 2 红外传感器人体测温系统原理及方案设计 4 2.1温度 ...

  3. 红外测温仪人体测温解决方案

    红外人体测温仪是一种利用红外线照射的测温仪器,在此之前,红外测温都是作为工厂生产的用的,用来检测产品的温度,和监测设备的运行发热状态.逐渐的人们突发奇想,转变用于人体测温,来规避人员之间身体直接接触( ...

  4. 智能无感人体测温系统解决方案

    中国已全面进入"全民战疫"的非常状态.随着春运返程高峰的到来,全国各大城市的防疫形势更加严峻,防控进入关键时期.6108方案凭借自身在AIoT领域的技术优势,推出了一套智能无感人体 ...

  5. 基于红外热成像人体测温系统解决方案的组成

    概述 当前,各行各业已基本实现复工复产,但新冠肺炎疫情防控仍处在关键阶段.疫情期间,车站.机场.写字楼等公共场所人流聚集,该如何监控异常体温,成为一大难题.如何更高效地监测人员体温信息,且避免人员发生 ...

  6. 人体测温 melexis迈来芯 linux 平台mlx90614/mlx90621/mlx90641驱动调试

    2020年的春节因为疫情的原因一直出不了门,听说melexis测温头价格从40块涨到400块,并且还买不到货:正好有同事要求调到驱动:mlx测温模块驱动,基于android平台: 3. app: 这个 ...

  7. 海康威视热成像实时测温java

    使用JNA,二个主要类,根据使用手册C翻译形成 package anruesi;import com.sun.jna.NativeLong;/*** @author sunsj* @date 2020 ...

  8. STM32 + CT1711超级准的人体测温方案

    一.前言 做一个手腕式检测设备玩玩,其中设计到人体温度检测,就测试手腕温度皮肤表面温度,采用ct1711温度传感器,该传感器是可以直接与人体接触的,其参数如下: CT1711 的典型静态电流仅为10n ...

  9. 重置海康威视DS-2TD2617B-6/PA测温摄像头

    如果忘记密码,需要重置,这个摄像头有一个重置按钮,在外面是看不到的. 重置按钮的位置 位置在这个摄像头的下方,有一个小盖子盖着,用螺丝刀旋下这个盖子的两个螺丝,就可以看到. 如何重置: To rese ...

最新文章

  1. python计算特征与目标的相关性并可视化
  2. JBPM回退功能的实现
  3. Qt修炼手册4_信号与槽
  4. 和49支战队瓜分600万奖金,这场史上奖金最多的AI大赛到底比什么?
  5. 在Android设备部署PyTorch模型
  6. 如何在 ASP.Net Core 中使用 LoggerMessage
  7. python读取xls文件详解_python3解析excel文件
  8. python环境变量的配置 alias_配置别名
  9. ADOQuery的locktype属性
  10. docker on marathonmesos示例
  11. latex 箭头_Pandoc上手以及如何使得latex文件转换为Docx文件(MAC)
  12. 教你win7显卡驱动如何安装,win7电脑显卡驱动的安装方法
  13. jmeter安装插件的方法
  14. Window10下让自己开发的自启动程序支持拉起一个图形化软件
  15. 在python中、下列代码的输出是什么-智慧树知到《Python程序设计基础》章节测试答案...
  16. lenovo 笔记本ideapad 320c-15改装win7问题
  17. 步进电机和伺服电机的区别
  18. 详解数据模型:概念模型、逻辑模型、物理模型
  19. linux tomcat 验证码无法显示
  20. u盘资料误删怎么恢复 怎样找回u盘里误删的文件

热门文章

  1. linux启动注册内存失财,Linux创建者开喷英特尔:扼杀ECC内存市场
  2. java击鼓传花游戏list_经典游戏之击鼓传花玩法
  3. Centos配置DNS服务
  4. 计算机组成原理期末复习整理(《计算机组成原理与系统结构》包健 著)
  5. QUI框架V3.3版本正式发布!
  6. 什么品牌的游戏蓝牙耳机比较好?玩游戏延迟低的蓝牙耳机推荐
  7. 求职中自我评价该怎么写?
  8. cURL 学习笔记——结合yeelink平台
  9. 【Verilog】不同位宽操作数的按位操作
  10. 对jdk5.0中可变长参数的理解