I've been in the situation before were I needed to discover the neighbors of a Cisco device programmatically. This is useful in a case where you want to crawl a network without hard-coding a list of devices into your script. By default, all Cisco devices have Cisco Discovery Protocol (CDP) enabled and we can use this to get our neighbor list.
The first thing you'll need is the CDP MIB - CISCO-CDP-MIB. If you have the MIB and Net-SNMP package installed, you should be able to issue the following command on the command line:
snmpwalk -mCISCO-CDP-MIB -v2c -c [RO_community] [hostname] ciscoCdpMIB
This should dump a lot of details to your terminal. Here's a snippet of output from my Cisco 2611XM. In all there were 31 lines of output printed.
CISCO-CDP-MIB::cdpInterfaceEnable.1 = INTEGER: true(1) CISCO-CDP-MIB::cdpInterfaceEnable.2 = INTEGER: true(1) CISCO-CDP-MIB::cdpInterfaceEnable.3 = INTEGER: true(1) CISCO-CDP-MIB::cdpInterfaceMessageInterval.1 = INTEGER: 0 seconds CISCO-CDP-MIB::cdpInterfaceMessageInterval.2 = INTEGER: 0 seconds CISCO-CDP-MIB::cdpInterfaceMessageInterval.3 = INTEGER: 0 seconds CISCO-CDP-MIB::cdpInterfaceGroup.1 = INTEGER: 0 CISCO-CDP-MIB::cdpInterfaceGroup.2 = INTEGER: 0 CISCO-CDP-MIB::cdpInterfaceGroup.3 = INTEGER: 0 CISCO-CDP-MIB::cdpInterfacePort.1 = INTEGER: 0 CISCO-CDP-MIB::cdpInterfacePort.2 = INTEGER: 0 CISCO-CDP-MIB::cdpInterfacePort.3 = INTEGER: 0 CISCO-CDP-MIB::cdpInterfaceEntry.6.1 = STRING: "FastEthernet0/0" CISCO-CDP-MIB::cdpInterfaceEntry.6.2 = STRING: "FastEthernet0/1" CISCO-CDP-MIB::cdpInterfaceEntry.6.3 = STRING: "Serial0/0" <snip>
The two most important OIDs in terms of finding neighbors are
which gives the device name, and
cdpCacheAddress, which gives the IP address.
The latter is extremely useful if you need to contact the neighbor and your
device naming scheme
does not match up to DNS.
Now you just need to take the above information and apply it in your programming language.