Подключение микроконтроллера к локальной сети: HTTP и CGI (заключение)

Краткое содержание:
- Идея
- Сторона сервера
- Сторона клиента
- Заключение
Кроме того, в этой небольшой части мы коснёмся такой странной штуки, как javascript)
Идея
Допустим, мы хотим, чтобы на страничке была всякая полезная инфа, а также формы и прочий гуй.
Когда мы только начали играться с HTTP, то отдавали данные вместе со страничкой, генерируя страничку на лету, вместе с данными. Если мы отдаём страничку из файла, всё сложнее. Можно, конечно, вставить на страничку теги, которые следует заменить на те или иные полезные данные. Но это медленно и сложно)
Есть другой способ — можно реализовать на сервере простейшие «CGI-модули», которые будут отдавать/принимать ту или иную информацию, и дёргать их непосредственно с HTML-странички аяксом.
Реализуем для примера 2 CGI-модуля. Один будет управлять светодиодиком, другой считывать данные с DS1820.
Сторона сервера
На стороне сервера, при получении запроса, разбираем запрашиваемый URL. Если URL начинается на "/cgi-bin", передаём запрос обработчику CGI-запросов. Иначе рассматриваем URL как имя файла.

Таким образом, URL принимает такой вид:
/просто/путь/к/файлу
Или такой:
/cgi-bin/(имя модуля)/(команда)/?параметр1=значение1&...
Обработчик запросов. Разбираем полученный URL и заполняем структуру httpd_state_t, из которой сервер (про который я писал в предудщей части ;) ) будет брать данные для ответа клиенту.
void httpd_request(uint8_t id, httpd_state_t *st, char *url)
{
uint16_t len;
// запрошен индексный файл?
if(!strcmp_P(url, PSTR("/")))
url = "/index.htm";
// значения по умолчанию
st->statuscode = 4; // ошибка 404
st->cursor = 0;
st->numbytes = 0;
if(!memcmp_P(url, PSTR("/cgi-bin"), 8))
{
// вызываем обработчик CGI-запроса
if((len = cgi_exec(id, url+8, st->data.ram)))
{
st->statuscode = 2; // статус: 200 OK
st->type = http_text_plain; // тип: text/plain
st->data_mode = HTTPD_DATA_RAM; // источник: буфер в памяти
st->numbytes = len; // длина блока
}
}
else
{
// пробуем открывать файл
if(!f_open(&(st->data.fs), url, FA_READ))
{
st->statuscode = 2; // статус: 200 OK
st->type = httpd_get_mime_type(url); // тип данных
st->data_mode = HTTPD_DATA_FILE; // источник: файл
st->numbytes = st->data.fs.fsize; // длина файла
}
}
// документ не найден - возвращаем страничку с ошибкой 404
if(st->statuscode == 4)
{
st->type = http_text_html; // тип: text/html
st->data_mode = HTTPD_DATA_PROGMEM; // источник: флешка
st->data.prog = http_not_found; // страничка 404
st->numbytes = sizeof(http_not_found)-1; // длина странички
}
}
При получении CGI-запроса, вызывается обработчик cgi_exec.
uint16_t cgi_exec(uint8_t id, char *url, char *buf, cgi_callback_t *callback)
{
char *param;
// отрезаем строку параметров
if((param = strchr(url, '?')))
*(param++) = 0;
// вызываем модуль cgi_led
if(memcmp_P(url, PSTR("/led"), 4) == 0)
return cgi_led_exec(url+4, buf);
// вызываем модуль cgi_ds1820
if(memcmp_P(url, PSTR("/ds1820"), 7) == 0)
return cgi_ds1820_exec(url+7, buf);
return CGI_NOT_FOUND;
}
Этот обработчик вытаскивает из URL имя модуля и передаёт запрос ему. Пока у нас есть модуль cgi_led (для управления светодиодом) и модуль cgi_ds1820 для получения данных с ds1820.
/*
* модуль cgi_led
*/
// макросы для светодиодика
#define TEST_LED_PORT PORTB
#define TEST_LED_DDR DDRB
#define TEST_LED_BIT (1<<PB1)
#define test_led_state() ((TEST_LED_PORT & TEST_LED_BIT) ? 0 : 1)
#define test_led_on() TEST_LED_PORT &= ~TEST_LED_BIT
#define test_led_off() TEST_LED_PORT |= TEST_LED_BIT
#define test_led_init() TEST_LED_DDR |= TEST_LED_BIT; test_led_off()
// обработчик запроса
uint16_t cgi_led_exec(char *action, char *buf)
{
if(strcmp_P(action, PSTR("/on/")) == 0)
test_led_on();
else if(strcmp_P(action, PSTR("/off/")) == 0)
test_led_off();
else if(strcmp_P(action, PSTR("/state/")) != 0)
return CGI_NOT_FOUND;
*buf = test_led_state() + '0';
return 1;
}
// инициализация модуля
#define cgi_led_init() test_led_init()
/*
* модуль cgi_ds1820
*/
// переменные
int ds1820_temp = 0x7fff; // текущее значение
uint32_t ds1820_start_time; // время сделующего опроса датчика
uint8_t ds1820_converted; // опрос датчика запущен
// обрабочик запроса
uint16_t cgi_ds1820_exec(char *url, char *buf)
{
uint8_t temp, len;
if(!strcmp_P(url, PSTR("/value/")))
{
// нет данных - возвращаем "N/A"
if(ds1820_temp == 0x7fff)
{
memcpy_P(buf, PSTR("N/A"), 3);
return 3;
}
// форматируем строку со значением температуры (например, "-12.3")
itoa(ds1820_temp>>4, buf, 10);
len = strlen(buf);
temp = ((abs(ds1820_temp) & 0x0f) * 10 + 7) >> 4;
if(temp) {
buf[len++] = '.';
buf[len++] = '0'+temp;
}
return len;
}
return CGI_NOT_FOUND;
}
// вызывается периодически для опроса датчика
void cgi_ds1820_poll()
{
if(rtime() >= ds1820_start_time)
{
if(ds1820_converted)
ds1820_temp = ds1820_read();
else
ds1820_temp = 0x7fff;
ds1820_converted = ds1820_start();
ds1820_start_time = rtime() + 3;
}
}
Пока можно проверить работоспособность наших модулей, просто введя соответствующий URL в браузере.

Сторона клиента
Добавим на HTML-страничку блоки, которые послужат нам каркасом для получения и отправки данных на сервер.
<!-- LED -->
<div id="led-control">
<p>Управление светодиодиком:</p>
<img id="led-on" src="i/led-on.gif">
<img id="led-off" style="display: none;" src="i/led-off.gif">
</div>
<!-- DS1820 -->
<div id="ds1820-example">
<p>Температура:</p>
<div id="ds1820-value">N/A</div>
</div>
Принимать и отправлять данные на сервер будем с помощью аякса. Чтобы не выносить себе мозг этими XMLHttpRequest, воспользуемся эпичной библиотечкой jQuery. С использованием этой либы наш код упрощается до идиотизма)
Для чего идет подгрузка скриптов (либа Jquery и наш скрипт), которые лежат на флешкарте, вместе со всеми файлами. Если открыть index.htm то вначале будет
<head>
<title>Embedded Web Server</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/custom.js"></script>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
Собственно это оно и есть. js/jquery.js — библиотека, а в js/custom.js мы прописываем уже наше управление светодиодиком:
// Вызывается при изменении состояния светодиодика
function led_state(state)
{
switch(state) {
case '0':
// выключен - показываем кнопочку on
$("#led-on").show();
$("#led-off").hide();
break;
case '1':
// включен - показываем кнопочку off
$("#led-off").show();
$("#led-on").hide();
break;
}
}
// обновляем состояние светодиодика
function led_update() {
// запрашиваем состояния с сервера
$.get("/cgi-bin/led/state/", null, led_state);
// каждые 5 секунд)
window.setTimeout(led_update, 5000);
}
// в начале,
function led_init()
{
// привязываем действие к кнопке on
$("#led-on").click(function() {
// зажечь диодик
$.get("/cgi-bin/led/on/", null, led_state);
});
// привязываем действие к кнопке off
$("#led-off").click(function() {
// погасить диодик
$.get("/cgi-bin/led/off/", null, led_state);
});
// обновляем состояние диодика каждые 5 секунд
led_update();
}
Получение данных с DS1820:
function ds1820_update()
{
// получаем с сервера значение
$.get("/cgi-bin/ds1820/value/", null, function(val) {
// и вставляем его в блок на страничке
$("#ds1820-value").html(val + "°");
});
// каждые 5 секунд
window.setTimeout(ds1820_update, 3500);
}
Раз уж мы взялись за яваскрипт, можно немного позлорадствовать)
if(navigator.appName == "Microsoft Internet Explorer")
window.location = "http://lleo.aha.ru/na/";
Инициализация всего хозяйства:
$(document).ready(function() {
led_init();
ds1820_update();
});
Осталось добавить CSS'ку и получаем вот такие штучки:

Заключение
В этой части мы рассмотрели ещё один вариант работы с HTTP. Он может быть полезен, например, если ты захочешь сделать какой-то мегадевайс с навороченной админкой. Либо, скажем, поднять свою домашнюю страничку на микроконтроллере)
Следующая часть будет посвящена описанию TCP/IP стека, который мы тут соорудили по ходу дела)
Скачать проект: chatek.zip.

Все статьи цикла
- Подключение микроконтроллера к локальной сети: Теория
- Подключение микроконтроллера к локальной сети: работаем с ENC28J60
- Подключение микроконтроллера к локальной сети: UDP-сервер
- Подключение микроконтроллера к локальной сети: UDP-клиент
- Подключение микроконтроллера к локальной сети: Широковещательные сообщения и DHCP
- Подключение микроконтроллера к локальной сети: TCP-клиент
- Подключение микроконтроллера к локальной сети: HTTP и CGI
- Подключение микроконтроллера к локальной сети: TCP и HTTP (продолжение)
- Подключение микроконтроллера к локальной сети: HTTP и CGI (заключение)
- Подключение микроконтроллера к локальной сети: тесты производительности и краткое описание API стека
- Подключение микроконтроллера к локальной сети: Заключение
- Веб сервер на Tiny2313. Чисто ради лулзов
- +20
- 30 апреля 2011, 18:13
- Lifelover
Спасибо LifeLover за отличный цикл статей!
К своему заказу в ЧИП-НН добавил ENC28J60 и разъем с интегрированными трансформаторами. Буду экспериментировать! :)
К своему заказу в ЧИП-НН добавил ENC28J60 и разъем с интегрированными трансформаторами. Буду экспериментировать! :)
Кайфово вышло. Такую тему осветил. Благодарность безграничная. Теперь бы ее самому освоить…
- slavaprokopiy
- 30 апреля 2011, 19:43
- ↓
Демка конечно весьма забавная и эффектная, но честно говоря — не разделяю общего восторга. Это все не столь сложно (точнее — вообще не сложно, разве что RFC-шки объемные вкуривать надо) в проектировании и реализации. Правда, я программист. Чтобы меня впечатлить в области программирования — надо быть Александреску :)
Тут дело даже не в восторге от программирования, а от самой идеи. Если раньше те, кто осваивали микроконтроллеры самостоятельно, видели только статьи и уроки о том как сделать автономное устройство: моргалку, кодовый замок, звонок, робота и т.п… И как-то далеко это все было от веб-технологий. То тут МК освещен немного под другим ракурсом. Да, может быть, технически и программно это отнюдь не сложно, тем более для знающих людей, но для основной массы любителей, да и для некоторых опытных в электронике челобаков в этом цикле статей есть что почепнуть.
- slavaprokopiy
- 30 апреля 2011, 20:16
- ↑
- ↓
Согласен с Vga, что можно было и самому тему поднять, раскуривая мануалы. Но в том то и дело, что надо было бы самому совершать много проб и ошибок, а тут тебе все разжевано.
- slavaprokopiy
- 30 апреля 2011, 20:18
- ↑
- ↓
В принципе, идея тоже легко в голову приходит — достаточно пообщаться с вебмордой роутера) Вот AVR+Ethernet — это чуть сложнее в голову приходит. Хотя я по прежнему сомневаюсь в применимости такой связки — разумней взять проц помощнее и с встроенным PHY — оно будет и дешевле, и веб-морда не будет откусывать 95% ресурсов.
Но в том то и дело, что надо было бы самому совершать много проб и ошибок, а тут тебе все разжевано.Ну не настолько уж разжевано в последних статьях, да и тут больше курить документацию на протоколы. Познакомился с этим делом, когда писал свой BT-трекер)
В одной из первых статей же пояснялось. Реализация физического уровня Ethernet. Я имел в виду МК, куда встроен полный Ethernet — так, что снаружи остается только повесить MAG и гнездо. Такие девайсы, AFAIK, есть в серии STM32F107, а стоит она пожалуй поменьше, чем старшая мега и ENC28J60.
Там PHY нету. Так что еще одну микросхему надо вешать. Полностью, на всем готовом, делает только Luminary, но там цена за камень рублей 300 емнип, и еще хрен где купишь.
Возможно, я этот вопрос не исследовал. Просто помнится, что где-то я видел упоминание довольно недорогих АРМов с ФИ. Впрочем, реалтековские PHY, говорят, стоят дешево.
Опять же, я этот вопрос не прорабатывал, но тут пробегала ссылка на софт-МАС на авр-ке, а там написано такое:
Потом взгляд переместился на микросхемы PHY, и, при внимательном изучении, оказалось, что довольно просто обеспечить работу с PHY при тактовой проца 20МГц. Да и со стоимостью нет вопросов — Realtek'овский RTL8201BL стоит всего около 1$ (как заметил zltigo, Realtek вообще славится экстремально дешевыми решениями в области Ethernet).Правда, в промэлектронике его нету, а где брал автор — хз.
дофига вас таких
это не сложно это фигня
ты на деле реализуй и проделай такой
же обьем работы по описанию
потом посмотрим
это не сложно это фигня
ты на деле реализуй и проделай такой
же обьем работы по описанию
потом посмотрим
В идеале картинкой, но походу это очень не просто сформировать графический файл в контроллере. Хотя руки дойдут я попытаюсь. Если очень муторно можно и другими средствами, лишь бы каждый браузер (даже мобильный) поддерживал.
Не думаю, что формировать картинку — разумно. Тем более что сформировать удастся разве что BMP.
А чем SVG для графиков не устраивает?
А чем SVG для графиков не устраивает?
PNG является инет-форматом. У него есть «близкий к BMP» вариант без упаковки. Когда просто массив пикселей загоняется. Тогда картинку не надо хранить в памяти, а генерировать нужные блоки на лету.
Приветствую всех! Спасибо большое за цикл статей! Помогите со схемой получившегося девайса...(я программист в железе слабоват, но так хочется его покодить)…
советую купить готовое железо
не советую вникать в схемотехнику и электронику если хочитса просто покодить
затянет еще и бросишь свои компутеры и станеш как я задротом электронным))))
шутко
а если серьозно то берешь дихалтовскую пинборд(или както так)
докупаеш на ебее езернет шилд на 28j60 (копейки стоит)
и можно кодить
не советую вникать в схемотехнику и электронику если хочитса просто покодить
затянет еще и бросишь свои компутеры и станеш как я задротом электронным))))
шутко
а если серьозно то берешь дихалтовскую пинборд(или както так)
докупаеш на ебее езернет шилд на 28j60 (копейки стоит)
и можно кодить
вот например
www.ebay.com/itm/ENC28J60-Network-Module-Schematic-51-STM32-LPC-AVR-/260875093296?pt=BI_Electrical_Equipment_Tools&hash=item3cbd5e0530
www.ebay.com/itm/New-Verison-ENC28J60-Ethernet-LAN-Module-Arduino-AVR-LPC-STM32-/180736269187?pt=LH_DefaultDomain_0&hash=item2a14b89b83
www.ebay.com/itm/Arduino-ENC28J60-Ethernet-LAN-Module-Bare-PCB-/280747171405?pt=LH_DefaultDomain_0&hash=item415dd5de4d
www.ebay.com/itm/ENC28J60-Network-Module-Schematic-51-STM32-LPC-AVR-/260875093296?pt=BI_Electrical_Equipment_Tools&hash=item3cbd5e0530
www.ebay.com/itm/New-Verison-ENC28J60-Ethernet-LAN-Module-Arduino-AVR-LPC-STM32-/180736269187?pt=LH_DefaultDomain_0&hash=item2a14b89b83
www.ebay.com/itm/Arduino-ENC28J60-Ethernet-LAN-Module-Bare-PCB-/280747171405?pt=LH_DefaultDomain_0&hash=item415dd5de4d
Спасибо за ответ, но тут продают готовый девайс, причем один из них на STM или печатка, мне же нужна принципиальная схема. Все схемы, что я видел в google – в схеме ATMega тактируется от ENC, для согласования ставят делитель на резисторах, но хочется надежности работы от устройства — поэтому хочу тактировать от кварца и для согласования использовать буферы…
Если судить по исходникам проекта в статьях то на разработку достаточно будет ATmega16/32, тактирование идет от кварца 16МГц, все бы хорошо, но я не понимаю как enc28j60 и CD/MMC подключить к одному SPI ATMega.
Карта памяти и ENC питаются от 3в а кристал от 5в, каким образом развести соединение SPI через согласующие буферы, например такие как 74lvx08 и 74ac125.
Если судить по исходникам проекта в статьях то на разработку достаточно будет ATmega16/32, тактирование идет от кварца 16МГц, все бы хорошо, но я не понимаю как enc28j60 и CD/MMC подключить к одному SPI ATMega.
Карта памяти и ENC питаются от 3в а кристал от 5в, каким образом развести соединение SPI через согласующие буферы, например такие как 74lvx08 и 74ac125.
Мона и напрямую подключать к 5-вольтовой межке. У енки ножки 5в-толерантные.
Вот статейка о согласовании есть.
Впрочем, новые межки с буквой А работают от 3,3В (да и без буквы нормально работают). Так что я всё тупо от 3,3В питал :)
Вот статейка о согласовании есть.
Впрочем, новые межки с буквой А работают от 3,3В (да и без буквы нормально работают). Так что я всё тупо от 3,3В питал :)
Вот для надежности его от енки и тактируют. Да и вообще, судя по тому, что я слышал — енка и надежность вещи несовместимые.
но я не понимаю как enc28j60 и CD/MMC подключить к одному SPI ATMega.Стандартно. Все линии параллельно заводим на все микросхемы, только линию CS (она же SS) выдаем каждой микре отдельную. При работе довим CS только нужной микры и общаемся с ней так, как будто на шине больше никого нет.
подтверждаю)))
а вот насчет карты
если ты собрался юзать FAT
и отдавать сайт не упакованный прямо с файловой системы
то нужен контроллер с кучей памяти
стек+фат(я юзаю микрочиповские стек+фат) у меня отжирают 60К памяти
думаю тут чуток поменьше но точно не меньше 24К выйдет(впрочим могу ошибаться)
а вот насчет карты
если ты собрался юзать FAT
и отдавать сайт не упакованный прямо с файловой системы
то нужен контроллер с кучей памяти
стек+фат(я юзаю микрочиповские стек+фат) у меня отжирают 60К памяти
думаю тут чуток поменьше но точно не меньше 24К выйдет(впрочим могу ошибаться)
Приветствую всех. Купил железо, спаял на монтажной плате- все предыдущие проеты работают на ура, ни багов, ни глюков (не проверял только DHСP, т.к. он мне не нужен я его коментил в прошивке) попробовал добавить SD карту на 128Мб, многократно проверял все соединения- но при совместном использовании в схеме с ENC (подключал согласно define на ноги в прошивке) и прошивкой из этого поста, аппарат даже не ping'уется… решил потестить прошивку в Proteus'е, в нем такая же история, хотелось бы узнать в чем проблема может быть и может кто-нибудь сталкивался с этим…
салют, эт снова я!
после продолжительного перерыва опять возник зуд в одном месте, итак:
теперь я имею микросхему atmega16a в DIP корпусе с 40 выводами.
имею плату z28j60 с десятью выводами. (http://mdfly.com/Download/Module/EM2803_SCH.pdf)
источник питания на 5 вольт (USB зарядка)
датчик ds1820
потерялся в схемах, к каким пинам подключается светодиодик (у меня на него тоже планы!) и к каким — датчик. И еще, наверное, нужно согласовывать 3,3В у enc и 5В у atmega?
самое главное! за время перерыва успел систему переставить и все тулчейны пошли прахом, а готовой скомпилированой прошивки нетути! кто подсобит под мегу16?
после продолжительного перерыва опять возник зуд в одном месте, итак:
теперь я имею микросхему atmega16a в DIP корпусе с 40 выводами.
имею плату z28j60 с десятью выводами. (http://mdfly.com/Download/Module/EM2803_SCH.pdf)
источник питания на 5 вольт (USB зарядка)
датчик ds1820
потерялся в схемах, к каким пинам подключается светодиодик (у меня на него тоже планы!) и к каким — датчик. И еще, наверное, нужно согласовывать 3,3В у enc и 5В у atmega?
самое главное! за время перерыва успел систему переставить и все тулчейны пошли прахом, а готовой скомпилированой прошивки нетути! кто подсобит под мегу16?
- ptichkipichuzhki
- 08 февраля 2012, 16:59
- ↓
похоже, судя по даташитам на enc и atmega16a, их можно просто запитать от 3,3 В
датчик глянул — вроде тоже можно питать от 3,0 В.
жаль, что саму ENC нельзя запитывать от 5В.
получится от нокиевской зарядки? прошивка still needed, please!
датчик глянул — вроде тоже можно питать от 3,0 В.
жаль, что саму ENC нельзя запитывать от 5В.
получится от нокиевской зарядки? прошивка still needed, please!
- ptichkipichuzhki
- 09 февраля 2012, 02:06
- ↑
- ↓
похоже, судя по даташитам на enc и atmega16a, их можно просто запитать от 3,3 В
датчик глянул — вроде тоже можно питать от 3,0 В.
жаль, что саму ENC нельзя запитывать от 5В.
Елки-палки… Почему нельзя удалять посты??… А по делу хотел сказать, что запускал ENC от 5В через два диода, соединенных последовательно. Хотел быстренько поиграться, а под руками ничего кроме 5В не было.
ну тут проще — есть 3,3В вроде как.
а вот прошивки нету. sindrom, не пытался, случайно, скомпилировать этот чатик под atmega16?
а вот прошивки нету. sindrom, не пытался, случайно, скомпилировать этот чатик под atmega16?
- ptichkipichuzhki
- 09 февраля 2012, 10:44
- ↑
- ↓
Не, компилировал под мегу128, но только первые примеры из серии статей. Подробностей не помню, но вроде только ноги в дефайнах поменял и больше ничего не трогал.
ковыряю сейчас avr-gcc, пытаюсь сделать makefile под этот проект.
а потом, если получится скомпилировать и все это влезет в 16к, придется выяснять что к какой ноге цеплять… ыыы… )))
сейчас имею серию ошибок
main.o: In function `main':
main.c:(.text+0x20): undefined reference to `mmc_mount'
main.c:(.text+0x26): undefined reference to `lan_init'
main.c:(.text+0x28): undefined reference to `counter_init'
main.c:(.text+0x2a): undefined reference to `cgi_init_all'
main.c:(.text+0x2e): undefined reference to `lan_poll'
main.c:(.text+0x30): undefined reference to `cgi_poll_all'
main.c:(.text+0x32): undefined reference to `lan_up'
не могу понять, это надо в makefile указывать, или где-то в исходниках править?
а потом, если получится скомпилировать и все это влезет в 16к, придется выяснять что к какой ноге цеплять… ыыы… )))
сейчас имею серию ошибок
main.o: In function `main':
main.c:(.text+0x20): undefined reference to `mmc_mount'
main.c:(.text+0x26): undefined reference to `lan_init'
main.c:(.text+0x28): undefined reference to `counter_init'
main.c:(.text+0x2a): undefined reference to `cgi_init_all'
main.c:(.text+0x2e): undefined reference to `lan_poll'
main.c:(.text+0x30): undefined reference to `cgi_poll_all'
main.c:(.text+0x32): undefined reference to `lan_up'
не могу понять, это надо в makefile указывать, или где-то в исходниках править?
- ptichkipichuzhki
- 10 февраля 2012, 19:37
- ↑
- ↓
это где-то в makefile указывается? и если да, то где? пытаюсь найти толковое руководство по makefile с примером конкретно для avr-gcc. пока что нашел два разных синтаксиса, которые якобы для avr-gcc
- ptichkipichuzhki
- 10 февраля 2012, 20:10
- ↑
- ↓
вот! В моем makefile, получаемом в результате выполнения команды avr-project, нет такой переменной. мне сейчас помогло OBJECTS = main.o mmc.o ds1820.o enc28j60.o lan.o httpd.o cgi.o counter.o
теперь вылезла другая ошибка:
httpd.o: In function `httpd_request':
httpd.c:(.text+0xfe): undefined reference to `f_open'
httpd.o: In function `tcp_read':
httpd.c:(.text+0x396): undefined reference to `f_lseek'
httpd.c:(.text+0x4c2): undefined reference to `f_read'
httpd.o: In function `tcp_closed':
httpd.c:(.text+0x64e): undefined reference to `f_close'
mmc.o: In function `mmc_mount':
mmc.c:(.text+0x604): undefined reference to `f_mount'
мне бы вообще без mmc обойтись каким-то образом. буду сейчас смотреть код и убирать лишнее…
теперь вылезла другая ошибка:
httpd.o: In function `httpd_request':
httpd.c:(.text+0xfe): undefined reference to `f_open'
httpd.o: In function `tcp_read':
httpd.c:(.text+0x396): undefined reference to `f_lseek'
httpd.c:(.text+0x4c2): undefined reference to `f_read'
httpd.o: In function `tcp_closed':
httpd.c:(.text+0x64e): undefined reference to `f_close'
mmc.o: In function `mmc_mount':
mmc.c:(.text+0x604): undefined reference to `f_mount'
мне бы вообще без mmc обойтись каким-то образом. буду сейчас смотреть код и убирать лишнее…
- ptichkipichuzhki
- 10 февраля 2012, 20:24
- ↑
- ↓
тэкс, отключил mmc.c, закомментировал все эти f_open, f_read, f_lseek, f_close, скомпилировалось нечто. файл размером 35028 байт. интересно, влезет в atmega16?
avr-size main.hex
text data bss dec hex filename
0 12444 0 12444 309c main.hex
это оно?
и еще, все же, где посмотреть к каким ногам и каким образом цепляется датчик и светодиодик? сжальтесь, не заставляйте в код весь вечер смотреть! :-)
попробую сейчас лапшу развешивать на макетную плату…
avr-size main.hex
text data bss dec hex filename
0 12444 0 12444 309c main.hex
это оно?
и еще, все же, где посмотреть к каким ногам и каким образом цепляется датчик и светодиодик? сжальтесь, не заставляйте в код весь вечер смотреть! :-)
попробую сейчас лапшу развешивать на макетную плату…
- ptichkipichuzhki
- 10 февраля 2012, 20:56
- ↑
- ↓
даже с отключенным mmc? как правильно пользоваться avr-size?
- ptichkipichuzhki
- 11 февраля 2012, 00:56
- ↑
- ↓
и? ds1820 умещался в 2 кб и еще место оставалось. к тому же уважаемый lifelover сам говорил, что с поддержкой mmc в atmega16 проект может не влезть.
имхо проверить можно только прошивкой…
потерял шнурок от программатора :-(
имхо проверить можно только прошивкой…
потерял шнурок от программатора :-(
- ptichkipichuzhki
- 11 февраля 2012, 01:15
- ↑
- ↓
на сколько я понял подключение должно быть следующим iscr.ru/1328912064/ (не стал рисовать делители напряжения и прочее, т.к. это протеус), по размеру прошивка влазит… но почему то устройство молчит и собранное в железе и в протеусе…
Очень полезный цикл статей!
Возник небольшой вопрос: а как сделать обратную операцию — сохранение файла на флешку?
Например, посылаем HTTP запрос GET / HTTP/1.1 img.yandex.net/i/www/logo.png и выставляем флаг загрузки файла. После чего яндекс начнет нам пакетами высылать этот файл. В функции httpd_request() мы копируем содержимое пришедших пакетов на флешку. Таким образом мы сохраним файл img.yandex.net/i/www/logo.png у себя на флешке?
Возник небольшой вопрос: а как сделать обратную операцию — сохранение файла на флешку?
Например, посылаем HTTP запрос GET / HTTP/1.1 img.yandex.net/i/www/logo.png и выставляем флаг загрузки файла. После чего яндекс начнет нам пакетами высылать этот файл. В функции httpd_request() мы копируем содержимое пришедших пакетов на флешку. Таким образом мы сохраним файл img.yandex.net/i/www/logo.png у себя на флешке?
- OSTIN-SUMY
- 10 февраля 2012, 16:59
- ↓
для начала нужно соеденится с сервером используя функцию tcp_open(), указав адрес, порт и локальный порт (в данном случае 80й, HTTPD_PORT). Если неудалось то пробуем снова, а если получилось — формируем пакет и отправляем с помощью tcp_send. Ловим приходящие пакеты, записываем на флешку, по завершению приема — закрываем соединение. Логика такая, или где-то закралась ошибка? :)
- OSTIN-SUMY
- 10 февраля 2012, 18:25
- ↑
- ↓
а какие есть ограничения по передачи данных из браузера, вместо состояния светика 200 байт реально отправить?
- maxlenin1979
- 12 января 2014, 01:31
- ↓
Вдоль и поперёк все прочитал, но так и не понял,
как организовать отправку команды в 80 порт Web-сервера(WIN8/Denwer) на php скрипт.
В команду вложить значение температурного датчика, например DATCH=22.
Занимаюсь Умным Домом, на Arduino это у меня работает, применял там EtherCard библиотеку.
Но хочу перейти на STM32F103xx и вот вроде нащупал что то, но ухватиться не могу.
как организовать отправку команды в 80 порт Web-сервера(WIN8/Denwer) на php скрипт.
В команду вложить значение температурного датчика, например DATCH=22.
Занимаюсь Умным Домом, на Arduino это у меня работает, применял там EtherCard библиотеку.
Но хочу перейти на STM32F103xx и вот вроде нащупал что то, но ухватиться не могу.
we.easyelectronics.ru/GYUR22/stm32-discovery-sdwebenc28j60.html
я портировал этот стэк на STM32, но ввиду каких то косяков (хз каких) теряются пакеты — перешел на W5500 оно поприятнее и попроще будет.
я портировал этот стэк на STM32, но ввиду каких то косяков (хз каких) теряются пакеты — перешел на W5500 оно поприятнее и попроще будет.
Поднять TCP-соединение на сервер (смотри раздел «TCP клиент»), отправить через него HTTP запрос. В простейшем случае он выглядит примерно так:
Пустая строка в конце обязательна, переводы строки — обязательно CRLF. К тому же, GET-запросы могут кэшироваться проксями и прочим, так что может потребоваться добавить команды управления кешированием. А лучше — применить более подходящий метод вроде POST или PUT.
В ответ прилетит сообщение о статусе выполнения запроса, желательно его тоже парсить. Хотя и необязательно, если твой датчик не умеет принимать какие-либо меры, если запрос не прошел.
GET /path/mypage.php?datch=22 HTTP/1.1
Host: myhost.ru
Пустая строка в конце обязательна, переводы строки — обязательно CRLF. К тому же, GET-запросы могут кэшироваться проксями и прочим, так что может потребоваться добавить команды управления кешированием. А лучше — применить более подходящий метод вроде POST или PUT.
В ответ прилетит сообщение о статусе выполнения запроса, желательно его тоже парсить. Хотя и необязательно, если твой датчик не умеет принимать какие-либо меры, если запрос не прошел.
Комментарии (84)
RSS свернуть / развернуть