2016-07-18 2 views
0

У меня есть функция, которая должна связываться с сервером флэков и получать последнее состояние кнопок gpio, чтобы свойство цвета кнопок можно синхронизировать со всеми клиентами. На рабочем столе хром функция работает отлично, но на малиновом pi chromium-браузере функция даже не вызывается клиентом.

код HTML:

<div id="centerArea"> 
        <div id="temperatureBox"> 
         <div id="temperature"> 
          <div id="temperatureValue"></div>&deg <sup>C</sup> 
         </div> 
         <div id="humidity"> 
          Humidity: &nbsp;<div id="humidityValue"></div>% 
         </div> 
        </div> 
       </div> 

<div id="buttonsBar"> 
        <div id="buttons"> 
         <button type="submit" value="Button1" class="sync" id="B1" name="B1" onclick="b1(); return false;">Button1</button> 
        </div> 
        <div id="buttons"> 
         <button type="submit" value="Button2" class="sync" id="B2" name="B2" onclick="b2(); return false;">Button2</button> 
        </div> 
        <div id="buttons"> 
         <button type="submit" value="Button3" class="sync" id="B3" name="B3" onclick="b3(); return false;">Button3</button> 
        </div> 
        <div id="buttons"> 
         <button type="submit" value="Button4" class="sync" id="B4" name="B4" onclick="b4(); return false;">Button4</button> 
        </div> 
       </div> 

код Колба:

@app.route('/dhtTemp', methods=['GET','POST']) 
def readTemperature(): 
    #sleep(3) 
    dht22.trigger() 
    temperature = str('%.2f' % (dht22.temperature())) 
    return (temperature) 

@app.route('/dhtHum', methods=['GET','POST']) 
def readHumidity(): 
    #sleep(3) 
    dht22.trigger() 
    humidity = str('%.2f' % (dht22.humidity())) 
    return (humidity) 

@app.route('/B1status', methods=['GET','POST']) 
def readBStatus(): 
    b1status = str(gpio.input(relayPins[0])) 
    #b3status = str(gpio.input(relayPins[2])) 
    #b4status = str(gpio.input(relayPins[3])) 
    return (b1status) 

@app.route('/B2status', methods=['GET','POST']) 
def readB2Status(): 
    b2status = str(gpio.input(relayPins[1])) 
    return (b2status) 

Javascript Код:

function get_temps(){ 
$.getJSON("dhtTemp", 
    function(temperature){ 
     $('#temperatureValue').text(temperature) 

    } 
); 
$.getJSON("dhtHum", 
    function(data){ 
     $('#humidityValue').text(" " + data) 
    } 
); 
} 

function get_Bstatus(){ 
      function get_B1status(){ 
       $.getJSON("B1status", 
        function(b1status){ 
         if (b1status == "1"){ 
          document.getElementById("B1").style.borderColor = "red"; 
         } 
         else{ 
          document.getElementById("B1").style.borderColor = "green"; 
         } 
        } 
       ); 
      } 
      function get_B2status(){ 
       $.getJSON("B2status", 
        function(b2status){ 
         if (b2status == "1"){ 
          document.getElementById("B2").style.borderColor = "red"; 
         } 
         else{ 
          document.getElementById("B2").style.borderColor = "green"; 
         } 
        } 
       ); 
      } 
     } 
     setInterval('get_Bstatus()', 1000) 

достаточно удачливый код для получения температуры и влажности функционирует правильно, даже если ей также использует ту же функцию $ .get. Но сервер даже не получают никаких запросов от клиента, чтобы загрузить функцию get_Bstatus

журнала для сервера взаимодействий клиента:

192.168.1.73 - - [18/Jul/2016 15:16:49] "GET /dhtTemp HTTP/1.1" 200 - 
192.168.1.73 - - [18/Jul/2016 15:16:49] "GET /dhtHum HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:49] "GET /B1status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:49] "GET /B2status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:50] "GET /B1status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:50] "GET /B2status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:51] "GET /dhtTemp HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:51] "GET /B1status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:51] "GET /dhtHum HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:51] "GET /B2status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:52] "GET /B1status HTTP/1.1" 200 - 
192.168.1.228 - - [18/Jul/2016 15:16:52] "GET /B2status HTTP/1.1" 200 - 
192.168.1.73 - - [18/Jul/2016 15:16:53] "GET /dhtTemp HTTP/1.1" 200 - 
192.168.1.73 - - [18/Jul/2016 15:16:53] "GET /dhtHum HTTP/1.1" 200 - 

IP-адрес, оканчивающийся на 73 клиент открыт на Raspberry Pi 3 на хром-браузере, а один, заканчивающийся на 228, - клиент, открытый в Chrome на ноутбуке Windows. функции B1status и B2status никогда не вызываются клиентом на малине pi, хотя функция вызова влажности и температуры проходит без проблем.

Именно поэтому я просто не могу понять, почему именно эти две функции не работают, в то время как другие двое работают нормально.

Нет ошибок консоли в каждом из клиентов, и когда кнопка нажата на клиенте малины pi, она соответствующим образом обновляется на клиенте в системе Windows, поэтому код работает, насколько я могу судить, просто не на Chrome-браузере.

благодаря

UPDATE

Видимо я просто нужно установить интервал на функции отдельно. Как видно из ранее связанного кода javascript, функции get_b1status и get_b2status вызываются родительской функцией get_Bstatus.

код начал работать на всех клиентах, когда я отделил функции и назвал их индивидуально. Таким образом, код обновления выглядит как-то вроде этого:

counter1 = ""; 
counter2 = ""; 
counter3 = ""; 
counter4 = ""; 
function get_B1status(){ 
    $.getJSON("B1status", 
     function(b1status){ 
      if (counter1 != b1status){ 
       if (b1status == "1"){ 
        document.getElementById("B1").style.borderColor = "red"; 
        counter1 = b1status; 
       } 
       else{ 
        document.getElementById("B1").style.borderColor = "green"; 
        counter1 = b1status; 
       } 
      } 
     } 
    ); 
} 
function get_B2status(){ 
    $.getJSON("B2status", 
     function(b2status){ 
      if (counter2 != b2status){ 
       if (b2status == "1"){ 
        document.getElementById("B2").style.borderColor = "red"; 
        counter2 = b2status; 
       } 
       else{ 
        document.getElementById("B2").style.borderColor = "green"; 
        counter2 = b2status; 
       } 
      } 
     } 
    ); 
} 
function get_B3status(){ 
    $.getJSON("B3status", 
     function(b3status){ 
      if (counter3 != b3status){ 
       if (b3status == "1"){ 
        document.getElementById("B3").style.borderColor = "red"; 
        counter3 = b3status; 
       } 
       else{ 
        document.getElementById("B3").style.borderColor = "green"; 
        counter3 = b3status; 
       } 
      } 
     } 
    ); 
} 
function get_B4status(){ 
    $.getJSON("B4status", 
     function(b4status){ 
      if (counter4 != b4status){ 
       if (b4status == "1"){ 
        document.getElementById("B4").style.borderColor = "red"; 
        counter4 = b4status; 
       } 
       else{ 
        document.getElementById("B4").style.borderColor = "green"; 
        counter4= b4status; 
       } 
      } 
     } 
    ); 
} 
setInterval('get_B1status()', 1000) 
setInterval('get_B2status()', 1000) 
setInterval('get_B3status()', 1000) 
setInterval('get_B4status()', 1000) 

я даже сумел поставить в условиях, когда значение состояния кнопки хранится в переменной, а если на следующем интервале состояние не изменилось, то функция в основном ничего не спасает немного требований к обработке с сервера.

+0

Пробовали ли вы активизируете функцию непосредственно на консоли веб-браузера (F12): 'get_Bstatus();' – Hackerman

+0

также что если вместо 'setInterval ('get_Bstatus()', 1000)' вы пишете эту строку как: 'setInterval (get_Bstatus(), 1000)' – Hackerman

+0

@Hackerman я действительно пробовал то, что вы предложили, но результат, который я получал, был неопределенной функцией или что-то, поэтому я понял, что, возможно, функция даже не была вызвана, поэтому я вернулся и изменил способ, которым это было вызываемый, как показано в редакции. Спасибо хоть. Кроме того, вызов функции, не будучи помещенным в лимитировщики, на самом деле создавал проблемы для меня, я уже пробовал это раньше, так как температура и влажность функционируют так же хорошо, и это просто дало ошибку, не помню, что это было, извините. –

ответ

0

просто попробуйте извлечь() сначала установить polyfills npm i --save es6-promise isomorphic-fetch

, а затем:

require('es6-promise').polyfill(); 
require('isomorphic-fetch'); 
Смежные вопросы