Jika anda memiliki ip public, maka koneksi ke iot board anda dapat dilakukan dengan mudah yaitu dengan mengaktifkan fitur ip forwarding pada modem anda, sehingga koneksi pada port tertentu pada interface external modem anda (melalui ip public) dapat diforward ke host intranet anda pada port tertentu (default gateway dari host intranet yang menjadi target diset ke ip interface dalam modem anda)
Tetapi kondisi yang kita hadapi saat ini adalah provider tidak menyediakan ip public, sehingga kita tidak dapat mencapai iot board dari internet. Setelah melakukan pemikiran akhirnya timbul ide untuk bagaimana kita dapat mengendalikan led-builtin pada board WeMos yang berada dibelakang firewall?
Pada tulisan ini saya mencoba menggunakan firebase realtime database untuk menyimpan request ON/OFF terhadap led-builtin, secara berkala board WeMos akan melakukan query ke Firebase untuk mengambil nilai dari tag tertentu.
Langkah-langkah:
1. Aktifkan ke firebird console anda, dan dapatkan token database Secret anda.
2. Lakukan koding berikut:
startup = true2.Setelah script diatas dijalankan, maka pada database Firebase anda terbentuk node baru dengan nama ledbuiltin yang memiliki dua tag yaitu request dan response yang masing-masing bernilai awal "off"
request = false
position = "off"
-- ganti dengan url database anda
database = "https://friendlychat-6ae71.firebaseio.com/"
nodeUpdate = "ledbuiltin.json"
-- ganti dengan database secret anda
dbSecret = "kia43oq8Nn76kTJQhLIshyRpSYDHoEwjGTI*****"
urlUpdate = database .. nodeUpdate .. "?auth=" .. dbSecret
-- initial payload
payload = "{\"request\":\"".. position .. "\",\"response\":\"".. position .. "\"}"
nodeRead = "ledbuiltin/request.json"
urlRead = database .. nodeRead .. "?auth=" .. dbSecret
function updateToFirebase()
if not request then --sentinel
request = true
http.request(urlUpdate,
"PATCH",
"Content-Type: application/json\r\n",
payload,
function(code, data)
if (code ~= 200) then
print("Failed : HTTP error code : " .. code)
request = false
else
-- stop alarm, mission succeed
tmr.stop(0)
print("Succeed : " .. code, data)
startup = false
request = false
end
end)
end
end
function led_builtin(position)
gpio.mode(4, gpio.OUTPUT)
if (position == "on") then
gpio.write(4, gpio.LOW) -- LED BUILTIN ON
else
gpio.write(4, gpio.HIGH) -- LED BUILTIN ON
end
end
function readfromFirebase()
if not startup then -- sentinel
if not request then -- sentinel
request = true
http.request(urlRead,
"GET",
"Content-Type: application/json\r\n",
nil,
function(code, data)
if (code ~= 200) then
print("Failed : HTTP error code : " .. code)
request = false
else
print("Succeed : " .. code, data)
newposition = string.gsub(data,"\"","")
if position ~= newposition then
position = newposition
--update response payload
payload = "{\"response\":\"".. position .. "\"}"
led_builtin(position)
tmr.alarm(0,2000,1,updateToFirebase) -- dua detik berikutnya update status
end
request = false
end
end)
end
end
end
tmr.alarm(0,2000,1,updateToFirebase)
tmr.alarm(1,4000,1,readfromFirebase) -- setiap 4 detik
Gambar 1. Hasil initialisasi nilai awal
3. Ubah nilai tag request dari "off" menjadi "on"
Gambar 2. Hasil perubahan nilai request menjadi "off"
4. Led builtin pada board akan hidup, dan tag response akan diset menjadi "on"
Gambar 3. Hasil respon dari board.
Adapun penjelasan pada koding diatas adalah pada awalnya akan diinitialisasi nilai awal untuk node ledbuiltin pada Firebase dengan tag request dan response ke "off", selanjutnya secara berkala (4 detik sekali) dan dilakukan pemantauan terhadap nilai request dengan menggunakan metode REST yang disediakan oleh firebase. Jika nilai request berbeda dengan nilai pembacaan sebelumnya, maka akan dilanjutkan dengan mengatur led-builtin pada board sesuai dengan nilai pembacaan terbaru. Setelah status led-builtin disesuaikan, maka selanjutnya dalah mengupdate status respon sesuai dengan status led-builtin.
Keyword: behind the firewall, without using public ip address, and not using port forwarding
Tidak ada komentar:
Posting Komentar