Бегунок на сайте - Динамическое изменение освещения
- Войдите на сайт для отправки комментариев
Друзья, не пинайте, вопрос серьезный!
Задача: Есть сайт на хостинге в интернете на нем нарисован бигунок, задача что бы при движении бегунка в реалтайме на сколько это возможно удаленная ардуина подключенная только к ethernet shield W5100 меняла силу освещения.
Сразу огооврюсь, меня не интересуют вопросы: Как сделать бегунок, как сделать аяксом отправку данных в php скрипт, как сделать на стороне ардуино освещение и даже как пробросить порты до ардуино, и в конце концов даже как все это собрать что бы работало!
Вопрос намного сложнее!
Итак внимание вопрос.
Как мне динамически с сайте отправлять данные на ардуино НЕиспользуя командную строку? и отправлять только значение от 1 до 255. Что бы не валить на ардуину весь html. Предпологаю мне поможет метод POST, но можно ли передать только значение ввиде цифры? и как?
Если примера не хватит терпения привести, скажите хоть куда копать?
Посылайте запрос на ардуино методом GET с параметром, например
http://myarduino.myhome.ru/index.htm?chislo=100500
Разумеется, адрес Ваш должен быть.
Когда примете, а примете Вы только эту строку и никакой другой грязи, параметр вытаскивайте, а серверу ответьте что-нибудь (хоть пустым ответом).
Чтобы браузер, Ваш ответ сдуру не закешировал, добавьте левый параметр и в него суйте случаное число. Тогда запрос будет каждый раз разным и браузер реально будет обращаться к серверу. Типа вот так
http://myarduino.myhome.ru/index.htm?chislo=100500&nocache=123421
спасибо добрый человек. Впринцепе понятно. Отпишусь по результату
Можно попробовать вебсокеты. Там соединение уже установлено и идет чистый обмен данными - можно хоть один байт отправить.
ага сделал через сокеты:
в консоли получаю такой текст, меня это устраивает.
Это как Вам удобнее. Можете преобразовать в String, можете не преобразовывать.
Большие мальчишки не преобразовывают, а парсят при помощий функции strtok.
ок как разделить строку на массив я понял, спасибо за помощь.
А как мне из большого ответа вычленить именно эту строку na=0&fio=KISELEV&dom=5 что бы с ней работать.
Перед ней есть токен - два подряд перевода строки. Есго и ищите. Как нашли, сразу на ним Ваша строка параметров и начинается.
Правельно я понимаю что это решается вот этой строкой в цикле
char c = client.read();
if (c == '\n') { }
что типа как только найдена пустая строка выполнять что то. ?
Ну, можно и так. Можно по-разному, 100500 способов есть.
Только надо проверить нет ли там ещё и \r врядли, но проверить не помешает.
Пытаюсь разобрать строку, утомился малость уже)))
а почему при таком коде получаю в serial набор ироглифов но когда убераю звездочку у строки char *pch; то получаю тоже набор непонятных символов но уже хоть буквы нормальные. Почему так?
Ой, Вы ж внчале написали, что типа умеете программировать.
strtok принимает первым параметром указатель на массив символов, а Вы ему одиночный символ пихаете. Возвращает тоже указатель.
Вы прочитайте всю строку, сложите в массив чаров, а потом уж парсите.
Если Вы хотите парсить по мере чтения, то это не так делается - это автомат строить надо, как в компиляторах.
простите за тупость, я владею web языками но с си столкнулся первый раз, на php я бы эту задачку сделал за 3 минуты, тут же все так вязко и туго. Ну всеровно спасибо что помогаете. Я это очень ценю!
Все капец, терпение лопнуло, Пукан бомбит - бесит!
Люди добрые помогите не понимаю(разжуйте с коментариями плизз)!
Вот есть код:
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 и распарсить и получить только цыфры и присвоить их переменным???
Прошу отнестись с пониманием коснулся си первый раз и просто бомбит от сложности элементарных задач.
Поверте бьюсь уже третий день, и перессмотрел массу примеров, но в си реально все туго.
Вот есть код:
if (client.connected()) {
while (client.available()) {
char Response[] = { client.read() };
Serial.print(Response);
}
}
Это не код. Это аудиозапись в конюшне, когда сивая кобыла Марго приболела и начала бредить.
Объясните пожалуйста (самому себе, мне не надо), что по-Вашему означает конструкция
Потом, прочитайте уже хоть какую-нибудь книжку по языку на котором "пишете" и переделайте эту в строку во что-нибудь более осмысленное.
Так и есть. Это был последний раз, когда я смотрел на Ваш код вставленный с полным игнором правил форума. В следующий раз, будете так вставлять - ответа не ждите.
ясно, правила изучил, буду их учитывать)
Отстал
Ну, вот, теперь разберитесь со строкой, которую я Вам показал и всё будет здорово!
Посоветуйте книгу автора, кто на Ваш взгляд доходчевее всех описывает работы с масивами строками указателями и т.п.
Спасибо!
http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf
Друзья подскажите
Внезапно перестала работать функция 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 порте тишина:
опытным методом понял что, Вот это условие не выполняется.
А вот:
выдает - 1 т.е. я так понимаю конект ардуины и браузера проходит успешно.
Еще раз повторю все работало вчера, сегодня включаю и не работает.
Что пробовал делать:
1) Перезагружал комп, ардуино.
2) менял кабель ethernet shilda
3) менял блок питания у ардуины
4) менял скеч(создавал новый)
5) Единственное что делал это нечайно удалил папку downloads из папки документы/arduino/libraries/downloads
6) При компеляции скеча ошибок ни каких не появляется.
7) пробовал менять порт в команде тоже не помогает
Были у кого нить похожие проблемы?
И не такое бывало;) Ставте Wireshark на комп, сможете увидеть что реально пришло на комп и был ли ответ.
друзья посмотрел трафик wireshark идущий к ардуине - 192.168.0.241 от компа 192.168.0.202 и вижу отдни пакеты RST что говорит о том что ардуина скидывает соеденение.

Ниче не понимаю, помогите понять, почему?
Эти пакеты RST появляются при попытке отправить данные из php в ардуину методом fsockopen.
Друзья переломал все копья! Силы кончались, Неделя гугления завела в тупик.
Ни как не работает 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
Перегуглил за неделю все что только можно было, прошу выдвигать даже бредовые версии, все пойдет в работу. Руки уже опустились.