1 29 30 31 package snmp; 32 33 import java.io.*; 34 import java.net.*; 35 36 37 43 44 public class SNMPv1CommunicationInterface 45 { 46 public static final int SNMP_PORT = 161; 47 48 private int remotePort = SNMP_PORT; 50 51 private int receiveBufferSize = 512; 54 55 private int version; 56 private InetAddress hostAddress; 57 private String community; 58 DatagramSocket dSocket; 59 60 public int requestID = 1; 61 62 63 64 65 70 71 public SNMPv1CommunicationInterface(int version, InetAddress hostAddress, String community) 72 throws SocketException 73 { 74 this(version, hostAddress, community, SNMP_PORT); 75 } 76 77 78 79 84 85 public SNMPv1CommunicationInterface(int version, InetAddress hostAddress, String community, int remotePort) 86 throws SocketException 87 { 88 this.remotePort = remotePort; 89 this.version = version; 90 this.hostAddress = hostAddress; 91 this.community = community; 92 93 dSocket = new DatagramSocket(); 94 dSocket.setSoTimeout(15000); } 96 97 98 99 100 103 104 public void setSocketTimeout(int socketTimeout) 105 throws SocketException 106 { 107 dSocket.setSoTimeout(socketTimeout); 108 } 109 110 111 112 115 116 public void closeConnection() 117 throws SocketException 118 { 119 dSocket.close(); 120 } 121 122 123 124 125 126 127 134 135 public SNMPVarBindList retrieveAllMIBInfo(String startID) 136 throws IOException, SNMPBadValueException 137 { 138 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 141 142 143 int errorStatus = 0; 144 int errorIndex = 0; 145 146 SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(startID); 147 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull()); 148 SNMPSequence varList = new SNMPSequence(); 149 varList.addSNMPObject(nextPair); 150 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETNEXTREQUEST, requestID, errorStatus, errorIndex, varList); 151 SNMPMessage message = new SNMPMessage(version, community, pdu); 152 byte[] messageEncoding = message.getBEREncoding(); 153 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 154 155 156 dSocket.send(outPacket); 157 158 159 160 while (errorStatus == 0) 161 { 162 163 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 164 165 dSocket.receive(inPacket); 166 167 byte[] encodedMessage = inPacket.getData(); 168 169 170 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 171 173 174 varList = (receivedMessage.getPDU()).getVarBindList(); 175 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(0)); 176 177 SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0)); 178 SNMPObject newValue = newPair.getSNMPObjectAt(1); 179 180 retrievedVars.addSNMPObject(newPair); 181 182 183 if (requestedObjectIdentifier.equals(newObjectIdentifier)) 184 break; 185 186 requestedObjectIdentifier = newObjectIdentifier; 187 188 requestID++; 189 nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull()); 190 varList = new SNMPSequence(); 191 varList.addSNMPObject(nextPair); 192 pdu = new SNMPPDU(SNMPBERCodec.SNMPGETNEXTREQUEST, requestID, errorStatus, errorIndex, varList); 193 message = new SNMPMessage(version, community, pdu); 194 messageEncoding = message.getBEREncoding(); 195 outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 196 197 dSocket.send(outPacket); 198 199 } 200 201 202 return retrievedVars; 203 204 } 205 206 207 208 private String hexByte(byte b) 209 { 210 int pos = b; 211 if (pos < 0) 212 pos += 256; 213 String returnString = new String (); 214 returnString += Integer.toHexString(pos/16); 215 returnString += Integer.toHexString(pos%16); 216 return returnString; 217 } 218 219 220 221 222 223 232 233 public SNMPVarBindList getMIBEntry(String itemID) 234 throws IOException, SNMPBadValueException, SNMPGetException 235 { 236 238 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 239 240 241 int errorStatus = 0; 242 int errorIndex = 0; 243 244 245 SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID); 246 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull()); 247 SNMPSequence varList = new SNMPSequence(); 248 varList.addSNMPObject(nextPair); 249 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETREQUEST, requestID, errorStatus, errorIndex, varList); 250 251 SNMPMessage message = new SNMPMessage(version, community, pdu); 252 253 byte[] messageEncoding = message.getBEREncoding(); 254 255 256 262 263 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 264 265 dSocket.send(outPacket); 266 267 268 while (true) { 270 271 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 272 273 dSocket.receive(inPacket); 274 275 byte[] encodedMessage = inPacket.getData(); 276 277 285 286 287 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 288 SNMPPDU receivedPDU = receivedMessage.getPDU(); 289 290 if (receivedPDU.getRequestID() == requestID) 292 { 293 294 if (receivedPDU.getErrorStatus() != 0) 296 throw new SNMPGetException("OID " + itemID + " not available for retrieval", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 297 298 299 varList = receivedPDU.getVarBindList(); 300 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(0)); 301 302 SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0)); 303 SNMPObject newValue = newPair.getSNMPObjectAt(1); 304 305 if (newObjectIdentifier.toString().equals(itemID)) 308 { 309 retrievedVars.addSNMPObject(newPair); 311 break; 312 } 313 314 } 315 316 } 317 318 319 requestID++; 320 321 322 return retrievedVars; 323 324 } 325 326 327 328 329 338 339 public SNMPVarBindList getMIBEntry(String [] itemID) 340 throws IOException, SNMPBadValueException, SNMPGetException 341 { 342 344 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 345 SNMPSequence varList = new SNMPSequence(); 346 347 int errorStatus = 0; 348 int errorIndex = 0; 349 350 for (int i = 0; i < itemID.length; i++) 351 { 352 SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID[i]); 353 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull()); 354 varList.addSNMPObject(nextPair); 355 } 356 357 358 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETREQUEST, requestID, errorStatus, errorIndex, varList); 359 360 SNMPMessage message = new SNMPMessage(version, community, pdu); 361 362 byte[] messageEncoding = message.getBEREncoding(); 363 364 365 371 372 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 373 374 375 dSocket.send(outPacket); 376 377 378 while (true) { 380 381 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 382 383 dSocket.receive(inPacket); 384 385 byte[] encodedMessage = inPacket.getData(); 386 387 395 396 397 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 398 SNMPPDU receivedPDU = receivedMessage.getPDU(); 399 400 if (receivedPDU.getRequestID() == requestID) 402 { 403 404 if (receivedPDU.getErrorStatus() != 0) 406 { 407 errorIndex = receivedPDU.getErrorIndex(); 409 throw new SNMPGetException("OID " + itemID[errorIndex - 1] + " not available for retrieval", errorIndex, receivedPDU.getErrorStatus()); 410 } 411 412 varList = receivedPDU.getVarBindList(); 414 415 for (int i = 0; i < varList.size(); i++) 416 { 417 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(i)); 418 419 SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0)); 420 SNMPObject newValue = newPair.getSNMPObjectAt(1); 421 422 if (newObjectIdentifier.toString().equals(itemID[i])) 423 { 424 retrievedVars.addSNMPObject(newPair); 425 } 426 else 427 { 428 throw new SNMPGetException("OID " + itemID[i] + " expected at index " + i + ", OID " + newObjectIdentifier + " received", i+1, SNMPRequestException.FAILED); 430 } 431 } 432 433 break; 434 435 } 436 437 } 438 439 440 requestID++; 441 442 443 return retrievedVars; 444 445 } 446 447 448 449 450 451 460 461 public SNMPVarBindList getNextMIBEntry(String itemID) 462 throws IOException, SNMPBadValueException, SNMPGetException 463 { 464 466 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 467 468 469 int errorStatus = 0; 470 int errorIndex = 0; 471 472 473 SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID); 474 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull()); 475 SNMPSequence varList = new SNMPSequence(); 476 varList.addSNMPObject(nextPair); 477 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETNEXTREQUEST, requestID, errorStatus, errorIndex, varList); 478 479 SNMPMessage message = new SNMPMessage(version, community, pdu); 480 481 byte[] messageEncoding = message.getBEREncoding(); 482 483 484 490 491 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 492 493 494 dSocket.send(outPacket); 495 496 497 while (true) { 499 500 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 501 502 dSocket.receive(inPacket); 503 504 byte[] encodedMessage = inPacket.getData(); 505 506 514 515 516 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 517 SNMPPDU receivedPDU = receivedMessage.getPDU(); 518 519 if (receivedPDU.getRequestID() == requestID) 521 { 522 523 if (receivedPDU.getErrorStatus() != 0) 525 throw new SNMPGetException("OID " + itemID + " not available for retrieval", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 526 527 528 varList = receivedPDU.getVarBindList(); 529 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(0)); 530 531 SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0)); 532 SNMPObject newValue = newPair.getSNMPObjectAt(1); 533 534 retrievedVars.addSNMPObject(newPair); 535 536 break; 537 538 } 539 540 } 541 542 543 requestID++; 544 545 546 return retrievedVars; 547 548 } 549 550 551 552 553 554 563 564 public SNMPVarBindList getNextMIBEntry(String [] itemID) 565 throws IOException, SNMPBadValueException, SNMPGetException 566 { 567 569 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 570 SNMPSequence varList = new SNMPSequence(); 571 572 int errorStatus = 0; 573 int errorIndex = 0; 574 575 for (int i = 0; i < itemID.length; i++) 576 { 577 SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID[i]); 578 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull()); 579 varList.addSNMPObject(nextPair); 580 } 581 582 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETNEXTREQUEST, requestID, errorStatus, errorIndex, varList); 583 SNMPMessage message = new SNMPMessage(version, community, pdu); 584 585 byte[] messageEncoding = message.getBEREncoding(); 586 587 588 594 595 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 596 597 598 dSocket.send(outPacket); 599 600 601 while (true) { 603 604 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 605 606 dSocket.receive(inPacket); 607 608 byte[] encodedMessage = inPacket.getData(); 609 610 618 619 620 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 621 SNMPPDU receivedPDU = receivedMessage.getPDU(); 622 623 if (receivedPDU.getRequestID() == requestID) 625 { 626 627 if (receivedPDU.getErrorStatus() != 0) 629 { 630 errorIndex = receivedPDU.getErrorIndex(); 632 throw new SNMPGetException("OID following " + itemID[errorIndex - 1] + " not available for retrieval", errorIndex, receivedPDU.getErrorStatus()); 633 } 634 635 varList = receivedPDU.getVarBindList(); 637 638 for (int i = 0; i < varList.size(); i++) 639 { 640 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(i)); 641 642 SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0)); 643 SNMPObject newValue = newPair.getSNMPObjectAt(1); 644 645 retrievedVars.addSNMPObject(newPair); 646 647 } 648 649 break; 650 651 } 652 653 } 654 655 656 requestID++; 657 658 659 return retrievedVars; 660 661 } 662 663 664 665 666 667 668 669 677 678 public SNMPVarBindList setMIBEntry(String itemID, SNMPObject newValue) 679 throws IOException, SNMPBadValueException, SNMPSetException 680 { 681 683 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 684 685 int errorStatus = 0; 686 int errorIndex = 0; 687 688 SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID); 689 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, newValue); 690 691 692 693 SNMPSequence varList = new SNMPSequence(); 694 varList.addSNMPObject(nextPair); 695 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPSETREQUEST, requestID, errorStatus, errorIndex, varList); 696 697 698 SNMPMessage message = new SNMPMessage(version, community, pdu); 699 byte[] messageEncoding = message.getBEREncoding(); 700 701 709 710 711 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 712 713 714 dSocket.send(outPacket); 715 716 717 while (true) { 719 720 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 721 722 dSocket.receive(inPacket); 723 724 725 byte[] encodedMessage = inPacket.getData(); 726 727 735 736 737 738 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 739 740 SNMPPDU receivedPDU = receivedMessage.getPDU(); 741 742 743 if (receivedPDU.getRequestID() == requestID) 745 { 746 747 if (receivedPDU.getErrorStatus() != 0) 749 { 750 switch (receivedPDU.getErrorStatus()) 751 { 752 case 1: 753 throw new SNMPSetException("Value supplied for OID " + itemID + " too big.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 754 755 case 2: 756 throw new SNMPSetException("OID " + itemID + " not available for setting.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 757 758 case 3: 759 throw new SNMPSetException("Bad value supplied for OID " + itemID + ".", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 760 761 case 4: 762 throw new SNMPSetException("OID " + itemID + " read-only.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 763 764 default: 765 throw new SNMPSetException("Error setting OID " + itemID + ".", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 766 767 } 768 } 769 770 771 varList = receivedPDU.getVarBindList(); 772 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(0)); 773 774 if (((SNMPObjectIdentifier)newPair.getSNMPObjectAt(0)).toString().equals(itemID)) 777 { 778 retrievedVars.addSNMPObject(newPair); 780 break; 781 } 782 783 } 784 785 } 786 787 788 requestID++; 789 790 791 return retrievedVars; 792 793 } 794 795 796 797 798 806 807 public SNMPVarBindList setMIBEntry(String [] itemID, SNMPObject[] newValue) 808 throws IOException, SNMPBadValueException, SNMPSetException 809 { 810 if (itemID.length != newValue.length) 812 { 813 throw new SNMPSetException("OID and value arrays must have same size", 0, SNMPRequestException.FAILED); 814 } 815 816 817 819 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 820 SNMPSequence varList = new SNMPSequence(); 821 822 int errorStatus = 0; 823 int errorIndex = 0; 824 825 826 for (int i = 0; i < itemID.length; i++) 827 { 828 SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(itemID[i]); 829 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, newValue[i]); 830 varList.addSNMPObject(nextPair); 831 } 832 833 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPSETREQUEST, requestID, errorStatus, errorIndex, varList); 834 SNMPMessage message = new SNMPMessage(version, community, pdu); 835 836 byte[] messageEncoding = message.getBEREncoding(); 837 838 846 847 848 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 849 850 dSocket.send(outPacket); 851 852 853 while (true) { 855 856 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 857 858 dSocket.receive(inPacket); 859 860 byte[] encodedMessage = inPacket.getData(); 861 862 870 871 872 873 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 874 875 SNMPPDU receivedPDU = receivedMessage.getPDU(); 876 877 878 if (receivedPDU.getRequestID() == requestID) 880 { 881 882 if (receivedPDU.getErrorStatus() != 0) 884 { 885 errorIndex = receivedPDU.getErrorIndex(); 886 887 switch (receivedPDU.getErrorStatus()) 888 { 889 case 1: 890 throw new SNMPSetException("Value supplied for OID " + itemID[errorIndex - 1] + " too big.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 891 892 case 2: 893 throw new SNMPSetException("OID " + itemID[errorIndex - 1] + " not available for setting.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 894 895 case 3: 896 throw new SNMPSetException("Bad value supplied for OID " + itemID[errorIndex - 1] + ".", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 897 898 case 4: 899 throw new SNMPSetException("OID " + itemID[errorIndex - 1] + " read-only.", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 900 901 default: 902 throw new SNMPSetException("Error setting OID " + itemID[errorIndex - 1] + ".", receivedPDU.getErrorIndex(), receivedPDU.getErrorStatus()); 903 904 } 905 } 906 907 908 varList = receivedPDU.getVarBindList(); 910 911 for (int i = 0; i < varList.size(); i++) 912 { 913 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(i)); 914 915 SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0)); 916 918 if (newObjectIdentifier.toString().equals(itemID[i])) 919 { 920 retrievedVars.addSNMPObject(newPair); 921 } 922 else 923 { 924 throw new SNMPSetException("OID " + itemID[i] + " expected at index " + i + ", OID " + newObjectIdentifier + " received", i+1, SNMPRequestException.FAILED); 926 } 927 } 928 929 break; 930 931 } 932 933 } 934 935 936 requestID++; 937 938 939 return retrievedVars; 940 941 } 942 943 944 945 946 954 955 public SNMPVarBindList retrieveMIBTable(String baseID) 956 throws IOException, SNMPBadValueException, SNMPGetException 957 { 958 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 961 962 963 int errorStatus = 0; 964 int errorIndex = 0; 965 966 String currentID = baseID; 967 SNMPObjectIdentifier requestedObjectIdentifier = new SNMPObjectIdentifier(currentID); 968 969 970 while (errorStatus == 0) 971 { 972 973 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier, new SNMPNull()); 974 SNMPSequence varList = new SNMPSequence(); 975 varList.addSNMPObject(nextPair); 976 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETNEXTREQUEST, requestID, errorStatus, errorIndex, varList); 977 SNMPMessage message = new SNMPMessage(version, community, pdu); 978 byte[] messageEncoding = message.getBEREncoding(); 979 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 980 981 989 990 dSocket.send(outPacket); 991 992 993 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 994 995 dSocket.receive(inPacket); 996 997 byte[] encodedMessage = inPacket.getData(); 998 999 1000 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 1001 SNMPPDU receivedPDU = receivedMessage.getPDU(); 1002 1003 if (receivedPDU.getRequestID() == requestID) 1005 { 1006 1007 if (receivedPDU.getErrorStatus() != 0) 1009 { 1010 break; 1011 } 1013 1014 varList = receivedPDU.getVarBindList(); 1015 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(0)); 1016 1017 SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0)); 1018 SNMPObject newValue = newPair.getSNMPObjectAt(1); 1019 1020 String newOIDString = (String )newObjectIdentifier.toString(); 1022 if (!newOIDString.startsWith(baseID)) 1023 break; 1024 1025 retrievedVars.addSNMPObject(newPair); 1026 1027 requestedObjectIdentifier = newObjectIdentifier; 1028 1029 requestID++; 1030 1031 } 1032 1033 1034 } 1035 1036 1037 return retrievedVars; 1038 1039 } 1040 1041 1042 1043 1044 1058 1059 public SNMPVarBindList retrieveMIBTable(String [] baseID) 1060 throws IOException, SNMPBadValueException, SNMPGetException 1061 { 1062 SNMPVarBindList retrievedVars = new SNMPVarBindList(); 1065 1066 int errorStatus = 0; 1067 int errorIndex = 0; 1068 1069 SNMPObjectIdentifier[] requestedObjectIdentifier = new SNMPObjectIdentifier[baseID.length]; 1070 for (int i = 0; i < baseID.length; i++) 1071 { 1072 requestedObjectIdentifier[i] = new SNMPObjectIdentifier(baseID[i]); 1073 } 1074 1075 1076retrievalLoop: 1077 1078 while (errorStatus == 0) 1079 { 1080 1081 SNMPSequence varList = new SNMPSequence(); 1082 1083 for (int i = 0; i < requestedObjectIdentifier.length; i++) 1084 { 1085 SNMPVariablePair nextPair = new SNMPVariablePair(requestedObjectIdentifier[i], new SNMPNull()); 1086 varList.addSNMPObject(nextPair); 1087 } 1088 1089 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETNEXTREQUEST, requestID, errorStatus, errorIndex, varList); 1090 SNMPMessage message = new SNMPMessage(version, community, pdu); 1091 1092 byte[] messageEncoding = message.getBEREncoding(); 1093 1094 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, hostAddress, remotePort); 1095 1096 1104 1105 dSocket.send(outPacket); 1106 1107 1108 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 1109 1110 dSocket.receive(inPacket); 1111 1112 byte[] encodedMessage = inPacket.getData(); 1113 1114 1115 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 1116 SNMPPDU receivedPDU = receivedMessage.getPDU(); 1117 1118 if (receivedPDU.getRequestID() == requestID) 1120 { 1121 1122 if (receivedPDU.getErrorStatus() != 0) 1125 { 1126 int retrievedErrorIndex = receivedPDU.getErrorIndex(); 1127 1128 if (retrievedErrorIndex == 1) 1129 { 1130 break retrievalLoop; 1131 } 1132 else 1133 { 1134 throw new SNMPGetException("OID following " + requestedObjectIdentifier[retrievedErrorIndex - 1] + " not available for retrieval", retrievedErrorIndex, receivedPDU.getErrorStatus()); 1135 } 1136 } 1137 1138 varList = receivedPDU.getVarBindList(); 1140 1141 if(varList.size() != requestedObjectIdentifier.length) 1143 { 1144 throw new SNMPGetException("Incomplete row of table received", 0, SNMPRequestException.FAILED); 1145 } 1146 1147 for (int i = 0; i < varList.size(); i++) 1149 { 1150 SNMPSequence newPair = (SNMPSequence)(varList.getSNMPObjectAt(i)); 1151 1152 SNMPObjectIdentifier newObjectIdentifier = (SNMPObjectIdentifier)(newPair.getSNMPObjectAt(0)); 1153 SNMPObject newValue = newPair.getSNMPObjectAt(1); 1154 1155 String newOIDString = (String )newObjectIdentifier.toString(); 1157 if (!newOIDString.startsWith(baseID[i])) 1158 { 1159 if (i == 0) 1160 { 1161 break retrievalLoop; 1163 } 1164 else 1165 { 1166 throw new SNMPGetException("Incomplete row of table received", i+1, SNMPRequestException.FAILED); 1168 } 1169 } 1170 1171 retrievedVars.addSNMPObject(newPair); 1172 1173 requestedObjectIdentifier[i] = newObjectIdentifier; 1175 } 1176 1177 1178 requestID++; 1179 1180 } 1181 1182 1183 } 1184 1185 1186 return retrievedVars; 1187 1188 } 1189 1190 1191 1192 1193 1194 1195 1203 1204 public void setReceiveBufferSize(int receiveBufferSize) 1205 { 1206 if (receiveBufferSize >= 484) 1207 { 1208 this.receiveBufferSize = receiveBufferSize; 1209 } 1210 else 1211 { 1212 this.receiveBufferSize = 484; 1213 } 1214 } 1215 1216 1217 1218 1221 1222 public int getReceiveBufferSize() 1223 { 1224 return this.receiveBufferSize; 1225 } 1226 1227 1228 1229} 1230
| Popular Tags
|