microAJAX для Ардуино

std
Offline
Зарегистрирован: 05.01.2012

Sergeyevd

<input type=range id=qp value=0>
<button onclick=document.getElementById("qp").value=0;)>0</button>
<button onclick=document.getElementById("qp").value=100;)>100</button>
<button onclick=document.getElementById("qp").value=255;)>255</button>

http://www.w3schools.com/jsref/dom_obj_range.asp

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Merci beaucoup!

а то я так начал делать, непонравилось мне...

onclick='fun(0)'

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Яснее выражайтесь. Почему один? Кто мешает поставить разные ID кнопкам?

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Тогда и var yarkost = document.getElementById("qp").value; будет не одно

std мне всё верно подсказала(л)

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
	var o=new XMLHttpRequest();
	function dR() {
		o.open("GET","data.txt?r="+Math.random(),1);
		o.onload=function(){
			var a=this.responseText.replace(/\s*[\r\n=]+\s*/g, "=").replace(/^\s+/,"").replace(/\s+$/,"").match( /([^=]+)/g);
			for (var i=0, len=a.length; i< len; i+=2) try { document.getElementById(a[i]).innerText=a[i+1]; } catch(e) {};

			setTimeout("dR()", 1000);
			var tim=new Date();
				gauge.setValue(parseInt(document.getElementById("t1").innerText));
				document.getElementById("vr").innerHTML = tim.getHours()+':'+tim.getMinutes()+':'+tim.getSeconds();
		}
		o.send();
	}

Добавил отображение текущего времени, но оно притормаживает.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Вот ещё, о чём я не подумал, устанавливаю яркость светодиода 100 и второго 150.

Обновляю страничку и пумс, яркость по 0.

Или захожу с телефона на этот же адрес...и началось моргание...

Как мне сохранить установленную яркость?

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
#include <EtherCard.h>
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,100 };
const char website[] PROGMEM = "192.168.1.100";
byte Ethernet::buffer[1000];
BufferFiller bfill;
void setup () {
Serial.begin(250000);
ether.begin(sizeof Ethernet::buffer, mymac, 10);
ether.staticSetup(myip);
pinMode(3, OUTPUT);
pinMode(6, OUTPUT);
}

void loop () {

word pos = ether.packetLoop(ether.packetReceive());
if (pos){
// получаем заголовки
 char *data = (char *) Ethernet::buffer + pos;
Serial.print(data);
// проверяем на наличие в заголовках нужных нам строк
if (strstr(data, "GET /index.htm") || strstr(data, "GET / HTTP/1.1") ) {
bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<html>"
"<head>"
"<meta charset=\"utf-8\">"
"<title>Яркость</title>"
"<script src=\"evgeniip.js\"></script>"
"</head>"
"<body onload=\"dR()\">"

"<button onclick=\"document.getElementById('diod1').value=0\">0</button>"
"<input type=\"range\"  min=\"0\" max=\"255\" step=\"5\" id=\"diod1\"  value=\"0\">"
"<button onclick=\"document.getElementById('diod1').value=255\">255</button><br>"

"<button onclick=\"document.getElementById('diod2').value=0\">0</button>"
"<input type=\"range\"  min=\"0\" max=\"255\" step=\"5\" id=\"diod2\"  value=\"0\">"
"<button onclick=\"document.getElementById('diod2').value=255\">255</button><br>"

"<p>Яркость первого светодиоода:<span id=\"q\"></span></p>"
"<p>Яркость второго светодиода:<span id=\"w\"></span></p>"
"</body>"
"</html>"
));
}

if (strstr(data, "GET /kaka.htm")  ) {
int yarkost = atoi(strstr(data, "q=") + 2);
int yarkost1 = atoi(strstr(data, "w=") + 2);

analogWrite(3, yarkost);  
analogWrite(6, yarkost1);

bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/plain\r\n"
"\r\n"
"q = $D\r\n"
"w = $D\r\n"

),yarkost,yarkost1);
}

 ether.httpServerReply(bfill.position());
 }
}

 

var o=new XMLHttpRequest();
function dR() {

var yarkost = document.getElementById("diod1").value;
var yarkost1 = document.getElementById("diod2").value;

		o.open("GET","kaka.htm?r="+Math.random()+"q="+yarkost+"w="+yarkost1,1);
		o.onload=function(){
			var a=this.responseText.replace(/\s*[\r\n=]+\s*/g, "=").replace(/^\s+/,"").replace(/\s+$/,"").match( /([^=]+)/g);
			for (var i=0, len=a.length; i< len; i+=2) try { document.getElementById(a[i]).innerText=a[i+1]; } catch(e) {};
			

setTimeout("dR()", 1000);

		}
		o.send();
		}

 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Как с одного устройства сохранить состояние разобрался, добавил две переменных

#include <EtherCard.h>
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,100 };
const char website[] PROGMEM = "192.168.1.100";
byte Ethernet::buffer[1000];
BufferFiller bfill;
int e;
int r;

void setup () {
Serial.begin(250000);
ether.begin(sizeof Ethernet::buffer, mymac, 10);
ether.staticSetup(myip);
pinMode(3, OUTPUT);
pinMode(6, OUTPUT);

}

void loop () {

word pos = ether.packetLoop(ether.packetReceive());
if (pos){
// получаем заголовки
 char *data = (char *) Ethernet::buffer + pos;
Serial.print(data);
// проверяем на наличие в заголовках нужных нам строк
if (strstr(data, "GET /index.htm") || strstr(data, "GET / HTTP/1.1") ) {
bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<html>"
"<head>"
"<meta charset=\"utf-8\">"
"<title>Яркость</title>"
"<script src=\"evgeniip.js\"></script>"
"</head>"
"<body onload=\"dR()\">"

"<button onclick=\"document.getElementById('diod1').value=0\">0</button>"
"<input type=\"range\"  min=\"0\" max=\"255\" step=\"5\" id=\"diod1\"  value=\"$D\">"
"<button onclick=\"document.getElementById('diod1').value=255\">255</button><br>"

"<button onclick=\"document.getElementById('diod2').value=0\">0</button>"
"<input type=\"range\"  min=\"0\" max=\"255\" step=\"5\" id=\"diod2\"  value=\"$D\">"
"<button onclick=\"document.getElementById('diod2').value=255\">255</button><br>"

"<p>Яркость первого светодиоода:<span id=\"q\"></span></p>"
"<p>Яркость второго светодиода:<span id=\"w\"></span></p>"
"</body>"
"</html>"
),e,r);
}

if (strstr(data, "GET /kaka.htm")  ) {
int yarkost = atoi(strstr(data, "q=") + 2);
int yarkost1 = atoi(strstr(data, "w=") + 2);
e=yarkost;
r=yarkost1;
analogWrite(3, yarkost);  
analogWrite(6, yarkost1);

bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/plain\r\n"
"\r\n"
"q = $D\r\n"
"w = $D\r\n"

),yarkost,yarkost1);
}

 ether.httpServerReply(bfill.position());
 }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sergeyevd пишет:

Вот ещё, о чём я не подумал, устанавливаю яркость светодиода 100 и второго 150.

Обновляю страничку и пумс, яркость по 0.

Или захожу с телефона на этот же адрес...и началось моргание...

Как мне сохранить установленную яркость?

Вы её устанавливаете на клиенте? Если да, то передайте на сервер и там в какой-нибудь епром запишите или ещё как сохраните, а потом при выдаче страницы, выдавайте изначально то самое схохранённое значение.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Я так и сделал, 42 и 46 строчки подгружается ранее установленное значение, и можно перезагружать страничку, всё останется таким же.

 
42 "<input type=\"range\"  min=\"0\" max=\"255\" step=\"5\" id=\"diod1\"  value=\"$D\">"
 
46 "<input type=\"range\"  min=\"0\" max=\"255\" step=\"5\" id=\"diod2\"  value=\"$D\">"

 

 

 

56 if (strstr(data, "GET /kaka.htm")  ) {
57 int yarkost = atoi(strstr(data, "q=") + 2);
58 int yarkost1 = atoi(strstr(data, "w=") + 2);
59 e=yarkost;
60 r=yarkost1;

Но зайдя с другого устройства...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И что "зайдя с другого устройства".

Сергей, давайте Вы наконец научитесь отделять мух от котлет. Есть сервер и есть клиент. Если сервер передаёт то, что Вам нужно, то клиент это примет. Вам надо вяснить, где Ваша проблема - на сервере или на клиенте.

Для этого Вам надо посмотреть что конкретно возвращает сервер клиенту.

Вы можете загрузить страницу в клиент и посмотреть исходный HTML страницы?

ПОтом загрузить "с другого устройства" и там тоже посмотреть исходный HTML страницы?

Если сервер передал правильно, надо разбираться почему клиент правильно не передал.

Если же сервер передал неправильно, надо смотреть почему.

Проделайте это.

 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

На какие симолы ругается?

"var a=this.responseText.replace(/\s*[\r\n=]+\s*/g, \"=\").replace(/^\s+/,\"\").replace(/\s+$/,\"\").match( /([^=]+)/g);"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А ругань-то где?

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Если скрипт в ардуино, то не могу зайти на сервер, не удаётся получить доступ к сайту

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И при этом компилируется?

Ну, не ведите себя как ребёнок, добавьте в скетч вывод этой строки в сериал. Посмотрите на строку. Она должны выглядеть точно так как Вы хотите, чтобы она уходила с сервера. Если она выгладит как-то не так, правьте. Просто посмотрите на неё в сериале.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Компилируется.

А вот сериал принт уже ругается

Serial.print("var a=this.responseText.replace(/\s*[\r\n=]+\s*/g, "=").replace(/^\s+/,"").replace(/\s+$/,"").match( /([^=]+)/g);") ;

Если переде кажды " ставлю \ результат тот же.

Что еще нужно закомментировать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А зачем Вы её так ставите? Что Вам это даст? Ставьте целиком как есть. Точно скопируйте из Вашей 29 строки. Типа там PSTR(.... и всю целиком.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Подскажите как организовать кросс-доменный запрос


<html>
<head>
<meta charset="utf-8">
<title>яркость</title>
<script>

function dR() {
var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest;
var xhr = new XHR();
xhr.open('GET', 'h t t p : / / 192.168.1.100/', true); 
xhr.onload = function() {
alert( this.responseText );
}
xhr.onerror = function() {
  alert( 'Ошибка ' + this.status );
}
xhr.send();
}
	

</script>
</head>
<body onload="dR()">

</body>
</html>

Как я понял сервер должен ответить

HTTP/1.0 200 OK\r\n
Content-Type: text/html\r\n
Access-Control-Allow-Origin: http://192.168.1.36/\r\n  //т.к. запрос идёт с сайта http://192.168.1.36/
 \r\n
 
А в GET надо добавить Origin:http://192.168.1.36/  
Да? Как добавить?
Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Нашёл

Access-Control-Allow-Origin: *

Но всё же, как добавить в запрос Origin:http://192.168.1.36/  ?

std
Offline
Зарегистрирован: 05.01.2012

192.168.1.* довольно сильно намекает мне на NAT. А раз так, почему не написать просто "Access-Control-Allow-Origin: null"?

UPD.

xhr.open("GET", "http ://192.168.1.100/", true);
xhr.setRequestHeader("Origin:", "http ://192.168.1.36");
xhr.send();

Написано же всё:

http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp

UPD2. Бл█ть, как же меня улыбает этот редактор в форме ответа. Пора вырабатывать привычку жать "Источник" и писать пост прямо в HTML.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Разобрался, o.setRequestHeader("", "");

std, Спасибо.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Очень интересная тема для новичков. Евгений, очередное БОЛЬШОЕ СПАСИБО Вам за трату времени и износ клавиатуры. Жаль, конечно, что в первом посте Вы не смогли выложить непосредственно сам скетч для дуинки, что было бы очень полезно для "чайников", но в целом все великолепно и понятно. 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Евгений, я всё о том же, о нескольких одновременно подключенных устройствах.

 

#include <EtherCard.h>
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,100 };
const char website[] PROGMEM = "192.168.1.100";
byte Ethernet::buffer[1000];
BufferFiller bfill;
int onoff1;
int onoff2;

void setup () {
Serial.begin(250000);
ether.begin(sizeof Ethernet::buffer, mymac, 10);
ether.staticSetup(myip);
pinMode(3, OUTPUT);
pinMode(6, OUTPUT);

}

void loop () {

word pos = ether.packetLoop(ether.packetReceive());
if (pos){
// получаем заголовки
 char *data = (char *) Ethernet::buffer + pos;
Serial.print(data);
// проверяем на наличие в заголовках нужных нам строк
if (strstr(data, "GET /index.htm") || strstr(data, "GET / HTTP/1.1") ) {
bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<html>"
"<head>"
"<meta charset=\"utf-8\">"
"<title>Яркость</title>"
"<script src=\evgeniip.js\"></script>"
"</head>"
"<body onload=\"dR()\">"
"<p><button onclick=\"document.getElementById('diod1').innerText=1\">On</button> | <button onclick=\"document.getElementById('diod1').innerText=0\">Off</button></p>"
"<p>Клиент:<span id=\"diod1\">$D</span></p>"
"<p>Сервер:<span id=\"d1\"></span></p>"

"<p><button onclick=\"document.getElementById('diod2').innerText=1\">On</button> | <button onclick=\"document.getElementById('diod2').innerText=0\">Off</button></p>"
"<p>Клиент:<span id=\"diod2\">$D</span></p>"
"<p>Сервер:<span id=\"d2\"></span></p>"

"</body>"
"</html>"
),onoff1,onoff2);
}

if (strstr(data, "GET /kaka.htm")  ) {
onoff1 = atoi(strstr(data, "q=") + 2);
onoff2 = atoi(strstr(data, "w=") + 2);
digitalWrite(3, onoff1); 
digitalWrite(6, onoff2); 
bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/plain\r\n"
"\r\n"
"d1 = $D\r\n"
"d2 = $D\r\n"

),onoff1,onoff2);
}

 ether.httpServerReply(bfill.position());
 }
}

Захожу с компьютера по адресу 192.168.1.100

Нажимаю первую On Клиент" пишет On сервер пишет On, диод включился, аналогично со вторым.

Перезагружаю стртаничку, статус диода не меняется, если горит то On иначе Off. Всё правильно.

 

Включаю два диода с компьютера.

Клиент:1
Сервер:1
---------
Клиент:1
Сервер:1
 
Захожу через телефон 192.168.1.100
Клиент:1
Сервер:1
---------
Клиент:1
Сервер:1
Ага, всё правильно.
 
Нажимаю на телефоне первую Off.
Клиент:0
Сервер:0
---------
Клиент:1
Сервер:1

а на компьютере без изменений

Клиент:1
Сервер:1
---------
Клиент:1
Сервер:1
При этом диод моргает.
Несколько раз обновляю страничку на компьютере, и диод как и положено выключается и статус обновляется.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. он при перезагрузке на компьютере нормально обновляется, но пере обновляется сам. Я правильно понял?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не вижу в приведённом коде запрсов, который Вы делаете, чтобы передать что-то серверу, а также запросов для обновления данных (они у Вас спрятаны в подключаемом скрипте).

В любом случае, убедитесь, что м любом запросе есть случайный параметр (помните, как я вставлял ненужный параметр в запрос файла данных - случайное число). Такой же левый параметр обязан быть в любом запросе (на kaka.htm там и вообще в люьом). Иначе велика вероятность, что клиент просто не пошлёт запрос серверу, а выдаст Вам то, что он там накешировал.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

https://www.youtube.com/watch?v=XE4qLNvwlOA

Прошу прощени за качество, но суть будет понятна.

НА видео есть такие строки, забыл их убрать, не обращаем внимания.

----

Сервер

Сервер

 

var o=new XMLHttpRequest();
function dR() {
var yarkost = document.getElementById("diod1").innerText;
var yarkost1 = document.getElementById("diod2").innerText;

o.open("GET","kaka.htm?r="+Math.random()+"q="+yarkost+"w="+yarkost1,1);
o.onload=function(){
var a=this.responseText.replace(/\s*[\r\n=]+\s*/g, "=").replace(/^\s+/,"").replace(/\s+$/,"").match( /([^=]+)/g);
for (var i=0, len=a.length; i< len; i+=2) try { document.getElementById(a[i]).innerText=a[i+1]; } catch(e) {};

setTimeout("dR()", 500);


}
o.send();
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сотмрим на строки 54 - 57.

Вы нигде не на самом деле запоминаете свои on/off.

Всякий раз, когда коиент Вам их передал, Вы их читаете из запроса клиента и устанваливаете диоды.

Просто ведите пальце по этим строкам - пришёл запрос от клиента ... и что? Читаем из запроса.

Поэтому в форме одного клиента Вы поменялм и всё поменялось.

Затем идет запрос от дркгого клиента (у когторо в форме старые значения) и он затирает.

Сервер мроже в сериал что-то напечатать? Попечатайте запросы - разберётесь.

Проблема в том, что Ваш запрос kaka.htm - два в одном. И установить, и узнать. Разделите запросы - установить отдельно, а узнать отдельно и всё устанканится.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Ага, разобрался, спасибо.

Возникла проблема.

https://youtu.be/5lCvmcY0TV8 (иногда включаются/выключаются оба диода, если с двух и более устрйоств заходить )

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Кнопки</title>
<script>
var lam1;
var lam2;

//Начало.Получение.
var o=new XMLHttpRequest();
function dR() {
o.open("GET","temp.txt?r="+Math.random(),1);
o.onload=function(){
var a=this.responseText.replace(/\s*[\r\n=]+\s*/g, "=").replace(/^\s+/,"").replace(/\s+$/,"").match( /([^=]+)/g);
for (var i=0, len=a.length; i< len; i+=2) try { document.getElementById(a[i]).innerText=a[i+1]; } catch(e) {};

lam1 = document.getElementById("di1").innerText;//Состояние первого диода.
lam2 = document.getElementById("di2").innerText;//Состояние второго диода.
document.getElementById("la1").src=lam1+'.png';//Картинка первого диода.
document.getElementById("la2").src=lam2+'.png';//Картинка второго диода.

setTimeout("dR()", 500);
}
o.send();
}
//Конец.Получение.

//Начало. Функция записи состояния кнопок	
function onoff(vb,st) {
document.getElementById(vb).innerHTML=st;

diod1 = document.getElementById("diod1").innerText;
diod2 = document.getElementById("diod2").innerText;
if (diod1==''){
diod1=lam1;
}
if (diod2==''){
diod2=lam2;
}
var x = new XMLHttpRequest();
x.open("GET", "text.php?di1="+diod1+"&di2="+diod2+"&r="+Math.random(), true);
x.onload = function (){
}
x.send(null);

}
//Конец. Функция записи состояния кнопок	


</script>
</head>
<body onload="dR()">
<p><button onclick="onoff('diod1',true)">D1 On</button> | <button onclick="onoff('diod1',false)">D1 Off</button></p>
<p><button onclick="onoff('diod2',true)">D2 On</button> | <button onclick="onoff('diod2',false)">D2 Off</button></p>
<p>Клиент:<span id="diod1"></span></p>
<p>Клиент:<span id="diod2"></span></p>
<p>--------------------------------------</p>
<p>Сервер:<span id="di1"></span></p>
<p>Сервер:<span id="di2"></span></p>
<p>--------------------------------------</p>
<p>Первый диод:<img src="false.png" id="la1"></p>
<p>Второй диод:<img src="false.png" id="la2"></p>
<p>--------------------------------------</p>
</body>
</html>

text.php

<?php
$url ="di1=".$_GET['di1']."\r\n"."di2=".$_GET['di2'];
$f = fopen("temp.txt", "w");
fwrite($f, $url); 
fclose($f);
?>

 

 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Или вот аткой вариант, тоже самое:

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Кнопки</title>
<script>
var lam1;
var lam2;

//Начало.Получение.
var o=new XMLHttpRequest();
function dR() {
o.open("GET","temp.txt?r="+Math.random(),1);
o.onload=function(){
var a=this.responseText.replace(/\s*[\r\n=]+\s*/g, "=").replace(/^\s+/,"").replace(/\s+$/,"").match( /([^=]+)/g);
for (var i=0, len=a.length; i< len; i+=2) try { document.getElementById(a[i]).innerText=a[i+1]; } catch(e) {};

lam1 = document.getElementById("di1").innerText;//Состояние первого диода.
lam2 = document.getElementById("di2").innerText;//Состояние второго диода.
document.getElementById("la1").src=lam1+'.png';//Картинка первого диода.
document.getElementById("la2").src=lam2+'.png';//Картинка второго диода.

setTimeout("dR()", 500);
}
o.send();
}
//Конец.Получение.

//Начало. Функция записи состояния кнопок	
function onoff(vb,st) {
document.getElementById(vb).innerHTML=st;

diod1 = document.getElementById("diod1").innerText;
diod2 = document.getElementById("diod2").innerText;

var x = new XMLHttpRequest();
//text.php?di1=&di2=
x.open("GET", "text.php?di1="+diod1+"&di2="+diod2+"&r="+Math.random(), true);
x.onload = function (){
}
x.send(null);

}
//Конец. Функция записи состояния кнопок	


</script>
</head>
<body onload="dR()">
<p><button onclick="onoff('diod1',true)">D1 On</button> | <button onclick="onoff('diod1',false)">D1 Off</button></p>
<p><button onclick="onoff('diod2',true)">D2 On</button> | <button onclick="onoff('diod2',false)">D2 Off</button></p>
<p>Клиент:<span id="diod1"></span></p>
<p>Клиент:<span id="diod2"></span></p>
<p>--------------------------------------</p>
<p>Сервер:<span id="di1"></span></p>
<p>Сервер:<span id="di2"></span></p>
<p>--------------------------------------</p>
<p>Первый диод:<img src="false.png" id="la1"></p>
<p>Второй диод:<img src="false.png" id="la2"></p>
<p>--------------------------------------</p>
</body>
</html>

text.php

<?php
$filename = 'temp.txt'; 
$diod1=$_GET['di1'];
$diod2=$_GET['di2'];

if ($diod1 =='false' || $diod1 =='true' ){
$file = file($filename);
$file[1-1] = 'di1='.$diod1.PHP_EOL;
file_put_contents($filename, join('', $file));
}
if ($diod2 =='false' || $diod2 =='true' ){
$file = file($filename);
$file[2-1] = 'di2='.$diod2.PHP_EOL;
file_put_contents($filename, join('', $file));
}

?>

 

OlegM
Offline
Зарегистрирован: 14.06.2016

if ($diod1 =='false' || $diod1 =='true' )

ну это вообще крутая строчка, странно, что там все чет не работает...

а это $file[1-1] шедевр..

MacSim
Offline
Зарегистрирован: 28.11.2012

интересная тема. подпишусь почитаю. руки дойдут тоже хочется попробывать с веб. Евгению Спасибо.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

OlegM пишет:

if ($diod1 =='false' || $diod1 =='true' )

ну это вообще крутая строчка, странно, что там все чет не работает...

а это $file[1-1] шедевр..

 

 отладочная версия"...

OlegM
Offline
Зарегистрирован: 14.06.2016

в момент захода на сайт у тебя должно проверятся состояние диодов в данный момент, и выводится на сайт аяксом, а с таким кодом там ошибок куча, подума только что это делает ? ))

if ($diod1 =='false' || $diod1 =='true' )

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

OlegM пишет:

в момент захода на сайт у тебя должно проверятся состояние диодов в данный момент, и выводится на сайт аяксом, а с таким кодом там ошибок куча, подума только что это делает ? ))

if ($diod1 =='false' || $diod1 =='true' )

Если Диод1 равен false или Диод1 равен true

то запишем его значение в temp.txt, точнее заменим строку в уже созданном файле

иначе не запишем

Это на случай если запрос будет пустым.

 

<?php
$url ="di1=".$_GET['di1']."\r\n"."di2=".$_GET['di2'];
$f = fopen("temp.txt", "w");
fwrite($f, $url); 
fclose($f);
?>

С первым вариантом аналогичная проблема

OlegM
Offline
Зарегистрирован: 14.06.2016

если диод не true, то он false тут что не понятно , если не false, то true !!!

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
<?php
$filename = 'temp.txt'; 

$diod1=$_GET['di1'];
$diod2=$_GET['di2'];

if ($diod1 !='' ){
$file = file($filename);
$file[0] = 'di1='.$diod1.PHP_EOL;
file_put_contents($filename, join('', $file));
}
if ($diod2 !='' ){
$file = file($filename);
$file[1] = 'di2='.$diod2.PHP_EOL;
file_put_contents($filename, join('', $file));
}

?>

 

OlegM
Offline
Зарегистрирован: 14.06.2016

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

OlegM
Offline
Зарегистрирован: 14.06.2016

<php
$arr = file('temp.txt');

if(!empty($_GET['di1'])) $arr[0] = 'di1=' . $_GET['di1']  . "\r\n";
if(!empty($_GET['di2'])) $arr[1] = 'di2=' . $_GET['di2']  . "\r\n";

file_put_contents('temp.txt', join('', $arr));

>

так пробуй

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Благодарю, работает скрипт.

Но где же ошибка, почему включаются/выключаются оба диода.

Lion777
Offline
Зарегистрирован: 20.05.2016

Счас так же ВКЛ и выкл при заходе ?

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

https://youtu.be/X9-IZk1q2GE

Не при заходе, при заходе всё было хорошо.

При нажатии.

Lion777
Offline
Зарегистрирован: 20.05.2016

Возможно когда заходишь с другого устройства, то в адресе хоста передаешь ещё и переменные тип адрес?di1=1&di2=1

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Lion777 пишет:
Возможно когда заходишь с другого устройства, то в адресе хоста передаешь ещё и переменные тип адрес?di1=1&di2=1

Нет.

Оба адреса

http://192.168.1.36/php/

http://192.168.1.36/php/

OlegM
Offline
Зарегистрирован: 14.06.2016

значит так, показывай куски когда как передаешь данные в файл и как читаешь состояния

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
<p><button onclick="onoff('diod1',true)">D1 On</button></p> 
<p><button onclick="onoff('diod1',false)">D1 Off</button></p>
<p><button onclick="onoff('diod2',true)">D2 On</button></p>
<p><button onclick="onoff('diod2',false)">D2 Off</button></p>

Передача

function onoff(vb,st) {
document.getElementById(vb).innerHTML=st;
diod1 = document.getElementById("diod1").innerText;
diod2 = document.getElementById("diod2").innerText;

var x = new XMLHttpRequest();
x.open("GET", "text.php?di1="+diod1+"&di2="+diod2+"&r="+Math.random(), true);
x.onload = function (){
//
}
x.send(null);
}

Приём

var o=new XMLHttpRequest();
function dR() {

o.open("GET","temp.txt?r="+Math.random(),1);
o.onload=function(){
var a=this.responseText.replace(/\s*[\r\n=]+\s*/g, "=").replace(/^\s+/,"").replace(/\s+$/,"").match( /([^=]+)/g);
for (var i=0, len=a.length; i< len; i+=2) try { document.getElementById(a[i]).innerText=a[i+1]; } catch(e) {};

lam1 = document.getElementById("di1").innerText;//Состояние первого диода.
lam2 = document.getElementById("di2").innerText;//Состояние второго диода.
document.getElementById("la1").src=lam1+'.png';//Картинка первого диода.
document.getElementById("la2").src=lam2+'.png';//Картинка второго диода.

setTimeout("dR()", 500);
}
o.send();
}

 

OlegM
Offline
Зарегистрирован: 14.06.2016

кнопки где, как кнопки организованны, php где ? а лучше выложи все архивом, все полностью, что бы не искать все части и не искать что где и подпиши где за что отвечает

---

кнопки уже есть, лучше архивом выложи и подпиши все, потом гляну

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

http://dropmefiles.com/ba5F7

test.zip[4,6 Kb]
[index.html]
[text.php]
[temp.txt]
[true.png]
[false.png]
Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Вроде, как бы разобрался, неверно сохранял значения в вайл.



function onoff(vb,st) {
var x = new XMLHttpRequest();
document.getElementById(vb).innerHTML=st;
if (vb=='diod1'){
x.open("GET", "text.php?di1="+st+"&di2=&r="+Math.random(), true);
x.send(null);
}else{
x.open("GET", "text.php?di1=&di2="+st+"&r="+Math.random(), true);
x.send(null);
}
}

Грубо говоря вот так надо.

OlegM
Offline
Зарегистрирован: 14.06.2016

ну если работает, то я не буду смотреть ?

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Работает