Клиент Arduino uno+enc28j60+Apache
- Войдите на сайт для отправки комментариев
Сб, 21/01/2017 - 21:50
Здравствуйте, делаю тестовый веб-клиент на базе arduino uno+enc28j60+ubuntu(с установленным LAMP). Код ардуино:
// Библиотека для работы с сетевой картой #include <EtherCard.h> // Буффер сетевой карты byte Ethernet::buffer[200]; // Адрес сайта на который будем стучаться (в моем случае он запускается на одном с сервером IP) const char website[] PROGMEM = "192.168.1.2"; //Замените на ip адрес вашего компьютера // IP адрес сервера. static byte websiteip[] = { 192,168,1,2 }; //Замените на ip адрес вашего компьютера static uint32_t timer; // Действия после успешной отправки данных //Мак-адрес устройства static byte mac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; //функция колбэка (нелбходима для обраюотки полученных данных) static void callback (byte status, word off, word len) { Serial.println(">>>"); Ethernet::buffer[off+300] = 0; Serial.print((const char*) Ethernet::buffer + off); Serial.println("..."); } // Функция отправки данных на сервер void send_package(){ ether.packetLoop(ether.packetReceive()); if (millis() > timer) { Serial.println(F("<<PING")); timer = millis() + 5000; ether.browseUrl(PSTR("192.168.1.2?"),"user_name=i_love_arduno", website, callback); } } void setup () { Serial.begin(9800); if (ether.begin(sizeof Ethernet::buffer, mac,8) == 0) Serial.println(F("Failed to access Ethernet controller")); else Serial.println(F("Successfully to access Ethernet controller")); if (!ether.dhcpSetup()) Serial.println(F("DHCP failed")); else Serial.println(F("Successfully DHCP")); memcpy(ether.hisip, websiteip, sizeof(websiteip)); ether.printIp(F("SRV: "), ether.hisip); } void loop () { //отправляем данные send_package(); }
код сайта размещенный на сервере (php):
<?php if (isset($_GET['user_name'])) { echo "<h2>Сервер отвечает:</h2>"; echo "Ваше имя:<strong>".$_GET['user_name']."</strong></br>"; } ?>
Код сайта размещенный на сервере прекрасно работает если подключить компьютер к роутеру и зайти на него например с планшета. Проблема заключается в том, что клиент, выполненный на arduino не отправляет get-запрос на сервер (компьютер)
Попробуйте библиотеку:
https://github.com/ntruchsess/arduino_uip
Потом в примере:
#include <Ethernet.h>
Заменить на:
#include <UIPEthernet.h>
Ну и адаптировать под свои нужнды.
Проблема заключается в том, что клиент, выполненный на arduino не отправляет get-запрос на сервер
С чего Вы взяли? Вы смотрели лог сервера? Посмотрите. Почти уверен, что отпрпавляет. Что там за запрос - другое дело.
Сравните свой код
с описание метода broweURL
Ну как, разницу видите? Первым параметром должен быть фолдер, а вторым - имя файла на сервере, а у Вас что?
Переписал: ether.browseUrl(PSTR("/cgi-bin/handler.py?"),"cxem=i_love_arduno", website, callback); не работает все равно
А как enc28j60 назначить статический ip-адрес, т. к. она напрямую подключена к компьютеру, а в коде подключение судя по всему происходит через роутер
Переписал: ether.browseUrl(PSTR("/cgi-bin/handler.py?"),"cxem=i_love_arduno", website, callback); не работает все равно
Так, Вы вообще читали описание параметров? Перечитайте ещё раз. Столько раз, сколько будет нужно, чтобы понять то, что я Вам писал: 1-ый параметр - фолдер, 2-ой - имя файла. А у Вас что? То, что Вы написали - бред сивой кобылы.
И ... опять же повторяю во второй раз ... читайте Вы наконец лог сервера, там бы всё увидели, что не туда обращаетесь.
А как enc28j60 назначить статический ip-адрес, т. к. она напрямую подключена к компьютеру, а в коде подключение судя по всему происходит через роутер
На кой чёрт клиенту статический адрес? Если сильно приспичило - обратитесь к администратору Вашей сети. Откуда кому знать как там у Вас что назначается.
По вашему выходит устройству ip вообще не нужен? Этот бред сивой кобылы расположен на cxem.net!!!
И этот бред прекрасно работает на компьютере!
По вашему выходит устройству ip вообще не нужен?
Статический? Клиенту? Нет, не нужен.
Этот бред сивой кобылы расположен на cxem.net!!!
И этот бред прекрасно работает на компьютере!
Что работает на компьютере? ether.browseUrl? Круто!
В общем, так, описания параметров я Вам дал. Там всё понятно написано. Вы по неизвестной мне причине их используете неправильно и, похоже, упёрлись и правильно использовать не хотите - дело Ваше, успехов!
vitalikost, этот код в котором CS=10 пин, а как заменить на 8-й? Может 45-ю строку изменить:
if
(Ethernet.begin(mac) == 0,8)
А какой нужен ip клиенту тогда?
[quote=ЕвгенийП]
Да хоть на заборе, мне без разницы. Если функция ожидает имени файла, а Вы ей передаёте "i love arduino", то перестаньте плакать, что она не работает.
Файл - это я как понимаю обработчик запроса? А фолдер это что такое?
Если не получает от роутера IPAddress ip(192,168,1,199)
Как сменить пин, не знаю, у меня все по умолчанию
Так роутера и нет. Копм-кабель-модуль
Динамический. При каждом запуске ему дают какой-нибудь свободный.
А разве этот динамический айпи не компьютеру дается? Файл - это я как понимаю обработчик запроса? А фолдер это что такое?
Файл - это я как понимаю обработчик запроса? А фолдер это что такое?
Директория.
В Вашем случае файл находится в директории cgi-bin и называется handler.py , правильно? Если так, то должно быть примерно :
А разве этот динамический айпи не компьютеру дается?
А Ваш сетевой шилд или что там у Вас - это и есть "компьютер". Ему также всё должно даваться, как любому другому клиенту. Для этого нужно нормально сконфигурировать сеть. У Вас есть администратор или это домашняя сеть? В любом случае, конфигурировать её надо.
Но, Вы бли в лог-то сервера гляньте, который раз уж прошу! К нему вообще запросы приходят? Если приходят, то всё нормально с адресами.
В лог ничего не приходит
Когда тестировал питоновский скрипт, в логе указывалось дата, время, какой запрос (get), файл-обработчик, переданная переменная. А сейчас пусто
шилдту ничего не дается
Тогда сконфигурируте сеть нормально. Он должен получать адрес.
А какие могут быть направления для конфигурирования?
Обратиться к сисадмину. Если это домашняя сеть, то пригласить знакомого сисадмина, угостить его пивом и попросить сконфигурировать сеть. ну или самому освоить сисадминство.
Моя сеть включает шилдт и комп
Без роутера? Порт компа может автоматически определять направление передачи или кабель кроссовер?
Без роутера
Андрей, ну роутер можно запустить на компьютере программно. Просто позовите грамотного сиадмина, объясните ему что Вы хотите иметь второе устройство и он сделает.
Хорошо, попробую
Роутер не нужен, если кабель кросс. Роутер нужен, если нужно раздавать адрес по DHCP или есть два пачкорда, а кросса нет . Если использовать статические адреса то всё работает без роутера. http://www.linuxdvr.ru/rus/docs/crossover.html
nik182, ТС не сделает этого сам, только мучиться будет. Пусть пригласит знакомого админа и тот решит проблему.
Я хочу сказать, что соединив обычным прямым пачкордом кабелем TC ничего не получит, даже если поднимет роутер на компе. Если возмёт кроссовер ( например http://www.eldorado.ru/cat/detail/71086317/ ) то связь будет. И даже без приглашения сисадмина.
Установил и настроил на ubutu сервер dhcp - теперь хоть айпишник шилдт назначается
Установил и настроил на ubutu сервер dhcp - теперь хоть айпишник шилдт назначается
Молодец!
Ну, если нормально назначается, то дальше победите.
А версия arduino ide может играть роль?
Шилдт все равно не отправляет данные
И не срабатывает функция callback
Пробовал пинговать с компа-пингуется, в логе сервера то шилда ничего нет
Проверил работу скрипта на сервере введя в адресной строке браузера: 192.168.0.10/handler.py?cxem=i_love_arduino
дайте сюда текущий скетч как он есть
имя папки
Полный путь к index.php: /var/www/html/index.php
Вы писали
Проверил работу скрипта на сервере введя в адресной строке браузера: 192.168.0.10/handler.py?cxem=i_love_arduino
А в скетче у Вас 192.168.0.10/index.php?user_name=arduino
Это нормально? на сервере есть такой файл? Вы его (именно так) проверяли из браузера?
Дальше, Вы печатаете IP в строках 49, 50 - нормально печатаются?
И последнее, в логе web-сервера точно ничего по-прежнему нет?
Да я набрал в адресной строке: 192.168.0.10/index.php?user_name=arduino и сервер ответил нормально на запрос
Файл index.php на сервере имеется
IP в строках 49, 50 печатаются нормально. IP шилдта 192.168.0.21, компьютера 192.168.0.10
Так, а браузер на том же компьютере, что и сервер? А на этом компьютере нет какого-нибудь фаирвола, виндовс-дефендера или ещё какой хрени такого же типа? Если есть есть, посмотрите их логи, может они блокируют?
А вообще, Вы зря пренебрегаете моим советом, пригласить знакомого сисадмина. Он быстро отследит Ваш запрос и найдёт где он затыкается. Так заочно это очень трудно сделать.
С браузера другого компьютера тоже все хорошо работает
Ну, попробуйте более низкоуровневые вызовы, хотя, самое лучшее - позовите сисадмина, поставьте пиво и решите проблему.
Хорошо, попробуем с сисадмином понервничать