⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmp.h

📁 VxWorks操作系统下的SNMP协议以及MIB协议的实现源码,并且实现了HP标准打印类的MIB框架.
💻 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 + -