Бегунок на сайте - Динамическое изменение освещения

cron
Offline
Зарегистрирован: 01.02.2017

Друзья, не пинайте, вопрос серьезный!

Задача: Есть сайт на хостинге в интернете на нем нарисован бигунок, задача что бы при движении бегунка в реалтайме на сколько это возможно удаленная ардуина подключенная только к ethernet shield W5100 меняла силу освещения.

Сразу огооврюсь, меня не интересуют вопросы: Как сделать бегунок, как сделать аяксом отправку данных в php скрипт, как сделать на стороне ардуино освещение и даже как пробросить порты до ардуино, и в конце концов даже как все это собрать что бы работало!

Вопрос намного сложнее!
Итак внимание вопрос.

Как мне динамически с сайте отправлять данные на ардуино НЕиспользуя командную строку? и отправлять только значение от 1 до 255. Что бы не валить на ардуину весь html. Предпологаю мне поможет метод POST, но можно ли передать только значение ввиде цифры? и как? 

Если примера не хватит терпения привести, скажите хоть куда копать? 

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

Посылайте запрос на ардуино методом GET с параметром, например

http://myarduino.myhome.ru/index.htm?chislo=100500

Разумеется, адрес Ваш должен быть.

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

Чтобы браузер, Ваш ответ сдуру не закешировал, добавьте левый параметр и в него суйте случаное число. Тогда запрос будет каждый раз разным и браузер реально будет обращаться к серверу. Типа вот так

http://myarduino.myhome.ru/index.htm?chislo=100500&nocache=123421

cron
Offline
Зарегистрирован: 01.02.2017

спасибо добрый человек. Впринцепе понятно. Отпишусь по результату

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Можно попробовать вебсокеты. Там соединение уже установлено и идет чистый обмен данными - можно хоть один байт отправить.

cron
Offline
Зарегистрирован: 01.02.2017

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

POST /add.php HTTP/1.1
Host: 192.168.0.145
Content-type: application/x-www-form-urlencoded
Content-length:17
Accept:*/*
User-agent:Opera 10.00
Connection:Close
 
na=0&fio=KISELEV&dom=5
 
Подскажите какими командами си я могу распарсить последнию строку, только не регулярки их не знаю. Вот в php есть замечательный explode который может разбить строку по символу & на массив. И как вытащить только вот эту строку   na=0&fio=KISELEV&dom=5   ,а потом с ней работать.
и надо ли сначало переводить строку в тип string что бы ее парсить, так как изначально это все лижит в char.

 

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

Это как Вам удобнее. Можете преобразовать в String, можете не преобразовывать.

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

cron
Offline
Зарегистрирован: 01.02.2017

ок как разделить строку на массив я понял, спасибо за помощь.
А как мне из большого ответа вычленить именно эту строку na=0&fio=KISELEV&dom=5 что бы с ней работать.

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

Перед ней есть токен - два подряд перевода строки. Есго и ищите. Как нашли, сразу на ним Ваша строка параметров и начинается.

cron
Offline
Зарегистрирован: 01.02.2017

Правельно я понимаю что это решается вот этой строкой в цикле       

char c = client.read();
 if (c == '\n') {   }

что типа как только найдена пустая строка выполнять что то. ?

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

Ну, можно и так. Можно по-разному, 100500 способов есть.

Только надо проверить нет ли там ещё и \r врядли, но проверить не помешает.

cron
Offline
Зарегистрирован: 01.02.2017

Пытаюсь разобрать строку, утомился малость уже)))
а почему при таком коде получаю в serial набор ироглифов но когда убераю звездочку у строки char *pch; то получаю тоже набор непонятных символов но уже хоть буквы нормальные. Почему так?

char *pch;
char c;
 
 while (client.connected()) {
         while (client.available()) {
              c = client.read();
        
                 pch = strtok (c,"&");
                 while (pch != NULL)
                 {
                     Serial.println(pch);
                     pch = strtok (NULL, "&");
                     delay(10);
                 }
         }
      }
 
 
В результате жду в Serial разбор строки и вывожу Serial.println(pch); 
но получаю иероглифы.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ой, Вы ж внчале написали, что типа умеете программировать.

strtok принимает первым параметром указатель на массив символов, а Вы ему одиночный символ пихаете. Возвращает тоже указатель.

Вы прочитайте всю строку, сложите в массив чаров, а потом уж парсите.

Если Вы хотите парсить по мере чтения, то это не так делается - это автомат строить надо, как в компиляторах.

cron
Offline
Зарегистрирован: 01.02.2017

простите за тупость, я владею web языками но с си столкнулся первый раз, на php я бы эту задачку сделал за 3 минуты, тут же все так вязко и туго. Ну всеровно спасибо что помогаете. Я это очень ценю!

cron
Offline
Зарегистрирован: 01.02.2017

Все капец, терпение лопнуло, Пукан бомбит - бесит!
Люди добрые помогите не понимаю(разжуйте с коментариями плизз)!

Вот есть код:
if (client.connected()) {
          while (client.available()) {
              char Response[] = { client.read() };
               Serial.print(Response);  
          }
   }

в Response я получаю самый класический массив, где в каждой ячейке массива лежит один символ, а имено в массиве лежит текст:
POST /add.php HTTP/1.1
Host: 192.168.0.145
Content-type: application/x-www-form-urlencoded
Content-length:17
Accept:*/*
User-agent:Opera 10.00
Connection:Close

na=0&fio=KISELEV&dom=5

Пересмотрел массу уроков на ютюбе по работе со строками и массивами и нихрена не понимаю как быть в моем случаи:
Как мне извлеч na=0&fio=KISELEV&dom=5 и распарсить и получить только цыфры и присвоить их переменным???
Прошу отнестись с пониманием коснулся си первый раз и просто бомбит от сложности элементарных задач.

Поверте бьюсь уже третий день, и перессмотрел массу примеров, но в си реально все туго.

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

cron пишет:

Вот есть код:
if (client.connected()) {
          while (client.available()) {
              char Response[] = { client.read() };
               Serial.print(Response);  
          }
   }

Это не код. Это аудиозапись в конюшне, когда сивая кобыла Марго приболела и начала бредить.

Объясните пожалуйста (самому себе, мне не надо), что по-Вашему означает конструкция

char Response[] = { client.read() };

Потом, прочитайте уже хоть какую-нибудь книжку по языку на котором "пишете" и переделайте эту в строку во что-нибудь более осмысленное.

cron пишет:
Все капец, терпение лопнуло, Пукан бомбит - бесит!

Так и есть. Это был последний раз, когда я смотрел на Ваш код вставленный с полным игнором правил форума. В следующий раз, будете так вставлять - ответа не ждите.

cron
Offline
Зарегистрирован: 01.02.2017

ясно, правила изучил, буду их учитывать)

Отстал

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

Ну, вот, теперь разберитесь со строкой, которую я Вам показал и всё будет здорово!

cron
Offline
Зарегистрирован: 01.02.2017

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

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

Друзья подскажите

Внезапно перестала работать функция  fsockopen();
Если из браузера открыть скрипт в котором и есть отправка даных через сокет то через 30 сек. вылазиет ошибка:


Warning: fsockopen() [function.fsockopen]: unable to connect to 192.168.0.145:80 (Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. ) in Z:\home\h.test\www\add.php on line 6

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

так же в seral порте тишина:
опытным методом понял что, Вот это условие не выполняется.
 


 while (client.available() > 0)
      {
        char c = client.read();
        Serial.print(c);
      }

А вот:
 

Serial.print(client.connected());

выдает - 1 т.е. я так понимаю конект ардуины и браузера проходит успешно.



Еще раз повторю все работало вчера, сегодня включаю и не работает.

Что пробовал делать:
1) Перезагружал комп, ардуино.
2) менял кабель ethernet shilda
3) менял блок питания у ардуины
4) менял скеч(создавал новый)
5) Единственное что делал это нечайно удалил папку downloads из папки документы/arduino/libraries/downloads
6) При компеляции скеча ошибок ни каких не появляется.
7) пробовал менять порт в команде тоже не помогает

Были у кого нить похожие проблемы?

 

Logik
Offline
Зарегистрирован: 05.08.2014

И не такое бывало;) Ставте Wireshark на комп, сможете увидеть что реально пришло на комп и был ли ответ.

cron
Offline
Зарегистрирован: 01.02.2017

друзья посмотрел трафик wireshark идущий к ардуине - 192.168.0.241 от компа 192.168.0.202  и вижу отдни пакеты RST что говорит о том что ардуина скидывает соеденение. 
Ниче не понимаю, помогите понять, почему?
Эти пакеты RST появляются при попытке отправить данные из php в ардуину методом fsockopen.

cron
Offline
Зарегистрирован: 01.02.2017

Друзья переломал все копья! Силы кончались, Неделя гугления завела в тупик.
Ни как не работает fsockopen();

Выручайте пожалуйста!!!
Вот скрипт который отправлет данные из php 
 

01 $socket = fsockopen("192.168.0.146", 80, $errno, $errstr, 10);
02  
03 if(!$socket)die("$errstr($errno)");
04 //собираем данные
05 //$data = "name=".urlencode("John")."&surname=".urlencode("Smith");
06 $data = "name=1";
07 //пишем в сокет метод, URI и протокол
08 fwrite($socket, "GET /add.php HTTP/1.1\r\n");
09 //а также имя хоста
10 stream_set_timeout($socket, 2);
11 fwrite($socket, "Host: 192.168.0.146\r\n");
12  
13 //теперь отправляем заголовки
14 //Content-type должен быть applicaion/x-www-form-urlencoded
15 fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
16 //размер передаваемых данных передаем в заголовке Content-length
17 fwrite($socket,"Content-length:".strlen($data)."\r\n");
18 //типы принимаемых данных. */* означает, что принимаем все типы данных
19 fwrite($socket,"Accept:*/*\r\n");
20 //представимся оперой
21 fwrite($socket,"User-agent:Opera 10.00\r\n");
22 fwrite($socket,"\r\n");
23  
24 //теперь передаем данные
25 fwrite($socket,"$data\r\n");
26 fwrite($socket,"\r\n");
27  
28 //теперь читаем и выводим ответ
29 $answer = '';
30 while(!feof($socket)){
31     $answer.= fgets($socket, 4096);
32 }
33 echo $answer;
34  
35 //закрываем сокет
36 fclose($socket);

Вот таким скечем слушая приход данных от php.

Ну скажите что я не так делаю??? что бы я не делал заканчивается ошибкой:
Warning: fsockopen() [function.fsockopen]: unable to connect to 192.168.0.146:80 (Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. )

даже если оставляю в php скрипте одну строку:
 

1 $socket = fsockopen("192.168.0.146", 80, $errno, $errstr, 10);
2  
3 Всеровно получаю туже ошибку.
4 Перегуглил за неделю все что только можно было, прошу выдвигать даже бредовые версии, все пойдет в работу. Руки уже опустились.