Jumat, 25 November 2016

Tutorial NodeMCU: Mengendalikan ESP8266 behind firewall dengan Android (ESP8266, WeMos, NodeMCU, Lua)

Tulisan ini adalah kelanjutan dari tulisan sebelumnya tentang bagaimana mengakses board IoT yang berada dibelakang firewall yang tidak memperbolehkan port forwarding.

Agar board IoT dapat dikendalikan dari luar melalui Android, padahal IoT board berada dibelakang firewall, berarti bahwa diperlukan suatu perantara diantara kedua perangkat. Dalam hal ini saya akan menggunakan Firebase Realtime Database sebagai sarana perantara tersebut.

Gambar 1. Firebase Database sebagai perantara

Dalam hal ini IoT board akan mengambil nilai request dari database Firebase, kemudian menentukan status led builtin berdasarkan nilai request (on/off), dan selanjutnya akan mengupdate nilai response sebagai konfirmasi bahwa request telah berhasil dilakukan.

startup = true
request = false
position = "off"

database = "https://friendlychat-6ae71.firebaseio.com/"
nodeUpdate = "ledbuiltin.json"
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)
                  slash = "\\"                   
                  newposition = string.gsub(string.gsub(data,slash,""),"\"","")
                  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
Pengembangan aplikasi pada sisi Android akan menggunakan AppInventor yang berfungsi sebagai IDE yang bersifat Cloud yang memungkinkan anda melakukan pengembangan aplikasi Android tanpa menggunakan ADT.

 Gambar 2. Design Screen dan Component pada Aplikasi

Gambar 3. Block Code pada Aplikasi

Tidak ada komentar:

Posting Komentar