Kamis, 12 November 2009

Remote Control Menggunakan Bluetooth

Mengendalikan PC dengan Ponsel Bluetooth S60

Baru-baru ini saya mendapatkan sebuah ponsel Nokia E51 yang dilengkapi dengan Bluetooth. Saya juga memiliki dongle Bluetooth yang sudah tidak terpakai. Keberadaan gadget tersebut membangkitkan rasa ingin tahu, dan saya mulai berpikir apakah peralatan tersebut dapat dimanfaatkan untuk sesuatu yang berguna. Saya seringkali memberikan presentasi dengan menggunakan laptop dan beamer, dan akhirnya muncul ide bagaimana menggunakan ponsel sebagai remote control untuk mengendalikan komputer.

Ide yang pertama muncul adalah memanfaatkan ponsel sebagai mouse Bluetooth, tapi ponsel ini tidak mendukung profile HID Bluetooth yang dibutuhkan, sehingga saya memutuskan untuk menulis program aplikasi klien-server biasa. Proyek yang bekerja dengan metode yang sama adalah driver IrDA yang mengkonversi sinyal infra merah menjadi perintah-perintah komputer, namun sejauh yang saya ketahui, proyek ini hanya bisa bekerja dengan program yang mendukung remote control. Server pada PC menerima perintah dari remote, dan kemudian meneruskan perintah melalui program seperti xine-remote menuju aplikasi (dalam hal ini aplikasi xine). Apa yang saya inginkan adalah mengendalikan keseluruhan desktop, termasuk gerakan mouse, klik, dan kursor atau tombol Enter. Dengan cara ini, saya bisa mengendalikan semua aplikasi, terutama Acrobat Reader yang tidak mendukung remote control secara native. Singkatnya, saya ingin suatu aplikasi pada ponsel (sebagai klien) yang membaca penekanan tombol dan mengirimkan perintah melalui Bluetooth menuju PC, dimana aplikasi server menerima pesan tersebut dan memerintahkan mouse untuk berpindah atau melakukan klik, atau memerintahkan penekanan tombol.

Pada Sisi Ponsel

Ponsel saya menggunakan sistem operasi Symbian generasi ketiga yang umum digunakan pada smart-phone modern. Fitur yang menarik adalah ponsel ini dapat diprogram dengan Java dan Python. Pemrograman Python sangat menarik untuk pengembangan aplikasi, dengan sejumlah fungsi built-in yang powerful. Saya memulai proyek ini dengan menginstal tool PyS60 (bahasa pemrograman Python [1] dan skrip shell [2]) dari website Sourceforge PyS60. Kita akan mendapatkan lingkungan kerja Python pada ponsel, dan dapat dites dengan menjalankan salah satu program bawaan (misalnya “ball.py”). Direktori default untuk instalasi skrip Python adalah E:\Python yang berada pada memory card ponsel. Sekarang anda sudah bisa mulai menulis skrip Python, dan menyalinnya ke direktori tersebut, kemudian anda dapat menjalankannya seperti pada contoh yang disertakan saat instalasi.

Berikut adalah contoh program “hello, world”. Buatlah file hello.py dengan isi baris di bawah ini.

      print "Hi there, World"

dan mentransfernya ke ponsel dengan menggunakan paket bluez dan obex_ftp. Gunakan perintah

      obexftp -b 00:21:08:nn:nn:nn -c E:\\Python -p hello.py

dimana ”00:21:08:nn:nn:nn” adalah alamat MAC ponsel anda. (Anda bisa melihatnya dengan menekan tombol *#bta0# atau *#2820# pada ponsel Nokia.) Cara yang lain adalah dengan menghidupkan ponsel dan melakukan scan Bluetooth dengan hcitool scan pada komputer. Anda akan mendapatkan alamat MAC adapter Bluetooth ponsel anda (dan mungkin juga ponsel tetangga). Saya sarankan anda membaca referensi [4] hingga [8].

Kita telah memiliki lingkungan kerja Python dan sudah bisa melakukan transfer kode Python ke ponsel. Sekarang saatnya kita mulai menulis kode program untuk klien. Program ini akan memonitor penekanan tombol pada ponsel dan mengirimkan perintah yang sesuai ke program server. Listing program bisa didownload di sini.

Class Keyboard pada program klien disalin dari contoh program “ball.py” pada referensi [6]. Class ini merepresentasikan pemantau tombol ponsel, dan menghasilkan keluaran berupa key-code tombol yang ditekan.

Kita harus membuka koneksi Bluetooth pada server dengan perintah:

     PCBTADDR=00:21:08:nn:nn:nn
port=4
btsock = socket(AF_BT, SOCK_STREAM, BTPROTO_RFCOMM)
target = (PCBTADDR, port)
btsock.connect(target)

dimana PCBTADDR adalah alamat MAC pada adapter Bluetooth di PC. Port yang akan kita gunakan adalah port nomor 4. Untuk memastikan tidak ada servis pada ponsel yang menggunakan port tersebut, berikan perintah “sdptool browser MAC_OF_PHONE” pada PC dan periksalah nomor port. Pada baris berikutnya, socket Bluetooth btsock dibuka, dan koneksi ke server dimulai, seperti pada contoh pada referensi [9]. Kita kemudian memasuki loop yang dimulai dengan “while running“, dimana program akan menunggu beberapa saat (0.1 detik), dan memeriksa apakah ada tombol yang ditekan. Jika ada tombol yang ditekan, akan muncul teks pada layar ponsel, dan string teks yang sesuai akan dikirimkan melalui socket. Kode program pada file “remote.py” adalah sebagai berikut:

     running=1
while running:
e32.ao_sleep(0.1)
e32.ao_yield()
handle_redraw(())
if keyboard.is_down(EScancodeLeftArrow):
canvas.text((0,32),u"Left key pressed",fill=0xff0000)
btsock.send('Left')

: # many more

if keyboard.is_down(EScancodeHash):
canvas.text((0,48),u"Hash key pressed",fill=0xff0000)
btsock.send('Hash')
running=0

Nama scan-codes didokumentasikan pada pustaka PyS60 di referensi [7]. Untuk daftar kode yang lengkap, lihatlah pada file remote.py. Ingat bahwa di luar aktivitas utama yang dijelaskan di sini, terdapat pula kode untuk melakukan update user interface pada ponsel.

Hanya file inilah yang kita butuhkan pada ponsel. Salinlah file tersebut melalui obex_ftp ke subdirektori Python pada ponsel. Setelah itu kita bisa mulai membahas aplikasi server pada PC.

Pada Sisi PC

Pada sisi PC, kita membutuhkan sebuah server untuk menerima perintah yang dari ponsel dan menjalankan aksi yang sesuai. Saya menulis program ini juga dengan bahasa Python. Untuk itu saya harus menginstal Python binding untuk stack bluez yang dinamakan PyBluez dari referensi [10]. Program server ini sangatlah sederhana. Kode programnya bisa didownload di sini.

Bagian utama dari program ini adalah membuka socket:

     server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",port))
server_sock.listen(backlog)
client_sock, client_info = server_sock.accept()

Kemudian masuk ke loop runtime yang menerima paket dari ponsel dan melakukan aksi yang sesuai. Potongan kode programnya:

     running=1
while running:
data = client_sock.recv(10)
if data=='Hash': running=0
if data=='Left': os.system("xevent -r -10 0")

:

client_sock.close()
server_sock.close()

Ingat bahwa sebuah hash akan mengakhiri loop runtime, setelah mengeksekusi dua perintah terakhir yang akan menutup socket. Aksi yang dilakukan hanya ditulis sebagai string yang menjelaskan perintah Unix yang akan dilewatkan secara langsung ke sistem operasi melalui fungsi os.system(). Dengan demikian kode program ini dapat dengan mudah disesuaikan dengan keinginan programmer.

Lalu bagaimana kita mengendalikan kursor pada desktop? Fitur ini dapat dilakukan oleh program “xevent” yang dieksekusi di dalam loop runtime pada program server. Pada contoh di atas, program akan menggerakkan kursor 10 piksel ke kiri relatif dari posisinya sekarang.

Event X Window tanpa menggunakan keyboard dan mouse

Saya menulis program xevent [11] berdasarkan kode program dari referensi [12] dan pustaka sistem X Window libXtst yang berguna untuk menjalankan event X Window melalui program command line. Sebagai contoh, perintah “xevent -a 0 0” akan menggerakkan kursor mouse ke posisi absolut piksel (0,0), yaitu sudut kiri atas layar. Untuk lebih jelasnya silakan lihat kode sumber “xevent”, namun secara garis besar urutan eksekusinya adalah sebagai berikut.

Pertama, menentukan display dan screen default, serta root window. Kemudian, aksi berikutnya bergantung pada argumen command-line. Jika ditentukan pergerakan mouse relatif (-r), fungsi XTestFakeRelativeMotionEvent() akan dipanggil dengan argumen yang sesuai. Jika ditentukan pergerakan mouse absolut (-a), maka fungsi XTestFakeMotionEvent() akan dipanggil. Jika ditentukan event tombol mouse (-b), akan digunakan fungsi XTestFakeButtonEvent(), baik sebagai event tombol Down (is_down=1) atau event tombol Up (is_down=0). Aksi defaultnya adalah Down dan Up. Fungsi XTestFakeKeyEvent() juga digunakan untuk mensimulasikan event penekanan tombol, baik Down, Up, ataupun keduanya. Lihatlah halaman manual xevent yang ada pada referensi [11]. Fungsi libXtst terdapat pada file header libXtst.h.

Menghubungkan PC dengan Ponsel

Setelah file “remote.py” berada pada ponsel, program “xevent” terinstal pada PC, dan file “remote_on_pcx.py” disalin ke PC, kita bisa mulai menjalankan server dengan perintah berikut.

     python remote_on_pc.py

Perintah tersebut akan menunggu ponsel untuk melakukan koneksi. Kemudian kita jalankan program klien dengan skrip “remote.py” pada ponsel. Ponsel kemudian akan melakukan koneksi ke server. Program server pada PC akan menerima koneksi, dan layar ponsel akan berubah warna menjadi putih. Anda bisa menggunakan tombol navigasi pada ponsel untuk mengendalikan mouse pada PC, dan tombol Select sebagai klik kiri mouse. Jika anda menekannya dua kali dengan cepat, program akan menerjemahkannya sebagai klik ganda pada mouse. Fungsi masing-masing tombol dapat dilihat pada tabel di bawah ini. Anda juga bisa mengubahnya dengan mengedit program server “remote_on_pc.py”.

Program untuk klien dan server dibuat sesederhana mungkin agar mudah dipahami dan bisa dimodifikasi sesuai kebutuhan.

Tombol pada Ponsel Aksi pada PC
Select Klik kiri mouse
Left Gerakkan mouse 10 piksel ke kiri
Right Gerakkan mouse 10 piksel ke kanan
Up Gerakkan mouse 10 piksel ke atas
Down Gerakkan mouse 10 piksel ke bawah
1 Tombol Enter
2 Klik tengah mouse
3 Klik kanan mouse
4 Page Up
5 Text cursor up
6 Page Down
7 Text cursor left
8 Text cursor down
9 Text cursor right
Asterisk (*) Tombol Tab
0 Tombol Escape
Hash (#) Keluar program

Referensi

 


Free CursorsMyspace LayoutsMyspace Comments
type='text/javascript'/>