📄 snmpv1communicationinterface.java
字号:
*/
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 following " + 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);
retrievedVars.addSNMPObject(newPair);
}
break;
}
}
requestID++;
return retrievedVars;
}
/**
* Set the MIB variable value of the object identifier
* given in startID (in dotted-integer notation). Return SNMPVarBindList object returned
* by device in its response; can be used to check that setting was successful.
* Uses SNMPGetNextRequests to retrieve variable values in sequence.
* @throws IOException Thrown when timeout experienced while waiting for response to request.
* @throws SNMPBadValueException
*/
public SNMPVarBindList setMIBEntry(String itemID, SNMPObject newValue)
throws IOException, SNMPBadValueException, SNMPSetException
{
// send SetRequest to specified host to set value of specified object identifier
SNMPVarBindList retrievedVars = new SNMPVarBindList();
int errorStatus = 0;
int errorIndex = 0;
SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID);
SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, newValue);
SNMPSequence varList = new SNMPSequence();
varList.addSNMPObject(nextPair);
SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPSETREQUEST, requestID, errorStatus, errorIndex, varList);
SNMPMessage message = new SNMPMessage(version, community, pdu);
byte[] messageEncoding = message.getBEREncoding();
/*
System.out.println("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 correct 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((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)
{
switch (receivedPDU.getErrorStatus())
{
case 1:
throw new SNMPSetException("Value supplied for OID " + itemID + " too big.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
case 2:
throw new SNMPSetException("OID " + itemID + " not available for setting.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
case 3:
throw new SNMPSetException("Bad value supplied for OID " + itemID + ".", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
case 4:
throw new SNMPSetException("OID " + itemID + " read-only.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
default:
throw new SNMPSetException("Error setting OID " + itemID + ".", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
}
}
varList = receivedPDU.getVarBindList();
SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(0));
// check the object identifier to make sure the correct variable has been received;
// if not, just continue waiting for receive
if (((SNMPObjectIdentifier)newPair.getSNMPObjectAt(0)).toString().equals(itemID))
{
// got the right one; add it to retrieved var list and break!
retrievedVars.addSNMPObject(newPair);
break;
}
}
}
requestID++;
return retrievedVars;
}
/**
* Set the MIB variable values of the supplied object identifiers given in the
* itemID array (in dotted-integer notation). Return SNMPVarBindList returned
* by device in its response; can be used to check that setting was successful.
* Uses SNMPGetNextRequests to retrieve variable values in sequence.
* @throws IOException Thrown when timeout experienced while waiting for response to request.
* @throws SNMPBadValueException
*/
public SNMPVarBindList setMIBEntry(String[] itemID, SNMPObject[] newValue)
throws IOException, SNMPBadValueException, SNMPSetException
{
// check that OID and value arrays have same size
if (itemID.length != newValue.length)
{
throw new SNMPSetException("OID and value arrays must have same size", 0, SNMPRequestException.FAILED);
}
// send SetRequest to specified host to set 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, newValue[i]);
varList.addSNMPObject(nextPair);
}
SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPSETREQUEST, requestID, errorStatus, errorIndex, varList);
SNMPMessage message = new SNMPMessage(version, community, pdu);
byte[] messageEncoding = message.getBEREncoding();
/*
System.out.println("Message bytes:");
for (int i = 0; i < messageEncoding.length; ++i)
{
System.out.print(getHex(messageEncoding[i]) + " ");
}
*/
DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort);
dSocket.send(outPacket);
while (true) // wait until receive reply for correct 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((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)
{
errorIndex = receivedPDU.getErrorIndex();
switch (receivedPDU.getErrorStatus())
{
case 1:
throw new SNMPSetException("Value supplied for OID " + itemID[errorIndex - 1] + " too big.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
case 2:
throw new SNMPSetException("OID " + itemID[errorIndex - 1] + " not available for setting.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
case 3:
throw new SNMPSetException("Bad value supplied for OID " + itemID[errorIndex - 1] + ".", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
case 4:
throw new SNMPSetException("OID " + itemID[errorIndex - 1] + " read-only.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus());
default:
throw new SNMPSetException("Error setting OID " + itemID[errorIndex - 1] + ".", receivedPDU.getErrorIndex(), 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 receivedValue = newPair.getSNMPObjectAt(1);
if (newObjectIdentifier.toString().equals(itemID[i]))
{
retrievedVars.addSNMPObject(newPair);
}
else
{
// wrong OID; throw GetException
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -