📄 snmp.h
字号:
#ifndef _H_SNMP
#define _H_SNMP
#define DHCP_NOCHANGE
//ASN.1定义的数据格式
#define TAG_INTERGER 0x2 //-2,147,483,648 ~ 2,147,483,647之间整数
//TruthValue|true(1)false(2)|
//TestAndIncr(0~2147483647)
//RowStatus|active(1)notInService(2)notReady(3)createAndGo(4)createAndWait(5)destroy(6)|
//TimeInterval(0~2147483647)
//StorageType|other(1)volatile(2)nonVolatile(3)permanent(4)readOnly(5)
#define TAG_OCTET 0x4 //任意长度字符串,推荐不超过255字节
//DisplayString(size(0~255))
//IPAddress(size(4))
//PhysAddress
//MacAddress(size(6))
//DateAndTime(size(8|11))
//TAddress(size(1~255))
#define TAG_NULL 0x5 //占位符
#define TAG_OBJIDT 0x6 //U32 oid[128],最大128×4字节数
//TDomain
//RowPoint
//VariablePointer
//InstancePointer
//AutonomousType
#define TAG_SEQUENCE 0x30
#define TAG_IP 0x40
#define TAG_COUNTER 0x41
#define TAG_GAUGE32 0x42 //0 ~ 4,294,967,295 非负整数,最大值后锁定
#define TAG_TIMETICK 0x43 //0 ~ 4,294,967,295 非负整数,最大归零,0.01sec
//TimeStamp
#define TAG_OPAQUE 0x44
#define TAG_GETPDU 0xa0
#define TAG_GETNEXT 0xa1
#define TAG_GETRESPONSE 0xa2
#define TAG_SETPDU 0xa3
#define TAG_TRAPPDU 0xa4
//PDU指定的错误信息,属于SNMPV1
#define PDU_NOERROR 0
#define PDU_TOOBIG 1
#define PDU_NOSUCHNAME 2
#define PDU_BADVALUE 3
#define PDU_READONLY 4
#define PDU_GENERR 5
//打印机组MIB中hrDeviceStatus的指定信息
#define PRN1_UNKNOWN 1
#define PRN1_RUNNING 2
#define PRN1_WARNING 3
#define PRN1_TESTING 4
#define PRN1_DOWN 5
//打印机组MIB中hrPrinterStatus的指定信息
#define PRN2_OTHER 1
#define PRN2_UNKNOWN 2
#define PRN2_IDLE 3
#define PRN2_PRINTING 4
#define PRN2_WARMUP 5
//SNMP版本号
#define SNMPV1 0
#define SNMPV2 1
#define SNMPV3 2
//TRAP消息定义
#define MSG_NMS_TRAP 1
#define MSG_SYS_UP 2
//设备状态,OID为{1.3.6.1.2.1.25.3.2.1.5}时查询
#define STAT_UNKNOWN 1
#define STAT_RUNNING 2
#define STAT_WARNING 3
#define STAT_TESTING 4
#define STAT_DOWN 5
//打印机状态,OID为{1.3.6.1.2.1.25.3.5.1.1}时查询
#define PRN_OTHER 1
#define PRN_UNKNOWN 2
#define PRN_IDLE 3
#define PRN_PRINTING 4
#define PRN_WARMUP 5
//HR组中ERR_STATUS的定义,需要引擎将当前状况按下面的代码合成一个字节
#define ERR_READY (u_char)0
#define ERR_SERVICECALL (u_char)1
#define ERR_OFFLINE (u_char)(1<<1)
#define ERR_JAMMED (u_char)(1<<2)
#define ERR_COVEROPEN (u_char)(1<<3)
#define ERR_NOTONER (u_char)(1<<4)
#define ERR_LOWTONER (u_char)(1<<5)
#define ERR_NOPAPER (u_char)(1<<6)
#define ERR_LOWPAPER (u_char)(1<<6)
//打印机COVER状态
#define DOOR_OTHER 1
#define DOOR_OPEN 3
#define DOOR_CLOSE 4
#define DOOR_INTEROPEN 5
#define DOOR_INTERCLOSE 6
//打印机输入纸盒定义
#define IN_OTHER 1
#define IN_UNKNOWN 2
#define IN_SHEETFEEDAUTOREMOVABLETRAY 3
#define IN_SHEETFEEDAUTONONREMOVABLETRAY 4
#define IN_SHEETFEEDMANUAL 5
#define IN_CONTINUOUSROLL 6
#define IN_CONTINUOUSFANFOLD 7
//杂七杂八的定义
#define MAX_STRLEN 256
#define MAX_OIDLEN (128*sizeof(long))
#define SNMP_UDP 161
#define SNMP_TRAP 162
#define SERVER_MAX_CONNECTIONS 4 //服务器允许的最大连接数
#define snmPoolSize (102400*1)
typedef unsigned long Counter;
typedef unsigned long Gauge;
typedef unsigned long TimeTicks;
typedef long INTEGER;
typedef char* PhysAddress;
typedef char* DispStr;
typedef char* OID;
typedef char* IpAddress;
typedef struct _snmp_start_mib
{
//实达打印服务器专用MIB库
DispStr startPassword; //RW
INTEGER startPasswdLen; //密码长度
DispStr startSeries;
INTEGER startSWVersion;
INTEGER startLPTNumber; //有效并口数目
INTEGER startLPTIndex; //
INTEGER startLPTStatus; //index并口状态
INTEGER startUSBNumber; //有效USB数目
INTEGER startUSBIndex; //
INTEGER startUSBStatus; //index USB状态
INTEGER startCOMNumber; //有效COM数目
INTEGER startCOMIndex; //
INTEGER startCOM1Status; //index COM状态
//作业管理专用MIB
DispStr startLastJobInfo;
DispStr startLPTJobInfo; //上面的index指定LPT
DispStr startUSBJobInfo;
//实达打印机专用MIB库
INTEGER startTonerLevel;
INTEGER startInputNumber; //有几个输入纸盒
INTEGER startInputIndex; //指示当前读取第几纸盒
INTEGER startInputStatus; //index纸盒状态,bit1代表是否安装,bit2代表是否有纸,bit3代表是否可设置纸张大小
INTEGER startInputPaper; //纸盒1纸张规格,若状态显示可以更改纸张大小,则RW
INTEGER startLEDNumber; //LED灯的数目
INTEGER startLEDIndex; //指定某灯
INTEGER startLEDStatus; //每个LED灯亮灭状态
INTEGER startLCDStatus; //是否有LCD面板
DispStr startLCDMsg; //LCD字符串信息
INTEGER startPrtStatus; //打印机状态码
INTEGER startPrtOffline; //设定打印机脱机联机
INTEGER startPrtReboot; //设定打印机重启
//端口管理专用MIB
INTEGER startLPTMode;
INTEGER startLPTManage;
INTEGER startLPTTimeout;
DispStr startLPTMemo;
}STARTMIBLIB;
typedef struct _snmp_snmp_mib
{
//以下部分都无需系统支持
//SNMP MIB(无需系统提供)
Counter SnmpInPkts;
Counter snmpOutPkts;
Counter snmpInBadVersions;
Counter snmpInBadCommunityNames;
Counter snmpInBadCommunityUses;
Counter snmpInASNParseErrs;
Counter snmpInTooBigs;
Counter snmpInNoSuchNames;
Counter snmpInBadValues;
Counter snmpInReadOnlys;
Counter snmpInGenErrs;
Counter snmpInTotalReqVars;
Counter snmpInTotalSetVars;
Counter snmpInGetRequests;
Counter snmpInGetNexts;
Counter snmpInSetRequests;
Counter snmpInGetResponses;
Counter snmpInTraps;
Counter snmpOutTooBigs;
Counter snmpOutNoSuchNames;
Counter snmpOutBadValues;
Counter snmpOutGenErrs;
Counter snmpOutGenRequests;
Counter snmpOutGetNexts;
Counter snmpOutSetRequests;
Counter snmpOutGetResponses;
Counter snmpOutTraps;
INTEGER SnmpEnableAuthenTraps; //RW
}SNMPMIBLIB;
typedef struct _snmp_prt_snmp
{
//Printer MIB中需要的全局变量
long prtGeneralConfigChanges; //引擎变化次数
long prtGeneralCurrentLocalization;//本地化代码
long prtGeneralReset; //当前RESET的状态
long prtCoverIndex; //
long prtCoverStatus;
long prtLocalizationIndex;
long prtLocalizationCharacterSet;
long prtInputDefaultIndex; //
long prtInputIndex;
long prtInputType;
long prtInputDimUnit;
long prtInputMediaDimFeedDirDeclared; //纸张长
long prtInputMediaDimXFeedDirDeclared; //纸张宽
long prtInputMediaDimFeedDirChosen;
long prtInputMediaDimXFeedDirChosen;
long prtInputCapacityUnit;
long prtInputMaxCapacity;
long prtInputCurrentLevel;
long prtInputStatus;
long prtInputSecurity;
long InputMediaWeight;
long InputMediaFormParts;
long prtOutputDefaultIndex;
long prtOutputIndex;
long prtOutputType;
long prtOutputCapacityUnit;
long prtOutputMaxCapacity;
long prtOutputRemainingCapacity;
long prtOutputStatus;
long prtOutputSecurity;
long prtOutputDimUnit;
long prtOutputMaxDimFeedDir;
long prtOutputMaxDimXFeedDir;
long prtOutputMinDimFeedDir;
long prtOutputMinDimXFeedDir;
long prtOutputStackingOrder;
long prtOutputPageDeliveryOrientation;
long prtOutputBursting;
long prtOutputDecollating;
long prtOutputPageCollated;
long prtOutputOffsetStacking;
}PRTMIBLIB;
typedef struct _snmp_hr_snmp
{
/*
打印机状态 -->hrDeviceStatus -->hrPrinterStatus -->hrPrinterDetectedErrorState
Normal running(2) idle(3) none set
Busy/ running(2) printing(4)
Temporarily
Unavailable
Non Critical warning(3) idle(3) or could be: lowPaper,
Alert Active printing(4) lowToner, or serviceRequested
Critical down(5) other(1) could be: jammed,noPaper,
Alert Active noToner,coverOpen, or serviceRequested
Unavailable down(5) other(1)
Moving off- warning(3) idle(3) or offline
line printing(4)
Off-line down(5) other(1) offline
Moving down(5) warmup(5)
on-line
Standby running(2) other(1)
*/
//HR MIB组中需要的全局变量
long errStatus; //需要引擎赋值
long DeviceStatus; //需要引擎赋值
long PrinterStatus; //需要引擎赋值
long hrDeviceErrors;
long hrDeviceIndex;
}HRMIBLIB;
typedef unsigned char u_char;
typedef unsigned long u_long;
typedef unsigned char oid;
typedef u_char *(FindVar)(char magic,int *buflen);
typedef int WriteVar(char magic,char *buf,int buflen);
typedef struct _var_bind_list
{
struct _var_bind_list *next;
int oid_len;
u_char oid[MAX_OIDLEN]; //防止出现负数
int value_len;
char type;
void *value;
}VARLIST;
typedef struct _nametree {
u_char oid[MAX_OIDLEN];
struct _nametree* parent; //父级
struct _nametree* children; //子级
struct _nametree* sibling; //同级
char* name;
unsigned char type;
}nametree;
typedef struct _snmp_pdu {
long version; //SNMPV1 == 0
int command; //0xA(n)
long reqid; //Request id
long errstat; //Error status
long errindex; //Error index
u_char *community; //Community Name
int community_len;
//>>>>>>>>>>>>> Trap PDU <<<<<<<<<<<<<<<<<
oid *enterprise; //System OID
int enterprise_length;
long trap_type; //trap type
long specific_type; //厂商指定 trap type
u_long time; //初始化到发送TRAP之间的时间
u_char agent_addr[4]; //其实是NMS的IP地址
// struct sockaddr_in clientAddr; //回送TRAP到这个地方
int sFd; //回送TRAP的本机端口
//>>>>>>>>>>>>> VARBINDLIST <<<<<<<<<<<<<<
VARLIST *variables;
}SNMP_PDU;
//给TRAP任务发送snmp包
typedef struct _trap_msg
{
u_char msg;
SNMP_PDU *snmp;
}TRAPMSG;
typedef struct _log
{
struct _log * next;
struct _log * prev;
unsigned int size; //xxxBytes
unsigned int flag;
unsigned int pagecnt;
unsigned long time;
char list[18]; //192.168.3.4 etc
char paper[10]; //A4,A3 etc.
char emu[10]; //PCL,LQ,PS,XL,Unkown
char dest[5]; //LPT1,LPT2,USB1,USB2
char remoteName[16]; //Netbios Name
char type[5]; //RAW,FTP,LPD,HTTP,IPP,NB
}logParam;
#define MAXLOG 100
extern PRTMIBLIB *prtMibLib;
extern STARTMIBLIB *startMibLib;
extern SNMPMIBLIB *snmpMibLib;
extern HRMIBLIB *hrMibLib;
int TrapTask(void);
int snmpTrap(void);
//启动SNMP的代理进程
int snmpAgent(void);
//开始接收检验输入数据包
int Exam_startdata(int sFd,int count);
//接收到的数据经过SNMP格式校验后,用本函数按要求获取MIB
int ExecSnmp(SNMP_PDU *snmp);
//按照给定的PDU,打包出一个完整的返回数据包
int PrepareRC(SNMP_PDU *snmp,char **buf,int *packetlen);
//调用下面的几种打包程序,PrepareRC才可以生成最终数据
int Encode_bindlist(SNMP_PDU *snmp,char **buf,int *buflen);
int Encode_ErrorIndex(SNMP_PDU *snmp,char **buf,int *buflen);
int Encode_ErrorStatus(SNMP_PDU *snmp,char **buf,int *buflen);
int Encode_RequestID(SNMP_PDU *snmp,char **buf,int *buflen);
int Encode_PDUfield(SNMP_PDU *snmp,char **buf,int *buflen);
int Encode_wrapper(SNMP_PDU *snmp,char **buf,int *buflen);
//初始化给定的PDU
void initSNMP(SNMP_PDU *snmp);
//按照ASN.1格式(TAG + ASNLEN + VALUE)生成数据包
int packet(char type,int asnlen,char *data,char **buf,int *buflen);
//将给定的PDU中的VARBINDLIST中的所有参数赋值
int GetOidValue(SNMP_PDU *snmp,VARLIST *vartemp);
//用给定的PDU中的VARBINDLIST中的参数,更新自身的MIB参数
int SetOidValue(SNMP_PDU *snmp,VARLIST *vartemp);
//释放PDU内存
void freesnmpPDU(SNMP_PDU *snmp);
void *snmpMalloc(int nBytes);
void snmpFree(void *pBlock);
int netStart();
int getLongSize(long len);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -