Oleh Dr. Volker Ziemann, LG#166. Bahasa Indonesia oleh Triyan W. Nugroho.
Koneksi DSL di rumah saya terhubung melalui dapur, dan didistribusikan menggunakan router wireless. Namun sejauh ini saya tidak bisa mendengarkan radio Internet di dapur. Tentunya kita bisa menggunakan peralatan radio Internet komersial, namun untuk apa saya membelinya? Saya bisa membeli sebuah router wireless berbasis Linux yang dilengkapi dengan USB, menghubungkannya dengan sound card USB, dan kemudian membuatnya bekerja secara user-friendly, sehingga semua anggota keluarga bisa menggunakannya. Supaya pekerjaan ini menjadi lebih mudah, saya berusaha menghindari modifikasi hardware dan instalasi paket software yang besar seperti perl di router ini. Hampir keseluruhan pemrograman dilakukan dengan skrip shell.
Sebelum memulai, ingat bahwa mendengarkan radio Internet pada 128 kbit/s selama periode waktu 24 jam membutuhkan trafik 1.4 GB. Anda perlu memperhatikan hal ini jika akses Internet yang Anda gunakan dibatasi oleh volume.
Perangkat Keras
Saya membeli router ASUS WL-500g Premium versi terakhir, dengan dua konektor USB2 di bagian belakang. Router lain mungkin bisa bekerja jika disertai dengan setidaknya satu port USB dan jika firmwarenya bisa diganti dengan sistem operasi berbasis Linux yang juga mendukung USB. Saya memilih OpenWRT [1] yang merupakan turunan Debian untuk perangkat embedded dan mendukung banyak peralatan, termasuk sound card USB yang saya miliki. Untuk mendengarkan musik, saya menghubungkan keluaran sound card ke speaker aktif. Headphone standar juga bisa Anda gunakan.
Perangkat Lunak
Untuk menginstal sistem operasi ke dalam router, saya mengikuti instruksi untuk OpenWRT 8.09.1 (Kamikaze) [2] dan melakukan flash ulang firmware pada router. Setelah itu saya bisa langsung melakukan login ke router. Setelah diflash ulang, router mendapatkan alamat IP default 192.168.1.1, sehingga kita bisa langsung menghubungkan satu komputer ke salah satu port LAN pada router.
Secara default, router memiliki server DHCP yang telah aktif, sehingga setiap komputer yang meminta IP melalui DHCP bisa langsung terkoneksi. Saya menggunakan telnet untuk login ke router sebagai pengguna ‘root’. Tidak diperlukan password selama password root tidak diset dengan menggunakan perintah ‘passwd’. Jika password telah diset, kita harus menggunakan SSH untuk mengakses shell.
Untuk testing dan pengembangan, saya lebih suka menggunakan akses shell, namun tugas-tugas administratif standar seperti mengatur setting jaringan atau menginstal software tambahan dapat dilakukan dengan lebih mudah menggunakan antarmuka berbasis web LuCI. Aplikasi ini bisa diakses melalui web browser dengan alamat 192.168.1.1.
Kita harus login sebagai root dengan password yang telah kita tentukan. Sekarang kita bisa mengubah semua setting router dan menginstal driver dan software tambahan melalui LuCI. Untuk mendapatkan akses penuh menuju fitur-fitur konfigurasi, pilih mode ‘Administrator’ yang ada di kanan atas antarmuka LuCI.
Sebelum kita bisa menginstal software tambahan, kita harus menghubungkan router ke Internet. Hal ini mudah karena port WAN pada router telah dikonfigurasi secara default untuk mengirimkan permintaan IP dari perangkat apapun yang terhubung ke port tersebut. Saya menghubungkan port WAN pada router ASUS ke salah satu port LAN pada router DSL di dapur. Dengan demikian, router ASUS telah memiliki akses ke Internet, dan bisa menghubungi repositori software di Internet.
Instalasi OpenWRT tidak mendukung perangkat USB, sehingga kita harus menginstal driver untuk mengaktifkan perangkat USB. Pada antarmuka LuCI, halaman instalasi software bisa ditemukan di bawah tab ‘System/Software’.
Pertama, lakukan update daftar paket dengan memilih link di bagian kiri atas pada halaman Software. Halaman ini akan menampilkan daftar paket yang tersedia. Installah paket dengan mencontreng software yang diinginkan, dan tekan tombol ‘Perform Actions’.
Untuk memory stick USB, saya mengikuti referensi [3] dan menginstal modul kernel kmod-usb-uhci, kmod-usb-ohci, kmod-usb2 untuk mendapatkan dukungan USB1 dan USB2. Karena kebanyakan memory stick menggunakan filesystem FAT, saya juga menginstal kmod-fs-vfat. Ketika menginstal melalui antarmuka LuCI, semua modul yang berhubungan akan langsung dimuat secara otomatis, sehingga kita tidak perlu lagi menggunakan perintah insmod. Modul kernel yang dibutuhkan untuk sound card adalah kmod-usb-audio, seperti yang dijelaskan di referensi [4]. Saya juga menginstall paket player MP3 madplay. Untuk proses debugging, saya menggunakan usbutils yang berisi perintah lsusb.
Setelah menginstal paket yang dibutuhkan, saya kemudian melakukan login ke router melalui ssh untuk mendapatkan tampilan shell, dan mengikuti referensi [4] untuk menjalankan stasiun radio Internet dari shell dengan perintah:
wget -q -O - http://94.23.29.150:11022 | madplay -
Pada perintah di atas, wget mengambil radio stream mp3 dari alamat http://94.23.29.150:11022 dan melakukan pipe ke standard output, yang kemudian diterima oleh madplay dan menggunakan /dev/dsp sebagai output default, sehingga suara akan muncul di speaker. Inilah dasar dari Internet radio player.
Melakukan login ke router untuk menjalankan perintah tersebut bukanlah hal yang nyaman bagi pengguna umum. Namun, hanya tersedia satu tombol saja pada router, sehingga sulit untuk membangun antarmuka pengguna tanpa akses langsung ke komputer. Lebih jauh, saya akan menjelaskan antarmuka yang saya tulis untuk router radio Internet ini.
Untuk menemukan alamat stasiun radio Internet, saya biasa memilih melalui http://www.shoutcast.com/ dan menjalankannya di XMMS pada komputer desktop. Pada XMMS, pilih ‘view file info’ pada menu file (atau tekan CTRL-3) untuk menampilkan alamat stasiun radio tersebut.
Tampilan Antarmuka
Saya harus bisa memanfaatkan secara optimal satu-satunya tombol yang ada, sehingga saya harus memikirkan fungsi apa yang paling penting, dan seberapa sering suatu aktivitas terjadi. Sebagai contoh, menyalakan atau mematikan radio, atau berpindah antar stasiun radio, akan sering terjadi dan harus dapat dilakukan tanpa memerlukan komputer tambahan, hanya dengan memanfaatkan satu-satunya tombol yang tersedia. Konsekuensinya, saya harus memrogram tombol ini supaya bisa berpindah antar lima stasiun radio yang sudah ditentukan sebelumnya, dan ‘OFF’ sebagai kondisi terakhir. Perpindahan stasiun radio ditunjukkan dengan adanya suara yang menampilkan nomor channel, yang dimainkan sebelum perpindahan stasiun radio.
Perubahan stasiun radio pada suatu channel akan jarang dilakukan, dan untuk melakukan itu kita akan memanfaatkan Web server, termasuk fasilitas cgi-bin yang tersedia pada router yang juga digunakan oleh antarmuka LuCI.
Kita mulai dengan pemrograman tombol. Sebenarnya ada dua tombol di belakang router: satu tombol biasa berwarna merah, bertuliskan ‘EzSetup’, dan satu lagi tombol kecil bertuliskan ‘Restore’, untuk menekannya kita membutuhkan pensil atau pena. Oleh karena itu saya hanya akan memanfaatkan tombol ‘EzSetup’.
Ternyata pemrograman dapat dilakukan dengan mudah. Semua aktivitas berikut ini dilakukan melalui ssh pada router dengan memanfaatkan editor vi yang terinstal di dalamnya. Tombol ini ditrigger secara asinkron ke aktivitas router yang lain, dan berada di bawah kendali daemon ‘hotplug’ dengan file konfigurasi berada di /etc/hotplug.d/. Di dalam direktori ini, kita harus membuat subdirektori /etc/hotplug.d/button/, dan di subdirektori ini, kita membuat skrip handler yang dieksekusi ketika tombol ditekan. Fungsionalitas ini juga digunakan untuk menghidupkan dan mematikan jaringan wireless, seperti yang dijelaskan pada referensi [5] dan [6]. Informasi spesifik mengenai router ASUS dapat ditemukan pada referensi [2].
Sistem harus mengetahui keberadaan skrip ini. Semua informasi konfigurasi disimpan di dalam subdirektori /etc/config/, dimana saya membuat sebuah file radio untuk menyimpan semua informasi yang dibutuhkan. Berikut ini isi dari file radio :
# file: /etc/config/radio config 'radio' option 'button' 'ses' option 'state' '0' option 'ch1' 'http://216.155.137.150:10000' option 'ch2' 'http://scfire-dtc-aa07.stream.aol.com:80/stream/1075' option 'ch3' 'http://scfire-mtc-aa04.stream.aol.com:80/stream/1006' option 'ch4' 'http://94.23.17.224:8396' option 'ch5' 'http://94.23.29.150:11022'
Baris pertama yang tidak diberi tanda komentar (#) menunjukkan nama parameter — di sini radio, yang diikuti dengan suatu option. Option yang paling penting adalah tombol ses. Saya juga menambahkan suatu state, yang digunakan untuk menyimpan stasiun radio yang sedang kita dengarkan, sekaligus menentukan stasiun radio berikutnya. Parameter yang bernama chX menyimpan alamat stasiun radio. Pada command line atau skrip, parameter tersebut dapat dibaca dengan menggunakan perintah ‘uci’ dalam bentuk perintah uci get radio.@radio[0].state dan penulisan dilakukan dengan uci set radio.@radio[0].state=3 . Parameter yang lain dapat diubah dengan cara yang sama. Program ‘uci’ adalah antarmuka OpenWRT untuk mengakses parameter konfigurasi. Program ini akan memanipulasi salinan parameter hanya di dalam memori. Parameter ini dapat ditulis ke dalam file konfigurasi dengan menggunakan perintah uci commit radio . Fitur ini akan kita gunakan untuk mengganti stasiun radio pada suatu channel.
Kita sekarang akan mendiskusikan aksi yang akan dilakukan ketika tombol ditekan. Konfigurasinya disimpan pada file /etc/hotplug.d/button/handler. Salah satu bagian file ini ditunjukkan di sini:
#!/bin/sh # file: /etc/hotplug.d/button/handler # logger button handler: $BUTTON $ACTION $SEEN STATE=$(uci get radio.@radio[0].state) CH1=$(uci get radio.@radio[0].ch1) CH2=$(uci get radio.@radio[0].ch2) CH3=$(uci get radio.@radio[0].ch3) CH4=$(uci get radio.@radio[0].ch4) CH5=$(uci get radio.@radio[0].ch5) if [ $BUTTON = "ses" ] then if [ $ACTION = "released" ] then killall wget if [ $SEEN -gt "0" ] then STATE=-1 fi case $STATE in 0 ) madplay /root/radio/ch1.mp3 wget -q -O - $CH1 |\ madplay - & uci set radio.@radio[0].state=1 ;; 1 ) madplay /root/radio/ch2.mp3 wget -q -O - $CH2 |\ madplay - & uci set radio.@radio[0].state=2 ;; * ) uci set radio.@radio[0].state=0 madplay /root/radio/off.mp3 ;; esac fi fi
Anda bisa mendapatkan salinan lengkap file ini di sini.
Menekan tombol akan mentrigger eksekusi file ini. Sistem juga menyediakan tiga variabel $BUTTON, $ACTION, dan $SEEN pada saat runtime. Variabel $BUTTON bisa memiliki nilai ses atau reset, bergantung pada apakah kita telah menekan tombol EzSetup atau tombol yang satunya. Variabel $ACTION bisa memiliki nilai ‘pressed’ atau ‘released’, bergantung pada apa yang terjadi pada tombol tersebut. Variabel $SEEN berisi nilai detik sejak penekanan tombol yang terakhir. Kita akan menggunakan ini untuk membedakan penekanan tombol secara pendek atau panjang. Variabel tersebut memiliki peran penting pada skrip yang akan kita bahas berikut ini.
Di bagian atas skrip handler variable state akan dibaca, yang menyimpan stasiun radio. Alamat stasiun radio juga akan disimpan ke variabel CHX. Kemudian, kita akan memeriksa apakah tombol EzSetup yang bernama ’ses’ telah diaktifkan. Bagian berikut hanya akan dijalankan jika tombol selesai ditekan. Jika kita tidak memeriksa apakah tombol ditekan atau dilepas, maka skrip akan dijalankan dua kali. Dengan memeriksa kondisi ‘release’, kita bisa membedakan penekanan tombol secara pendek dan panjang, karena variabel $SEEN akan direset kembali ke nol setelah keadaan tersebut. Di dalam statement if, kita melakukan kill semua proses wget yang ada, karena kita hanya bisa mendengarkan satu siaran radio dalam satu waktu.
Proses madplay juga akan mati, karena proses induknya telah mati. Kita kemudian memeriksa variabel $SEEN, dan mengeset variabel $STATE dengan nilai yang akan menyebabkan statement case berikut ini akan mencapai state yang akan mematikan radio. Statement case itu sendiri digunakan untuk berpindah antar stasiun radio. Jika state bernilai ‘0′, maka radio ‘1′ akan dijalankan, dan seterusnya.
Pada setiap section case, sebuah file mp3 akan dijalankan untuk menunjukkan stasiun yang dipilih. Pada komputer desktop, saya merekam suara saya sendiri mengatakan ‘Channel satu’, dan menyimpannya sebagai file ch1.mp3 dan menyalinnya menggunakan ’scp’ ke router. File ini dimainkan hanya untuk menunjukkan stasiun radio yang dipilih. Hal ini diikuti dengan wget yang di-pipe ke madplay, seperti yang telah kita diskusikan di atas, dan nilai dari variabel state akan bertambah satu. Saya menyediakan lima stasiun radio yang dapat dipilih, dan pada pilihan ke enam, radio akan dimatikan.
Untuk mengubah stasiun radio yang telah kita tentukan pada tiap-tiap channel, kita harus melakukan login ke router dan mengedit file konfigurasi secara manual. Kita akan menyederhanakan proses ini supaya lebih mudah dilakukan.
Mengubah Stasiun Radio
Router ini telah menyediakan sebuah web server untuk mendukung antarmuka konfigurasi LuCI. Semua file berada di direktori /www/, dan fungsionalitas cgi-bin juga didukung jika kita meletakkannya di direktori /www/cgi-bin/. Hal ini berarti kita bisa menggunakan web browser untuk menjalankan program pada router.
Kita harus menyediakan sebuah halaman web yang menampilkan lima stasiun radio yang kita miliki.
#!/bin/sh
# file: /www/cgi-bin/radio.cgi
echo 'HTTP/1.0 200 OK'
echo 'Server: Netscape-Communications/3.0'
echo 'Content-type: text/html'
echo
ch1=$(uci get radio.@radio[0].ch1)
ch2=$(uci get radio.@radio[0].ch2)
ch3=$(uci get radio.@radio[0].ch3)
ch4=$(uci get radio.@radio[0].ch4)
ch5=$(uci get radio.@radio[0].ch5)
header='<HTML><HEAD><TITLE>Radio Channels</TITLE></HEAD><BODY>
<H1 ALIGN=CENTER>Radio channel selection</H1>'
echo $header
echo '<FORM action="setchannel.sh" method="get">'
echo -n 'Channel 1: <input type="text" name="ch1" size="80" value="'
echo -n $ch1; echo '"> '
echo '<input type="submit" value="Submit">'
echo '</FORM>'
:
echo '<FORM action="setchannel.sh" method="get">'
echo -n 'Channel 5: <input type="text" name="ch5" size="80" value="'
echo -n $ch5; echo '"> '
echo '<input type="submit" value="Submit">'
echo '</FORM>'
echo '<FORM action="commit.sh" method="get">'
echo '<input type="submit" value="Make persistent on Router">'
echo '</FORM>'
echo '</BODY></HTML>'
Skrip yang lengkap bisa didapatkan di sini. Skrip ini harus bersifat executable (chmod +x radio.cgi) dan diletakkan di direktori /www/cgi-bin/. Membuka halaman web 192.168.1.1/cgi-bin/radio.cgi akan menampilkan lima stasiun radio yang kita miliki, dengan masing-masing memiliki tombol ‘Submit’, seperti ditampilkan pada screenshot di bawah ini.
Idenya adalah mengubah alamat stasiun radio dan menekan tombol submit untuk mengupdate setting router. Hal ini dilayani oleh skrip radio.cgi. Karena skrip ini berada di dalam cgi-bin, maka semua keluaran dari skrip ini akan diredirect ke web browser. Di dalam skrip ini, semua keluaran ditampilkan dengan perintah echo. Baris-baris pertama skrip ini adalah header standar yang dibutuhkan oleh web browser, dan kemudian variabel chX akan diisi oleh alamat stasiun radio.
Lima baris berikutnya adalah untuk menampilkan form yang berisi field text dengan alamat stasiun radio, yang diikuti dengan tombol submit. Bagian action="setchannel.sh" menunjukkan program yang harus ada di direktori cgi-bin yang digunakan untuk menerima isi dari field text jika tombol submit ditekan. Silakan merujuk pada buku mengenai HTML atau cara kerja form HTML dan cgi-bin, misalnya referensi [7] dan [8]. Tiga bari terakhir statement FORM digunakan untuk mengeksekusi skrip commit.sh untuk membuat variabel menjadi permanen.

Yang menerima aksi dari FORM adalah skrip setchannel.sh, yang harus dijadikan berkas executable (chmod +x setchannel.sh) dan berada di /www/cgi-bin/. Isi skrip ini sebagai berikut:
#!/bin/sh
# file: /www/cgi-bin/setchannel.sh
decode(){
echo $QUERY_STRING |\
sed 's/+/ /g'| sed 's/\%0[dD]//g' |\
awk '/%/{while(match($0,/\%[0-9a-fA-F][0-9a-fA-F]/))\
{$0=substr($0,1,RSTART-1)sprintf("%c",0+("0x"substr(\
$0,RSTART+1,2)))substr($0,RSTART+3);}}{print}'
}
TMP=$( decode )
CHAN=${TMP%=http*}
URL=${TMP:4}
uci set radio.@radio[0].$CHAN=$URL
echo "Setting Channel $CHAN to station $URL"
Anda bisa mendapatkan skrip ini di sini. Saya mengadaptasi skrip ini dari referensi [9] untuk melakukan decode QUERY_STRING dan menambahkan sedikit skrip shell untuk mengekstrak channel dan URL. Perintah ‘uci set’ digunakan untuk mengatur variabel pada router. Pengaturan variabel ini hanya dilakukan pada memori. Untuk menjadikannya permanen, kita harus mengeksekusi perintah ‘uci commit radio’ dengan menggunakan skrip commit.sh berikut ini.
#!/bin/sh
# file: /www/cgi-bin/commit.sh
uci set radio.@radio[0].state=0
uci commit radio
echo 'Channel selection made permanent on Router'
Skrip ini hanya melakukan inisialisasi variabel state ke nilai awal nol, dan mengeksekusi skrip commit dan menampilkan hasilnya ke web browser.
Dengan menggunakan antarmuka yang ada, dimungkinkan untuk mengubah alamat stasiun radio yang diinginkan, dan menjadikan perubahan ini permanen. Memilih satu dari lima stasiun radio yang tersedia, atau mematikan radio, dapat dilakukan dengan mudah dengan menggunakan satu tombol yang tersedia.
Penutup
Router dengan konektivitas USB adalah peralatan yang sangat bagus untuk melakukan aktivitas yang lebih jauh. Sebagai contoh, kita bisa memanfaatkan dongle Bluetooth (lihat referensi [10]), dan menggunakan telepon seluler yang memiliki fasilitas Bluetooth untuk memilih stasiun radio yang diinginkan. Saya telah mendiskusikan hal ini pada referensi [11]. Menambahkan fitur Internet radio pada antarmuka LuCI juga bisa kita lakukan dengan sedikit pemrograman.
Referensi
[1] http://www.openwrt.org
[2] OpenWrtDocs/Hardware/Asus/WL500GP di halaman http://oldwiki.openwrt.org/TitleIndex.html
[3] http://oldwiki.openwrt.org/UsbStorageHowto.html
[4] http://oldwiki.openwrt.org/UsbAudioHowto.html
[5] OpenWrtDocs/Customizing/Software/WifiToggle di halaman http://oldwiki.openwrt.org/TitleIndex.html
[6] https://forum.openwrt.org/viewtopic.php?id=11565
[7] R. Darnell, et al., HTML4 Unleashed, SAMS Publishing, 1999.
[8] http://de.selfhtml.org/ (bahasa Jerman)
[9] http://do.homeunix.org/UrlDecoding.html
[10] https://forum.openwrt.org/viewtopic.php?id=1650
[11] Desktop Bluetooth Remote, Linux Gazette 153, Agustus 2008. (Bahasa Indonesia di http://linuxgazette.ailabs.web.id/lg/remote-control-menggunakan-bluetooth/)