📄 snmpv1communicationinterface.java
字号:
// got the right one; add it to retrieved var list and break!
retrievedVars.addSNMPObject(newPair);
break;
}
}
}
requestID++;
return retrievedVars;
}
/**
* Retrieve the MIB variable values corresponding to the object identifiers
* given in the array itemID (in dotted-integer notation). Return as SNMPVarBindList object;
* if no such variable (either due to device not supporting it, or community name having incorrect
* access privilege), SNMPGetException thrown
* @throws IOException Thrown when timeout experienced while waiting for response to request.
* @throws SNMPBadValueException
* @throws SNMPGetException Thrown if one of supplied OIDs has value that can't be retrieved
*/
public SNMPVarBindList getMIBEntry(String[] itemID)
throws IOException, SNMPBadValueException, SNMPGetException
{
// send GetRequest to specified host to retrieve values of specified object identifiers
SNMPVarBindList retrievedVars = new SNMPVarBindList();
SNMPSequence varList = new SNMPSequence();
int errorStatus = 0;
int errorIndex = 0;
for (int i = 0; i < itemID.length; i++)
{
SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID[i]);
SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull());
varList.addSNMPObject(nextPair);
}
SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETREQUEST, requestID, errorStatus, errorIndex, varList);
SNMPMessage message = new SNMPMessage(version, community, pdu);
byte[] messageEncoding = message.getBEREncoding();
/*
System.out.println("Request Message bytes:");
for (int i = 0; i < messageEncoding.length; ++i)
System.out.print(hexByte(messageEncoding[i]) + " ");
*/
DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort);
dSocket.send(outPacket);
while (true) // wait until receive reply for requestID & OID (or error)
{
DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize);
dSocket.receive(inPacket);
byte[] encodedMessage = inPacket.getData();
/*
System.out.println("Message bytes:");
for (int i = 0; i < encodedMessage.length; ++i)
{
System.out.print(hexByte(encodedMessage[i]) + " ");
}
*/
SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value);
SNMPPDU receivedPDU = receivedMessage.getPDU();
// check request identifier; if incorrect, just ignore packet and continue waiting
if (receivedPDU.getRequestID() == requestID)
{
// check error status; if retrieval problem, throw SNMPGetException
if (receivedPDU.getErrorStatus() != 0)
{
// determine error index
errorIndex = receivedPDU.getErrorIndex();
throw new SNMPGetException("OID " + itemID[errorIndex - 1] + " not available for retrieval", errorIndex, receivedPDU.getErrorStatus());
}
// copy info from retrieved sequence to var bind list
varList = receivedPDU.getVarBindList();
for (int i = 0; i < varList.size(); i++)
{
SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(i));
SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0));
SNMPObject newValue = newPair.getSNMPObjectAt(1);
if (newObjectIdentifier.toString().equals(itemID[i]))
{
retrievedVars.addSNMPObject(newPair);
}
else
{
// wrong OID; throw GetException
throw new SNMPGetException("OID " + itemID[i] + " expected at index " + i + ", OID " + newObjectIdentifier + " received", i+1, SNMPRequestException.FAILED);
}
}
break;
}
}
requestID++;
return retrievedVars;
}
/**
* Retrieve the MIB variable value corresponding to the object identifier following that
* given in itemID (in dotted-integer notation). Return as SNMPVarBindList object; if no
* such variable (either due to device not supporting it, or community name having incorrect
* access privilege), variable value will be SNMPNull object
* @throws IOException Thrown when timeout experienced while waiting for response to request.
* @throws SNMPBadValueException
* @throws SNMPGetException Thrown if one the OID following the supplied OID has value that can't be retrieved
*/
public SNMPVarBindList getNextMIBEntry(String itemID)
throws IOException, SNMPBadValueException, SNMPGetException
{
// send GetRequest to specified host to retrieve specified object identifier
SNMPVarBindList retrievedVars = new SNMPVarBindList();
int errorStatus = 0;
int errorIndex = 0;
SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID);
SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull());
SNMPSequence varList = new SNMPSequence();
varList.addSNMPObject(nextPair);
SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETNEXTREQUEST, requestID, errorStatus, errorIndex, varList);
SNMPMessage message = new SNMPMessage(version, community, pdu);
byte[] messageEncoding = message.getBEREncoding();
/*
System.out.println("Request Message bytes:");
for (int i = 0; i < messageEncoding.length; ++i)
System.out.print(hexByte(messageEncoding[i]) + " ");
*/
DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort);
dSocket.send(outPacket);
while (true) // wait until receive reply for requestID & OID (or error)
{
DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize);
dSocket.receive(inPacket);
byte[] encodedMessage = inPacket.getData();
/*
System.out.println("Message bytes:");
for (int i = 0; i < encodedMessage.length; ++i)
{
System.out.print(hexByte(encodedMessage[i]) + " ");
}
*/
SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value);
SNMPPDU receivedPDU = receivedMessage.getPDU();
// check request identifier; if incorrect, just ignore packet and continue waiting
if (receivedPDU.getRequestID() == requestID)
{
// check error status; if retrieval problem, throw SNMPGetException
if (receivedPDU.getErrorStatus() != 0)
throw new SNMPGetException("OID " + itemID + " not available for retrieval", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
varList = receivedPDU.getVarBindList();
SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(0));
SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0));
SNMPObject newValue = newPair.getSNMPObjectAt(1);
retrievedVars.addSNMPObject(newPair);
break;
}
}
requestID++;
return retrievedVars;
}
/**
* Retrieve the MIB variable value corresponding to the object identifiers following those
* given in the itemID array (in dotted-integer notation). Return as SNMPVarBindList object;
* if no such variable (either due to device not supporting it, or community name having
* incorrect access privilege), SNMPGetException thrown
* @throws IOException Thrown when timeout experienced while waiting for response to request.
* @throws SNMPBadValueException
* @throws SNMPGetException Thrown if OID following one of supplied OIDs has value that can't be retrieved
*/
public SNMPVarBindList getNextMIBEntry(String[] itemID)
throws IOException, SNMPBadValueException, SNMPGetException
{
// send GetRequest to specified host to retrieve values of specified object identifiers
SNMPVarBindList retrievedVars = new SNMPVarBindList();
SNMPSequence varList = new SNMPSequence();
int errorStatus = 0;
int errorIndex = 0;
for (int i = 0; i < itemID.length; i++)
{
SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID[i]);
SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull());
varList.addSNMPObject(nextPair);
}
SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETNEXTREQUEST, requestID, errorStatus, errorIndex, varList);
SNMPMessage message = new SNMPMessage(version, community, pdu);
byte[] messageEncoding = message.getBEREncoding();
/*
System.out.println("Request Message bytes:");
for (int i = 0; i < messageEncoding.length; ++i)
System.out.print(hexByte(messageEncoding[i]) + " ");
*/
DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort);
dSocket.send(outPacket);
while (true) // wait until receive reply for requestID & OID (or error)
{
DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize);
dSocket.receive(inPacket);
byte[] encodedMessage = inPacket.getData();
/*
System.out.println("Message bytes:");
for (int i = 0; i < encodedMessage.length; ++i)
{
System.out.print(hexByte(encodedMessage[i]) + " ");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -