WWW.USBINOV.COMPiranti USB untuk PC, Laptop dan Raspberry Pi.

Bikin Webserver Sendiri Untuk Raspberry Pi Pakai REBOL 3

rebol3REBOL adalah bahasa pemrograman yang diciptakan oleh Carl Sassenrath, seorang arsitek sistem operasi multitasking AmigaOS yang fenomenal di masanya. REBOL dioptimasikan untuk mendukung pemrograman internet. REBOL bekerja untuk kedua sisi yakni sisi client dan sisi server.

REBOL adalah interpreter multiplatform yang tersedia untuk berbagai platform seperti Windows, Linux, MacOS, FreeBSD, Syllable, Android dan syukur alhamdulillah TGD-Consulting asal Jerman berkenan membagikan REBOL versi Linux-ARMv6 untuk Raspberry Pi. Jika Anda menggunakan Raspberry Pi 2 atau board ARMv7 lain seperti Odroid, REBOL untuk Linux-ARMv7 dapat di download dari situs AtronixEngineering.

Jika Anda ingin mengetahui lebih lanjut mengenai REBOL, Anda bisa mengunjungi halaman situs blog Teknik Elektro Links yang berjudul REBOL – Melawan Kompleksisasi dan Gendutisasi Pemrograman Masa Kini.

Instalasi REBOL 3 Untuk Raspberry Pi B/B+

  1. Download r3-RPi.tar dengan perintah:
    wget http://www.TGD-Consulting.de/REBOL/r3-RPi.tar
  2. Ekstrak dengan perintah:
    tar xvf r3-RPi.tar
  3. Jadikan executable dengan perintah:
    chmod +x r3
  4. Selesai

Instalasi REBOL 3 Untuk Raspberry Pi 2 / Odroid

  1. Download r3-armv7hf-view-linux dari Atronix Engineering dengan perintah:
    wget http://atronixengineering.com/r3/downloads/r3-armv7hf-view-linux
  2. Rename biar gak kepanjangan dengan perintah:
    mv r3-armv7hf-view-linux r3
  3. Jadikan executable dengan perintah:
    chmod +x r3
  4. Selesai

Testing REBOL 3

Untuk testing kita mulai dengan mengaktifkan interpreter REBOL dengan perintah:

./r3

r3-RPi

Selanjutnya kita bisa coba bikin HALO DUNIA dan sedikit demo string parsing

r3RPi_test

REBOL memiliki tipedata email!. Data string “chandra@teknikelektrolinks.com” hasil parsing disimpan dalam variabel alamat_email dengan perintah: alamat_email: to-email p/4. Asik, kan? :)

Tiny Static Webserver Ala REBOL 3

Testing berikutnya adalah membuat webserver sederhana. Program webserver shttpd.r yang saya tampilkan adalah buatan ABOLKA.

shttpd.r

REBOL [title: "A tiny static HTTP server" author: 'abolka date: 2009-11-04]

code-map: make map! [200 "OK" 400 "Forbidden" 404 "Not Found"]
mime-map: make map! [
    "html" "text/html" "css" "text/css" "js" "application/javascript"
    "gif" "image/gif" "jpg" "image/jpeg" "png" "image/png"
    "r" "text/plain" "r3" "text/plain" "reb" "text/plain"
]
error-template: trim/auto {
    <html><head><title>$code $text</title></head><body><h1>$text</h1>
    <p>Requested URI: <code>$uri</code></p><hr><i>shttpd.r</i> on
    <a href="http://www.rebol.com/rebol3/">REBOL 3</a> $r3</body></html>
}

error-response: func [code uri /local values] [
    values: [code (code) text (code-map/:code) uri (uri) r3 (system/version)]
    reduce [code "text/html" reword error-template compose values]
]

start-response: func [port res /local code text type body] [
    set [code type body] res
    write port ajoin ["HTTP/1.0 " code " " code-map/:code crlf]
    write port ajoin ["Content-type: " type crlf]
    write port ajoin ["Content-length: " length? body crlf]
    write port crlf
    ;; Manual chunking is only necessary because of several bugs in R3's
    ;; networking stack (mainly cc#2098 & cc#2160; in some constellations also
    ;; cc#2103). Once those are fixed, we should directly use R3's internal
    ;; chunking instead: `write port body`.
    port/locals: copy body
]

send-chunk: func [port] [
    ;; Trying to send data >32'000 bytes at once will trigger R3's internal
    ;; chunking (which is buggy, see above). So we cannot use chunks >32'000
    ;; for our manual chunking.
    unless empty? port/locals [write port take/part port/locals 32'000]
]

handle-request: func [config req /local uri type file data] [
    parse to-string req ["get " ["/ " | copy uri to " "]]
    default 'uri "index.html"
    parse uri [some [thru "."] copy ext to end (type: mime-map/:ext)]
    default 'type "application/octet-stream"
    if not exists? file: config/root/:uri [return error-response 404 uri]
    if error? try [data: read file] [return error-response 400 uri]
    reduce [200 type data]
]

awake-client: func [event /local port res] [
    port: event/port
    switch event/type [
        read [
            either find port/data to-binary join crlf crlf [
                res: handle-request port/locals/config port/data
                start-response port res
            ] [
                read port
            ]
        ]
        wrote [unless send-chunk port [close port]]
        close [close port]
    ]
]

awake-server: func [event /local client] [
    if event/type = 'accept [
        client: first event/port
        client/awake: :awake-client
        read client
    ]
]

serve: func [web-port web-root /local listen-port] [
    listen-port: open join tcp://: web-port
    listen-port/locals: construct compose/deep [config: [root: (web-root)]]
    listen-port/awake: :awake-server
    wait listen-port
]

serve 8080 system/options/path

Untuk menjalankan webserver gunakan perintah:

./r3 shttpd.r

Webserver ini melayani permintaan HTTP pada port 8080 dengan index.html sebagai file default. Untuk pengujian ini berikut saya berikan file index.html sederhana.

index.html

<html>
<head>
<title>HALO</title>
<H1>This is REBOL</H1>
</head>
<body>
<p>Halaman ini ditampilkan oleh webserver rebol.</p>
<p>Keren, kan?</p>
<table border="1" cellpadding="5">
	<tr>
		<th>AAA</th>
		<th>BBB</th>
		<th>CCC</th>
	</tr>
	<tr>
		<td>Satu</td>
		<td>Dua</td>
		<td>Tiga</td>
	</tr>
</table>

<br /><br />
<hr>
Email: raspi@teknikelektrolinks.com
</body>
</html>

Yup, sederhana saja, cuma Flat HTML. Dan berikut adalah screenshot halaman index.html yang ditampilkan pada web browser.

r3-RPi_webserver

Entah bagaimana menurut pendapat Anda, kalau menurut pendapat saya sih mantep banget. :)

shttpd.r tentu dapat kita kembangkan lebih lanjut untuk membuat berbagai aplikasi web sesuai dengan kebutuhan kita. Mudah-mudahan pada catatan eksperimen yang akan datang saya bisa memberikan contoh aplikasi web pengontrolan relay (home automation) menggunakan modul relay dari Teknik Elektro Links.

Sekian dulu catatan eksperimen kali ini. Semoga bermanfaat.

2 Comments

Add a Comment

Your email address will not be published. Required fields are marked *