У меня есть функция, которая должна связываться с сервером флэков и получать последнее состояние кнопок gpio, чтобы свойство цвета кнопок можно синхронизировать со всеми клиентами. На рабочем столе хром функция работает отлично, но на малиновом pi chromium-браузере функция даже не вызывается клиентом.
код HTML:
<div id="centerArea">
<div id="temperatureBox">
<div id="temperature">
<div id="temperatureValue"></div>° <sup>C</sup>
</div>
<div id="humidity">
Humidity: <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)
я даже сумел поставить в условиях, когда значение состояния кнопки хранится в переменной, а если на следующем интервале состояние не изменилось, то функция в основном ничего не спасает немного требований к обработке с сервера.
Пробовали ли вы активизируете функцию непосредственно на консоли веб-браузера (F12): 'get_Bstatus();' – Hackerman
также что если вместо 'setInterval ('get_Bstatus()', 1000)' вы пишете эту строку как: 'setInterval (get_Bstatus(), 1000)' – Hackerman
@Hackerman я действительно пробовал то, что вы предложили, но результат, который я получал, был неопределенной функцией или что-то, поэтому я понял, что, возможно, функция даже не была вызвана, поэтому я вернулся и изменил способ, которым это было вызываемый, как показано в редакции. Спасибо хоть. Кроме того, вызов функции, не будучи помещенным в лимитировщики, на самом деле создавал проблемы для меня, я уже пробовал это раньше, так как температура и влажность функционируют так же хорошо, и это просто дало ошибку, не помню, что это было, извините. –