Selasa, 22 November 2016

Tutorial NodeMCU: Mengendalikan ESP8266 dibelakang Firewall (ESP8266, WeMos, Lua)

Tulisan ini saya buat setelah menyadari bahwa provider saya tidak menyediakan ip public pada interface luar modem saya, sehingga saya tidak dapat mengendalikan iot board saya melalui internet (selama ini uji coba dilakukan secara intranet)

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 = true
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
2.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"


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