using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace UHFReader288MPDemo { internal delegate void SearchCallBack(IntPtr dev, IntPtr data); public class DevControl { private const string DLL_NAME = "dmdll.dll"; public enum tagErrorCode { DM_ERR_OK, /* no error */ DM_ERR_PARA, /* parameter error */ DM_ERR_NOAUTH, /* */ DM_ERR_AUTHFAIL, /* auth fail */ DM_ERR_SOCKET, /* socket error */ DM_ERR_MEM, /* */ DM_ERR_TIMEOUT, DM_ERR_ARG, DM_ERR_MATCH, /* parameters in command and reply are not match */ DM_ERR_OPR, DM_ERR_MAX }; internal enum DataType { PARA_TYPE_STRING, PARA_TYPE_UCHAR, PARA_TYPE_USHORT, PARA_TYPE_ULONG, PARA_TYPE_UCHAR_HEX, PARA_TYPE_INVALID }; /// /// 初始化系统 /// /// 搜索到设备后的回调函数 /// 初始化是否成功 [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_Init(SearchCallBack searchCB, IntPtr data); /// /// 回收系统 /// /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_DeInit(); /// /// 搜索网络中的设备,搜索到的设备将通过搜索回调函数SearchCallBack返回 /// /// 搜索的IP,如果搜索所有,请使用255.255.255.255 /// 超时时间 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_SearchDevice(uint deviceIP, int timeout); /// /// 返回设备的基本信息,主要在搜索回调中使用 /// /// 内部handle /// IP地址 /// 物理地址 /// 设备名称 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_GetDeviceInfo(IntPtr devhandle, ref uint ipaddr, StringBuilder macaddr, StringBuilder devname); /// /// 登录设备 /// /// 设备内部handle /// 用户名 /// 密码 /// 超时时间 /// 登录结果 [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_AuthLogin(IntPtr devHandle, StringBuilder name, StringBuilder password, int timeout); /// /// 修改设备密码 /// /// 设备内部handle /// 用户当前使用的密码 /// 用户新的密码 /// 超时时间 /// 登录结果 [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_ModifyPassword(IntPtr devHandle, StringBuilder oldPassword, StringBuilder newPassword, int timeout); /// /// 创建一个获取、配置参数的列表 /// /// 内部handle /// 如果创建失败,返回空 [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern IntPtr paralistCreate(IntPtr devHandle); /// /// 销毁一个参数列表 /// /// create函数返回的指针 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode paralistDestroy(IntPtr list); /// /// 向参数列表中添加一个参数 /// /// 列表指针 /// 通道号 /// 参数类型 /// 配置的数据长度 /// 配置的数据 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode paralist_addnode(IntPtr list, int chanNo, PARA_TYPES paraType, int valueLen, byte[] value); /// /// 向参数列表中添加一个参数 /// /// 列表指针 /// 通道号 /// 参数类型 /// internal static tagErrorCode paralist_addnode(IntPtr list, int chanNo, PARA_TYPES paraType) { return paralist_addnode(list, chanNo, paraType, 0, null); } /// /// 在参数列表中销毁一个参数 /// /// 列表指针 /// 通道号 /// 参数类型 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode paralist_delnode(IntPtr list, int chanNo, PARA_TYPES paraType); /// /// 向获取参数列表中查询获取结果 /// /// 列表 /// 通道号 /// 参数类型 /// 数据类型 /// 数据长度 /// 数据值 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode paralist_getnode(IntPtr list, int chanNo, PARA_TYPES paraType, ref int valueLen, byte[] value); /// /// 向获取参数列表中查询获取结果,结果全部为字符串; /// /// 参数类型 /// 数据缓冲区 /// 数据长度 /// 字符串数据缓冲区 /// /// 字符串数据长度 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_Value2String(PARA_TYPES eParaType, byte[] bufferValue, int nValueLen, StringBuilder bufferString, ref int nStringLen); /// /// 向获取参数列表中查询获取结果,结果全部为字符串; /// /// 参数类型 /// 数据缓冲区 /// 数据长度 /// 字符串数据缓冲区 /// /// 字符串数据长度 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_String2Value(PARA_TYPES eParaType, StringBuilder bufferString, int nStringLen, byte[] bufferValue, ref int nValueLen); /// /// 验证参数是否有效 /// /// 设备handle /// 通道号 /// 参数类型 /// 参数长度 /// 参数值 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_CheckPara(IntPtr devHandle, int chanNo, PARA_TYPES paraType, int valuelen, byte[] value); /// /// 向设备获取list中的参数 /// /// 设备handle /// list /// 超时时间 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_GetPara(IntPtr devHandle, IntPtr list, int timeout); /// /// 向设备配置list中的参数 /// /// 设备handle /// list /// 超时时间 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_SetPara(IntPtr devHandle, IntPtr list, int timeout); /// /// 重启设备并保存当前设置参数; /// /// 设备handle /// 超时时间 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_ResetDevice(IntPtr devHandle, int timeout); /// /// 重启设备,不保存当前设置参数; /// /// 设备handle /// 超时时间 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_ResetDeviceWithoutSave(IntPtr devHandle, int timeout); /// /// 恢复设备默认参数,但不保存也不重启设备; /// /// 设备handle /// 超时时间 /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_LoadDefault(IntPtr devHandle, int timeout); /// /// 登出设备 /// /// 设备handle /// /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_LogOutDevice(IntPtr devHandle, int timeout); /// /// 释放搜索到设备 /// /// 设备handle /// [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern tagErrorCode DM_FreeDevice(IntPtr devHandle); /// /// 检查设备是否支持指定COM; /// /// 设备handle /// COM编号 /// BOOLEAN [DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)] internal static extern bool DM_IsComEnable(IntPtr devHandle, int comNum); internal enum PARA_TYPES { BAUDRATE, DATABITS, STOPBITS, PARITY, FLOWCONTROL, FIFO, ENABLEPACKING, IDLEGAPTIME, MATCH2BYTESEQUENCE, SENDFRAMEONLY, SENDTRAILINGBYTES, INPUTWITHACTIVECONNECT, OUTPUTWITHACTIVECONNECT, INPUTWITHPASSIVECONNECT, OUTPUTWITHPASSIVECONNECT, INPUTATTIMEOFDISCONNECT, OUTPUTATTIMEOFDISCONNECT, IPCONFIGURATION, /* */ AUTONEGOTIATE, MACADDRESS, /* ethernet interface mac address */ SPEED, DUPLEX, NETPROTOCOL, ACCEPTINCOMING, ARPCACHETIMEOUT, TCPKEEPACTIVE, CPUPERFORMANCEMODE, HTTPSERVERPORT, MTUSIZE, RETRYCOUNTER, IPADDRESS, /* ethernet interface ip address(static) */ FIRMWARE, UPTIME, SERIALNO, RETRYTIMEOUT, HOSTLIST1_IP, HOSTLIST1_PORT, HOSTLIST2_IP, HOSTLIST2_PORT, HOSTLIST3_IP, HOSTLIST3_PORT, HOSTLIST4_IP, HOSTLIST4_PORT, HOSTLIST5_IP, HOSTLIST5_PORT, HOSTLIST6_IP, HOSTLIST6_PORT, HOSTLIST7_IP, HOSTLIST7_PORT, HOSTLIST8_IP, HOSTLIST8_PORT, HOSTLIST9_IP, HOSTLIST9_PORT, HOSTLIST10_IP, HOSTLIST10_PORT, HOSTLIST11_IP, HOSTLIST11_PORT, HOSTLIST12_IP, HOSTLIST12_PORT, FIRSTMATCHBYTE, LASTMATCHBYTE, DATAGRAMTYPE, DEVICEADDRESSTABLE1_BEGINIP, UDPLOCALPORT, UDPREMOTEPORT, UDPNETSEGMENT, DEVICEADDRESSTABLE2_BEGINIP, DEVICEADDRESSTABLE2_PORT, DEVICEADDRESSTABLE2_ENDIP, DEVICEADDRESSTABLE3_BEGINIP, DEVICEADDRESSTABLE3_PORT, DEVICEADDRESSTABLE3_ENDIP, DEVICEADDRESSTABLE4_BEGINIP, DEVICEADDRESSTABLE4_PORT, DEVICEADDRESSTABLE4_ENDIP, UDPUNICASTLOCALPORT, ACCEPTIONINCOMING, ACTIVECONNECT, STARTCHARACTER, ONDSRDROP, HARDDISCONNECT, CHECKEOT, INACTIVITYTIMEOUT_M, INACTIVITYTIMEOUT_S, LOCALPORT, REMOTEHOST, REMOTEPORT, DNSQUERYPERIOD, DEVICEADDRESSTABLE1_ENDIP, DEVICEADDRESSTABLE1_PORT, CONNECTRESPONSE, TERMINALNAME, USEHOSTLIST, EMAILADDRESS, EMAILUSERNAME, EMAILPASSWORD, EMAILINPUTTRIGGERMESSAGE, EMAILADDRESS1, EMAILADDRESS2, EMAILADDRESS3, POP3DOMAINNAME, SMTPDOMAINNAME, POP3PORT, SMTPPORT, COLDSTART, DCDCHANGED, DSRCHANGED, WARMSTART, AUTHENTICATIONFAILURE, IPADDRESSCHANGED, ENABLESERIALTRIGGERINPUT, SERIALCHANNEL, SERIALDATASIZE, SERIALMATCHDATA1, SERIALMATCHDATA2, EMAILTRIGGERSUBJECT, PRIORITY, INPUTPRIORITY, INPUTMINNOTIFICATIONINTERVAL, MINNOTIFICATIONINTERVAL, RENOTIFICATIONINTERVAL, NEWUSERPSW, BOOTP, DHCP, AUTOIP, DHCPHOSTNAME, SUBNET, DEFAULTGATEWAY, DEVICENAME, /* device name, server name */ TIMEZONE, LOCALTIME_YEAR, LOCALTIME_MONTH, LOCALTIME_DAY, LOCALTIME_HOUR, LOCALTIME_MINUTE, LOCALTIME_SECOND, TIMESERVER, WEBCONSOLE, TELNETCONSOLE, PASSWORDCHANGED, SERIALPORTOPTIONS, PREFERREDDNSSERVER, ALTERNATEDNSSERVER, SERIALMATCHDATA3, INPUT1, INPUT2, IO1, IO2, IO1TYPE, IO2TYPE, IO1STATE, IO2STATE, SERIALPORTPROTOCOL, FIRMWAREID, PPPOEUSERNAME, PPPOEPASSWORD, PPPOEWORKMODE, PPPOEMAXREDIALTIMES, PPPOEREDIALINTERVAL, PPPOEIDLETIME, PPPOESTATUS, PPPOEIP, PPPOEGATEWAY, PPPOEDNS1, PPPOEDNS2, ENABLEBACKUPLINK, END_OF_PARA_TYPES }; internal static tagErrorCode getParaStringValue(IntPtr paraList, int chanNo, PARA_TYPES paraType, ref int valueLen, StringBuilder value) { byte[] bufferValue = new byte[100]; int getLen = bufferValue.Length; tagErrorCode errCode; errCode = paralist_getnode(paraList, chanNo, paraType, ref getLen, bufferValue); if (errCode == DevControl.tagErrorCode.DM_ERR_OK) { errCode = DM_Value2String(paraType, bufferValue, getLen, value, ref valueLen); } return errCode; } } }