|||
Categories: Blogosphere, World Of ICT

WebGIS using Google Map Api , XML, Mysql, JavaScript, PHP, HTML


Saya akan kembali berbagi pengalaman kepada para pembaca blog yang Budiman,  mengenai pengalaman coding/ngoprek WebGIS berbasis Google MAP, case yang saya miliki kira kira seperti ini;

  • Saya memiliki sekumpulan data tentang pusat layanan kesehatan di Kota Bandar Lampung.
  • Data terdiri dari NamaLayanan, Telp, Alamat, Koordinat Latitude/Longitude, Foto Profil, Video Profil.
  • Saya ingin data yang saya miliki disimpan dalam database MySQL.
  • Saya ingin agar data MySQL tadi dapat digunakan juga secara terbuka oleh aplikasi lain via WebService dengan teknologi XML.
  • Saya ingin agar semua informasi terpetakan dengan baik pada sebuah portal website informatif.
  • Saya ingin agar ada icon gambar pembeda antara layanan rumah sakit dan klinik.
  • Saya ingin agar posisi letak object layanan kesehatan dapat diketahui secara detail pada Peta Digital Online.
  • Peta yang disajikan juga dapat memunculkan Foto/Gambar profil, serta Video Profil yang dapat ditayangkan langsung pada aplikasi.
  • Saya gak pengen pakai model programming yang ribet

Dari sekian banyak requirement yang sudah ada kita coba cari solusinya dengan memanfaatkan teknologi  Google Map Api , XML, Mysql, JavaScript, HTML.  Langsung saja saya bahas step by step bagaimana penyelesaiannya.

Pastikan bahwa Web Server anda sudah terinstall dengan baik, lengkap dengan Database MySQL yg akan digunakan sebagai tempat menyimpan data.

  • Buat Database baru sesuai dengan requirement yang ada (misal database webgis)
  • Buat Table baru pada database webgis
  • DROP TABLE IF EXISTS `fasilitas`;
    CREATE TABLE `fasilitas` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `name` varchar(60) NOT NULL,
     `address` varchar(80) NOT NULL,
     `lat` float(10,6) NOT NULL,
     `lng` float(10,6) NOT NULL,
     `type` varchar(30) NOT NULL,
     `image` varchar(40) DEFAULT NULL,
     `telp` varchar(20) DEFAULT NULL,
     `fasilitas` varchar(100) DEFAULT NULL,
     `video` varchar(300) DEFAULT NULL,
     `web` varchar(200) DEFAULT NULL,
     PRIMARY KEY (`id`)
     ) ENGINE=MyISAM AUTO_INCREMENT=53 DEFAULT CHARSET=latin1;
  • Insert data ke dalam tabel yang sudah dibuat, contoh dibawah adalah 3 data yang akan di entri;
  • INSERT INTO `fasilitas` VALUES ('1', 'Balai Pengobatan Lanal Lampung, Kota Bandar Lampung, Lampung', 'Bandar Lampung', '-5.480050', '105.324883', 'klinik', 'http://webgis.unila.ac.id/img/klinik.jpg', '0721-xxx-yy', 'Ruang Klinik', 'http://www.youtube.com/embed/YT01kPaOBSA?autoplay=1', null);
    INSERT INTO `fasilitas` VALUES ('2', 'Bidan Irmayani, Kota Bandar Lampung, Lampung, IDN', 'Bandar Lampung', '-5.382550', '105.233597', 'klinik', 'http://webgis.unila.ac.id/img/klinik.jpg', '0721-xxx-yy', 'Ruang Klinik', 'http://www.youtube.com/embed/YT01kPaOBSA?autoplay=1', null);
    INSERT INTO `fasilitas` VALUES ('51', 'Uptd Balai Laboraorium Kesehatan, Kota Bandar Lampung, Lampu', 'Bandar Lampung', '-5.400960', '105.257889', 'rumahsakit', 'http://webgis.unila.ac.id/img/rs1.jpg', '0721-xxx-yy', 'Ruang Operasi Terpadu', 'http://www.youtube.com/embed/PSbvtjciAxY?autoplay=1', null);
  • Buat Driver PHP agar membaca database yang sudah dibuat tadi, dengan source code phpsqlajax_dbinfo.php  sbb;
  • <?php
    $username="root";
    $password="sukasukagueaja";
    $database="webgis";
    ?>
  • Buat program PHP phpsqlajax_genxml2.php , membaca data dari MySQL lalu mengkonversinya dalam format XML
  • <?php
    require("phpsqlajax_dbinfo.php");
    function parseToXML($htmlStr)
    {
    $xmlStr=str_replace('<','<',$htmlStr); $xmlStr=str_replace('-->','>',$xmlStr);
    $xmlStr=str_replace('"','"',$xmlStr);
    $xmlStr=str_replace("'",''',$xmlStr);
    $xmlStr=str_replace("&",'&',$xmlStr);
    return $xmlStr;
    }
    // Buka Koneksi ke Database MySQL
    $connection=mysql_connect ('localhost', $username, $password);
    if (!$connection) {
      die('Not connected : ' . mysql_error());
    }
    // Set Active MySQL
    $db_selected = mysql_select_db($database, $connection);
    if (!$db_selected) {
      die ('Can\'t use db : ' . mysql_error());
    }
    // Query memilih Table Fasilitas
    $query = "SELECT * FROM fasilitas WHERE 1";
    $result = mysql_query($query);
    if (!$result) {
      die('Invalid query: ' . mysql_error());
    }
    header("Content-type: text/xml");
    // Memulai membuat XML File Marker
    echo '';
    // Iterasi dari semua row yang ada pada MySQL, dan mencetaknya line per line
    while ($row = @mysql_fetch_assoc($result)){
      // Cetak XML
      echo '<marker ';="" echo="" 'name="' . parseToXML($row['name']) . '" 'address="' . parseToXML($row['address']) . '" 'lat="' . $row['lat'] . '" 'lng="' . $row['lng'] . '" 'type="' . $row['type'] . '" 'image="' . $row['image'] . '" 'telp="' . $row['telp'] . '" 'fasilitas="' . $row['fasilitas'] . '" 'video="' . $row['video'] . '" '?="">';
    }
    // End XML 
    echo '';
    ?>
    
    
  • Terakhir buat file index.html ;
  • <!DOCTYPE html >
     <head>
     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
     <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
     <title>PHP/MySQL & Google Maps Example</title>
     <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
     <script type="text/javascript">
     //<![CDATA[
     var customIcons = {
     rumahsakit: {
          icon: 'http://webgis.unila.ac.id/img/mm_20_blue.png'
     },
     klinik: {
     icon: 'http://webgis.unila.ac.id/img/mm_20_green.png'
     }
     };
    
     function load() {
     var map = new google.maps.Map(document.getElementById("map"), {
     center: new google.maps.LatLng(-5.4057316,105.2805186),
     zoom: 13,
     mapTypeId: 'roadmap'
     });
     var infoWindow = new google.maps.InfoWindow;
     // Change this depending on the name of your PHP file
     downloadUrl("phpsqlajax_genxml2.php", function(data) {
     var xml = data.responseXML;
     var markers = xml.documentElement.getElementsByTagName("marker");
     for (var i = 0; i < markers.length; i++) {
     var name = markers[i].getAttribute("name");
     var address = markers[i].getAttribute("address");
     var type = markers[i].getAttribute("type");
     var telp = markers[i].getAttribute("telp");
     var fasilitas = markers[i].getAttribute("fasilitas");
     var image = '<img src="'+markers[i].getAttribute("image")+'" alt="FOTO"/>';
     var video = ''
     var point = new google.maps.LatLng(
     parseFloat(markers[i].getAttribute("lat")),
     parseFloat(markers[i].getAttribute("lng")));
     var html = "<b>" + name + "</b> <br/>" ;
     var html1 = "<b>Telp:</b> " + telp +"</b> <br/>" ;
     var html2 = "<b>Fasilitas:</b> " + fasilitas +"</b> <br/>" +"<b> Video Profil:</b><br>";
     var html3 = "<b>Alamat:</b> " + address +"</b> <br/>" ;
     var html4 = "<br></br> <b> Foto Object: </b>" + "<br/>";
     var icon = customIcons[type] || {};
     var marker = new google.maps.Marker({
     map: map,
     position: point,
     icon: icon.icon
     });
     bindInfoWindow(marker, map, infoWindow, html,html1,html2,html3,html4,image,fasilitas,video);
     }
     });
     }
     function bindInfoWindow(marker, map, infoWindow, html,html1,html2,html3,html4,image,fasilitas,video) {
     google.maps.event.addListener(marker, 'click', function() {
     infoWindow.setContent(html+html1+html3+html2+video+html4+image);
     infoWindow.open(map, marker,image,fasilitas);
     });
     }
     function downloadUrl(url, callback) {
     var request = window.ActiveXObject ?
     new ActiveXObject('Microsoft.XMLHTTP') :
     new XMLHttpRequest;
     request.onreadystatechange = function() {
     if (request.readyState == 4) {
     request.onreadystatechange = doNothing;
     callback(request, request.status);
     }
     };
     request.open('GET', url, true);
     request.send(null);
     }
     function doNothing() {}
     //]]>
     </script>
     </head>
     <body onload="load()">
     <div id="map" style="width: 850px; height: 550px"></div>
     </body>
    </html>

Finish, tinggal buka file index.html, kira kira tampilannnya akan seperti ini, Video dari url embed youtube akan muncul, berikut gambar profil fasilitas.

webgis

How to: Python Send SMS to Gammu Server


Saat ini saya memiliki server sms gateway sendiri dengan platform Gammu-MySQL sebagai core enginenya, selain server sms gateway saya juga memiliki server monitoring berbasis Python, sekarang saya ingin agar server monitoring tadi dapat menggunakan layanan sms gateway ketika terjadi gangguan koneksi. Gimana caranya …  ??

Terlebih dahulu install library Python-Mysql agar python dapat mengenali menjalankan query  Mysql, lalu buat entry baru pada database gammu (table outbox)  dengan isian no tlp tujuan, info, owner ; kira-kira akan seperti ini.

import datetime
now = datetime.datetime.now()
jam= now.strftime("%Y-%m-%d %H:%M")
import MySQLdb as mdb
import sys
import os
hostname = "www.google.com" #example
response = os.system("ping -c 1 " + hostname)
b = int(float(response))
if b == 0 :
print '0'
 conn = mdb.connect("192.168.1.xxx", "root", "sukasukague", "gammu");
 with conn:
 cursor = conn.cursor ()
 cursor.execute ("SELECT * FROM outbox")
 cursor.close()
if b == 256 :
 print 'Nilai 256'
 conn = mdb.connect("localhost", "root", "sukasukague", "gammu");
 with conn:
 cursor = conn.cursor ()
 cursor.execute ("SELECT * FROM outbox")
 cursor.execute ("""INSERT INTO outbox(DestinationNumber, TextDecoded, CreatorID) VALUES('+6285289774152', 'REMINDER: Koneksi Internet Internasional : OFF !!!', 'Gammu')""")
 cursor.execute ("""INSERT INTO outbox(DestinationNumber, TextDecoded, CreatorID) VALUES('+6289631031009', 'REMINDER: Koneksi Internet Internasional : OFF !!!', 'Gam
mu')""")
 cursor.close()

Yaps beres, tinggal eksekusi script python tadi, sebetulnya tidak hanya python yang bisa melakukan send sms ini, bisa juga kita buat menggunakan program php, java, C, ruby, dll . Yang penting kita tahu secara konsep bahwa gammu akan selalu melakukan pengecekan pada table outbox, setiap ada entry tabel outbox akan di “paksa” oleh gammu untuk dikirimkan terserah sukses atau tidak, setelah daemon gammu mengirimkan sms maka table outbox akan kosong, entry akan pindah ke table sentitem.

Kira kira seperti itulah cara kerja si gammu ini, jadi clear yah. Mudah-mudahan ada gunanya.

Mengaktifkan IPv6 pada salah satu Virtual Host CPanel


Tujuan dari note ini adalah  bagaimana caranya agar IPv6 Cpanel yang terinstall pada Centos dapat berjalan, selanjutnya agar Virtual Host yang dikelola oleh Cpanel juga dapat diakses webnya melalui jaringan IPv6.

  • Syarat utama anda sudah memiliki alokasi IPv6 baik dedicated/dualstack , tunneling.
  • Pastikan bahwa record AAAA sudah ditambahkan pada DNS Server anda.
  • eth0 Link encap:Ethernet HWaddr F2:CB:A6:DF:86:6C
     inet addr:103.3.46.5 Bcast:103.3.46.255 Mask:255.255.255.0
     inet6 addr: 2001:df0:230:9::/128 Scope:Global
     inet6 addr: fe80::f0cb:a6ff:fedf:866c/64 Scope:Link
     inet6 addr: 2001:df0:230:9::7/64 Scope:Global
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:17230026 errors:0 dropped:0 overruns:0 frame:0
     TX packets:18842347 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1000
     RX bytes:4065688152 (3.7 GiB) TX bytes:18337777713 (17.0 GiB)
  • root@hosting [~]# traceroute6 www.kame.net
    traceroute to www.kame.net (2001:200:dff:fff1:216:3eff:feb1:44d7), 30 hops max, 80 byte packets
     1 GERBANG-6-KELUAR-AS56237-NOC-Cyber-MK670-AP.unila.ac.id (2001:df0:230:9::1) 12.857 ms 12.787 ms 11.406 ms
     2 2400:4a00:a000:300::1 (2400:4a00:a000:300::1) 37.287 ms 37.303 ms 37.309 ms
     3 2400:4a00:1d00::1:25 (2400:4a00:1d00::1:25) 50.989 ms 52.375 ms 52.669 ms
     4 snge-b1-link.telia.net (2001:2000:3080:961::1) 86.042 ms 86.058 ms 85.853 ms
     5 las-bb1-v6.telia.net (2001:2000:3018:2f::1) 259.833 ms 256.579 ms 256.592 ms
     6 ntt-ic-143926-las-bb1.c.telia.net (2001:2000:3080:362::2) 247.189 ms 245.040 ms ntt-ic-151170-las-bb1.c.telia.net (2001:2000:3080:3a2::2) 244.950 ms
     7 ae-8.r20.lsanca03.us.bb.gin.ntt.net (2001:418:0:2000::22d) 247.316 ms ae-6.r21.lsanca03.us.bb.gin.ntt.net (2001:418:0:2000::10d) 244.766 ms *
     8 ae-7.r20.tokyjp05.jp.bb.gin.ntt.net (2001:218:0:2000::2ce) 300.563 ms * 254.249 ms
     9 ae-19.r25.tokyjp05.jp.bb.gin.ntt.net (2001:218:0:2000::29d) 241.705 ms * ae-19.r24.tokyjp05.jp.bb.gin.ntt.net (2001:218:0:2000::299) 235.300 ms
    10 ae-1.r01.tokyjp01.jp.bb.gin.ntt.net (2001:218:0:2000::202) 246.640 ms 246.853 ms 237.426 ms
    11 ge-0-7-0-18.r01.tokyjp01.jp.ce.gin.ntt.net (2001:218:2000:5000::82) 410.375 ms 410.374 ms 410.116 ms
    12 ve44.foundry6.otemachi.wide.ad.jp (2001:200:0:10::141) 369.848 ms 354.840 ms 345.964 ms
    13 2001:200:dff:fff1:216:3eff:feb1:44d7 (2001:200:dff:fff1:216:3eff:feb1:44d7) 345.331 ms 358.349 ms 340.738 ms
    root@hosting [~]#
  • Contoh ditempat saya resolv DNS yang sudah aktif
  • C:\Users\GigihFN>nslookup www.unila.ac.id
    
    Name: www.unila.ac.id
    Addresses: 2001:df0:230:9::7
               103.3.46.5
    
    C:\Users\GigihFN>nslookup 2001:df0:230:9::7
    Name: www.unila.ac.id
    Address: 2001:df0:230:9::7
  • Edit file master config Apache Cpanel  /etc/httpd/conf/httpd.conf , lalu tambahkan listen [::]:80 dibawah Listen IPv4 milik  anda

sebelum diubah /etc/httpd/conf/httpd.conf

PidFile logs/httpd.pid
LockFile logs/accept.lock
# Defined in /var/cpanel/cpanel.config: apache_port
Listen 0.0.0.0:80
User nobody
Group nobody
ubah menjadi
PidFile logs/httpd.pid
LockFile logs/accept.lock
# Defined in /var/cpanel/cpanel.config: apache_port
Listen 0.0.0.0:80
Listen [::]:80
User nobody
Group nobody
  • Selanjutnya rubah konfigurasu sub domain/domain yang ingin ditambahkan IPv6 (contoh http://www.unila.ac.id  dengan IPv6 2001:df0:230:9::7 dengan IPv4 103.3.46.1  ), buka file httpd.conf, ubah bagian :
NameVirtualHost [2001:df0:230:9::7]:80
<VirtualHost 103.3.46.5:80 [2001:df0:230:9::7]:80>
 ServerName unila.ac.id
 ServerAlias ipv6.unila.ac.id www.unila.ac.id
 DocumentRoot /xxx/yyy/www/
 ServerAdmin webmaster@unila.ac.id
 UseCanonicalName Off
 CustomLog /xxx/yyy/unila.ac.id combined
 CustomLog /xxx/yyy/unila.ac.id-bytes_log "%{%s}t %I .\n%{%s}t %O ."
Categories: Blogosphere

WIFI@Unila Statistik


Setelah infrastruktur Wireless baru di tuning (naikin power transmit, rubah algoritma di wireless controller), terlihat ada peningkatan user cukup signifikan ke WIFI@Unila. Dengan sistem yang baru enak liat laporannya, dari total current 500 client terotentikasi via SSO, android tetap merajai dengan statistik, Android : 20,6 % , Window7 17,2 % , iOS 3,8%, window8 3,8 %, , Blackberry 2%, , XP 1,5 %, tinggal buat paper nya hehe 

Setelah infrastruktur Wireless baru di tuning (naikin power transmit, rubah algoritma di wireless controller), terlihat ada peningkatan user cukup signifikan ke WIFI@Unila. Dengan sistem yang baru enak liat laporannya, dari total current 500 client terotentikasi via SSO, android tetap merajai dengan statistik, Android : 20,6 % , Window7 17,2 % , iOS 3,8%, window8 3,8 %, , Blackberry 2%, , XP 1,5 %,  tinggal buat paper nya hehe :-D
dari total 1800-an device yang tersambung, authenticate via cable total 600-an, dan ke WiFI 300-an.
Gigih Forda Nama's photo.

Aruba Wireless Controller OIDs


Just make a note  Aruba wireless controller OIDs.

Orion Internal Name OID Name OID Value
Role wlsxSwitchRole 1.3.6.1.4.1.14823.2.2.1.1.1.4
HostName wlsxSysExtHostname 1.3.6.1.4.1.14823.2.2.1.2.1.2
ModelName wlsxSysExtModelName 1.3.6.1.4.1.14823.2.2.1.2.1.3
Client_Name staUserName 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.3
Client_Role staUserRole 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.4
Client_AssociationID staAssociationID 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.5
Client_ESSID staAccessPointESSID 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.6
Client_SNR staSignalToNoiseRatio 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.7
Client_TxRate staTransmitRate 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.8
Client_RxRate staReceiveRate 1.3.6.1.4.1.14823.2.2.1.1.2.2.1.9
Client_TotalPacketsTx staTxPackets 1.3.6.1.4.1.14823.2.2.1.1.2.3.1.1
Client_TotalBytesTx staTxBytes 1.3.6.1.4.1.14823.2.2.1.1.2.3.1.2
Client_TotalPacketsRx staRxPackets 1.3.6.1.4.1.14823.2.2.1.1.2.3.1.3
Client_TotalBytesRx staRxBytes 1.3.6.1.4.1.14823.2.2.1.1.2.3.1.4
SSID apESSID 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.2
IPAddress apIpAddress 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.5
RadioType apPhyType 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.6
Type apType 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.7
CurrentChannel apCurrentChannel 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.8
TotalTime apTotalTime 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.10
InactiveTime apInactiveTime 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.11
Noise apChannelNoise 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.13
SNR apSignalToNoiseRatio 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.14
TxRate apTransmitRate 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.15
RxRate apReceiveRate 1.3.6.1.4.1.14823.2.2.1.1.3.3.1.16
TotalPacketsTx apBSSTxPackets 1.3.6.1.4.1.14823.2.2.1.1.3.5.1.8
TotalBytesTx apBSSTxBytes 1.3.6.1.4.1.14823.2.2.1.1.3.5.1.9
TotalPacketsRx apBSSRxPackets 1.3.6.1.4.1.14823.2.2.1.1.3.5.1.10
TotalBytesRx apBSSRxBytes 1.3.6.1.4.1.14823.2.2.1.1.3.5.1.11
Client_IPAddress nUserExtVPNAddress 1.3.6.1.4.1.14823.2.2.1.4.1.2.1.9
Clients wlanAPBssidNumAssociatedStations 1.3.6.1.4.1.14823.2.2.1.5.2.1.7.1.12
Rogue_PhyType monAPInfoPhyType 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.1
Rogue_CurrentChannel monAPInfoCurrentChannel 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.2
Rogue_Classification monAPInfoClassification 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.3
Rogue_SSID monAPInfoESSID 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.4
Rogue_SignalStrength monAPInfoRSSI 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.5
Rogue_Status monAPInfoStatus 1.3.6.1.4.1.14823.2.2.1.6.7.1.1.1.10

Membaca MIB id SNMP menggunakan Python


SNMP (Simple Network Management Protocol)  adalah protokol populer untuk menjalankan fungsi network manajemen. SNMP digunakan untuk mengumpulkan informasi dan mengkonfigurasi  peralatan jaringan, seperti router, server, printer, hub, switch, wireless controller pada jaringan berbasis Internet Protocol (IP). SNMP dapat mengumpulkan informasi kondisi CPU, temperatur, memory, traffic, chasis, etc.  Salah satu bagian penting dari SNMP adalah MIB (Management Information Base), merupakan satu set koleksi informasi yang diorganisasi dalam bentuk hirarki. Sebuah file MIB adalah sebuah teks file dalam format ASN.1 yang merepresentasikan struktur hirarki dari informasi yang dapat diperoleh dari sebuah aplikasi atau sistem.

Managed object atau MIB object adalah sebuah atau beberapa karakteristik pada suatu managed device misalnya beban CPU, besar memory yang digunakan. MIB pada dasarnya merupakan hirarki dari managed object. Object identifier atau Object ID (OID) digunakan sebagai indentifikasi yang unik untuk setiap managed object yang ada dalam hirarki MIB. OID dapat direprensentasikan dalam sebuah nama misalnya .iso.org.dod.internet.mgmt.mib-2.interfaces.ifnumber atau nomor yang disebut sebagai object descriptor, misalnya .1.3.6.1.2.1.2.1

Sebuah managed object sebagai contoh ifnumber (number of interface) adalah sebuah ide abstrak, sedangkan representasi real dari informasi itu disebut dengan “instance” yang memiliki nilai dari object tersebut. Misalnya instance dari ifnumber adalah ifnumber.0 yang memiliki nilai 3 yang berarti sistem memiliki 3 network interface. Untuk mendapatkan nilai instance tersebut, NMS harus meminta informasi dengan mendefinisikan OID yaitu .1.3.6.1.2.1.2.1.0 (OID dari object ifnumber dengan ditambahkan .0 dibelakangnya). http://ejlp.blogspot.com/2008/10/snmp-bagian-3.html

Python sebagai salah satu bahasa pemrograman yang handal telah menyediakan library untuk membaca nilai MIB dari suatu manage device, kita akan coba bereksperimen bagaimana python membaca nilai OID dari suatu interface device kemudian menyimpan data traffik interface tadi kedalam database lalu memunculkannya dalam bentuk grafis.

Langkah pertama pastikan library snmp sudah terinstall dengan baik pada server monitoring

root@radius:/home/gigih# apt-get install snmp*
Reading package lists... Done
Building dependency tree
Reading state information... Done
libsnmp-python is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 26 not upgraded.
root@radius:/home/gigih#

Langkah kedua identifikasi hirarki MIB yang ada pada sebuah device menggunakan query snmpwalk

root@radius:/home/gigih# /usr/bin/snmpwalk -v2c -c CommunityString 103.3.xxx.xxx | more
iso.3.6.1.2.1.1.1.0 = STRING: "XXX"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.14988.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (19494100) 2 days, 6:09:01.00
iso.3.6.1.2.1.1.4.0 = STRING: "noc@unila.ac.id"
iso.3.6.1.2.1.1.5.0 = STRING: "ASXXX"
iso.3.6.1.2.1.1.6.0 = STRING: "BBS Unilanet"
iso.3.6.1.2.1.1.7.0 = INTEGER: 78
iso.3.6.1.2.1.2.1.0 = INTEGER: 4
iso.3.6.1.2.1.2.2.1.1.13 = INTEGER: 13
iso.3.6.1.2.1.2.2.1.1.14 = INTEGER: 14
iso.3.6.1.2.1.2.2.1.1.15 = INTEGER: 15
iso.3.6.1.2.1.2.2.1.1.16 = INTEGER: 16
iso.3.6.1.2.1.2.2.1.2.13 = STRING: "ether2"
iso.3.6.1.2.1.2.2.1.2.14 = STRING: "ASBR-254"
iso.3.6.1.2.1.2.2.1.2.15 = STRING: "p2p-Internasional"
iso.3.6.1.2.1.2.2.1.2.16 = STRING: "p2p-Domestik"
iso.3.6.1.2.1.2.2.1.4.13 = INTEGER: 1500

Setelah hierarki MIB dapat terbaca sempurna, sekarang coba ambil nilai ID dari Interface lalu baca nilai Inoctet yang akan kita monitor life traffik nya

root@radius:/home/gigih# /usr/bin/snmpwalk -v2c -c  CommunityString  103.3.xxx.xxx IF-MIB::ifInOctets.15
IF-MIB::ifInOctets.15 = Counter32: 1167579839
root@radius:/home/gigih#

Nilai InOctet yang didapat harus dikonversi untuk mendapatkan nilai utilisasi dalam bentuk bit, saya ambil referensi kalkulasi nilai snmp dari url berikut http://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/8141-calculate-bandwidth-snmp.html

How you calculate use depends on how data is presented for what you want to measure. Interface use is the primary measure used for network use. Use this formulas, based on whether the connection you measure is half-duplex or full-duplex. Shared LAN connections tend to be half-duplex, mainly because contention detection requires that a device listen before it transmits. WAN connections are full-duplex because the connection is point-to-point; both devices can transmit and receive at the same time because they know there is only one other device that shares the connection. Because MIB-II variables are stored as counters, you must take two poll cycles and figure the difference between the two (hence, the delta used in the equation).

This explains the variables used in the formulas:

calculate_bandwidth_snmp.gif

Note: ifSpeed does not accurately reflect the speed of a WAN interface.

For half-duplex media, use this formula for interface use:

calculate_bandwidth_snmp1.gif

Langkah terakhir adalah membuat script python  untuk mendapatkan nilai InOctet dan OutOctet lalu mengkonversi ke dalam bit dan menyimpannya kedalam database.

#Script by Gigih Forda Nama, dibuat malam selasa tanggal 10-03-2014 pukul 23:50 WIB
import time
import datetime
now = datetime.datetime.now()
jam= now.strftime("%Y-%m-%d %H:%M")
import MySQLdb
import os
in1 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifInOctets.15").read()
out1 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifOutOctets.15").read()
hin=abs(int(in1))
hout = abs(int(out1))
time.sleep (1)
in2 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifInOctets.15").read()
out2 = os.popen("/usr/bin/snmpget -Ov -OQ -v2c -c Community 103.3.xxx.xxx IF-MIB::ifOutOctets.15").read()
hin2=int(in2) 
hout2=int(out2)
deltain = abs(hin2-hin) #Diset balikan nilai absolute, karena terkadang ada balikan nilai minus
deltaout = abs(hout2-hout) #Diset balikan nilai absolute, karena terkadang ada balikan nilai minus
bitout = deltaout * 8
mbout = bitout/1000000
bitin = deltain * 8
mbin = bitin/1000000
if mbout < 220:
     hmbout = mbout
if mbin < 220:
     hmbin = mbin
print hmbin, hmbout
conn = MySQLdb.connect(host= "localhost",
     user="root",
     passwd="SukaSukaSaja",
     db="snmp")
x = conn.cursor()
try:
x.execute("""INSERT INTO user_bwintl VALUES (%s,%s,%s)""",(now,hmbin,hmbout))
conn.commit()
except:
conn.rollback()
conn.close()

Setelah data berhasil direkam dan masuk database selanjutnya membuat script program plotting gambar dari database;

##By-Gigih-F
import matplotlib
matplotlib.use('Agg')
import Image
import MySQLdb as mdb
import sys
import matplotlib.pyplot as plt
import datetime
now = datetime.datetime.now()
print now
#Inisialisasi ke Database
conn = mdb.connect('localhost', 'root', 'SukaSukaSaja', 'snmp');
with conn: #Query ke Database MySQL
 cursor = conn.cursor ()
 cursor.execute ("SELECT user_bwintl.waktu, user_bwintl.in, user_bwintl.out FROM user_bwintl WHERE DATE (waktu) = DATE(NOW()) ")
 row = cursor.fetchall()
 print "RESULT:", row[0]
 waktu, ain, aout=zip(*row) #Fetching setiap row
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5,10.5)
ax = plt.subplot(111)
plt.plot(waktu, ain,marker='+',linestyle='-',color='c',label='Total Traffick In',lw=1) #Plotting Traf In
plt.plot(waktu, aout,marker='+',linestyle='-',color='g',label='Total Trafick Out',lw=1)#Plotting Traf Out
plt.fill_between(waktu, ain,color='c',alpha=.3)#Isi warna grafik
plt.fill_between(waktu, aout,color='y',alpha=.7)#Isi warna grafik
plt.legend(loc=10)
plt.ylabel('Total Bandwidth Usage Link Internasional dalam Mbps') #Label pada sumbu Y
plt.xlabel('Waktu') #Label pada sumbu X
plt.grid()
plt.title(' Bandwidth Usage Link Internasional tgl : [%s] (Credit to RaspberryPi+Python+MySQL)'%(now)) #Judul Grafik
plt.savefig('/home/gigih/python/belajar/bwintl.png', dpi=100) #Simpan file dengan judul xxx.png
Image.open('/home/gigih/python/belajar/bwintl.png').save('/home/gigih/python/belajar/bwintl.jpg','JPEG')

Dan hasilnya adalah sebagai berikut

bwintl

lebih lengkapnya dapat dilihat di url berikut, untuk pelaporan live http://noc.unila.ac.id/?page_id=2

Note:

Great Thanks to Bunda Rasya atas inspirasi pemilihan warna grafik

Great Thanks to my beloved son Ahmad Rasya Algifarda yang udah pinjemin meja mainannya :-D

Gelar All England 2014


Meskipun saya tidak nonton secara langsung perhelatan Allengland pasangan Tontowi/Liliyana vs Hiroyuki Endo/Kenichi Hayakawa   dan Hendra Setiawan/Mohammad Ahsan vs Zhao Yunlei/Zhang,  sebagai warga Indonesia sangat bangga atas torehan gelar juara yg sudah mereka raih, semoga dapat diikuti oleh cabang cabang olahraga lainnya.

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: