Теория:
Это продолжение статьи Ethernet - устройство на микроконтроллере AVR. Аппаратная часть осталась той же самой (ENC28J60 + Atmega88). Программа изменилась, теперь она реализует еще и web сервер.
Теперь, вместо использования программы из командной строки и посылки UDP пакетов к Ethernet устройству, мы можем просто настроить на него наш web браузер. К программе добавился только web сервер, и вся основанная на UDP функциональность сохранилась. Можно использовать обе возможности.
Программа написана на Си и в памяти микроконтроллера осталось еще много свободного места.
Введение
Командный интерфейс UDP вполне достаточен для большинства приложений, но интегрированный web сервер гораздо более универсален и прост в использовании. Как сделать web сервер на микроконтроллере Atmega88?
Прежде чем взяться за этот Ethernet проект, я разумеется, сделал некоторое моделирование, и уже тогда я заметил, что UDP не создаст проблем с нехваткой места в памяти микроконтроллера Atmega88. Я был вполне уверен, что и TCP + http будет работать. TCP/IP был изобретен более 25 лет назад. Сейчас микроконтроллеры обеспечивают почти туже самую вычислительную мощность, как у компьютеров тех времен. В те годы не использовались не java не xml, все делалось простыми и эффективными путями.
Таким образом мы имеем вполне реальный web сервер на микроконтроллере Atmega88.
TCP полностью автоматический
TCP это протокол, в котором устанавливается соединение. Для этого сначала должен произойти обмен множеством пакетов, и обе стороны соединения должны пройти через несколько состояний [смотрите TCP полностью автоматический в rfc793]. После того, как соединение было установлено, множество пакетов данных может быть послано. Счетчики и автомат TCP гарантируют, что данные прибудут в правильном порядке и без потерь.
Большие web страницы могут потребовать посылки множества пакетов данных, маленькие страницы – меньше. Как много должны посылать мы?
Давайте посмотрим на программу, представленную в первой статье. В этой статье мы всего лишь переключали реле через Ethernet. Это можно было сделать, используя простую web страницу, подобную этой:
Output is: ON Switch off |
Рисунок 1. Пример web страницы для Ethernet устройства удаленного переключения.
В других приложениях может быть реализовано измерение температуры или давления воздуха. Для всех этих приложений потребуются маленькие web страницы с небольшим количеством данных. Другими словами, посылки менее 100 байт данных будет вполне достаточно для всего, включая все html теги.
Как много пакетов данных должно быть послано для такой страницы?
Всего один!
Особенность использования TCP в том, что один из участников соединения может посылать более одного пакета данных, но нам не нужна такая функциональность. Нам нужен TCP, лишь потому, что HTTP базируется на нем, а мы хотим использовать HTTP.
Принимая во внимание то, что нам не придется посылать более одного пакета данных, весь TCP протокол вместе с механизмом управления соединением может быть существенно упрощен. Мы можем , таким образом, посылать пакет FIN немедленно, вместе с данными. Это очень сильно упрощает механизм управления соединением при его закрытии.
С учетом всего этого, вполне возможно осуществить web сервер в Atmega88, при этом не менее 50% памяти контроллера остается свободной.
Удаленное Ethernet устройство со встроенным web сервером: включение и выключение чего ни будь
Программа в пакете eth_rem_dev_tcp-2.X реализует простой переключатель. С его помощью вы можете что ни будь включать или выключать. Простой механизм пароля обеспечивает очень простую защиту, не позволяя не авторизованным пользователям переключать устройство.
Ниже представлен снимок экрана с web страницей, сгенерированной устройством:
Рисунок 2. Встроенный в Atmega88 web сервер, снимок экрана с браузером mozilla firefox.
Web – сервер на микроконтроллере, посылающий единственный пакет данных
Код доступен в конце статьи и я кратко объясню его. Надеюсь, после этого вы будете способны модифицировать его и адаптировать для других применений. Наш web сервер с одним пакетом данных при работе проходит следующие состояния TCP.
- Прием SYN
- Отправка SYN, ACK
- Прием ACK (сейчас соединение установлено)
- Прием ACK с HTTP командой GET
- Отправка ACK
- Отправка FIN, ACK с данными HTTP (код 200 ОК)
- Прием FIN? ACK
- Отправка ACK
Легко заметить, что это довольно таки простая последовательность команд и действий. Все необходимые функции я реализовал в файле ip_arp_udp_tcp.c. В файле main.c реализован цикл приема данных. В этом цикле имеется множество условных переходов, в порядке того, какое действие должно быть выполнено. Здесь вы также можете увидеть, как код разветвляется между UDP и TCP с портом 80 (web сервер). Если вы захотите осуществить вашу собственную функциональность (например, считывать данные с датчиков температуры, давления воздуха, чего угодно…), вам потребуется только изменить код перед вызовом функции print_webpage и код самой функции print_webpage, так, чтобы она генерировала вашу собственную web страницу. Этот код находится в файле main.c. Файл enc28j60.c реализует драйвер для микросхемы Ethernet контроллера enc28j60. Вам не следует беспокоиться по поводу файла enc28j60.c.
Рисунок 3
Вы можете получить web сервер, просто загрузив новую программу в микроконтроллер.
Создание и загрузка программы в микроконтроллер
Распакуйте пакет eth_rem_dev_tcp-2.X (командой tar -zxvf eth_rem_dev_tcp-2.X чтобы распаковать, загрузить программу можно в конце статьи). Подробные инструкции есть в файле README включенном в пакет eth_rem_dev_tcp-2.X.
Затем вам надо задать IP адрес для вашего устройства. Для этого отредактируйте 3 строчки в файле main.c:
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {10,0,0,24};
static char baseurl[]="http://10.0.0.24/";
Для первого устройства вам не понадобиться менять строку с mymac. Но вам вероятно потребуется изменить IP адрес (параметр myip). Это должен быть свободный адрес из диапазона адресов вашей сети.
(Если все же вы решили использовать обращение к устройству по имени, а не по IP адресу, третью строчку следует также изменить, прописав в ней вместо адреса имя устройства:
static char baseurl[]="http://ИМЯ/";
прим. перев).
Здесь представлен диапазон частных IP адресов (не маршрутизируемых в интернете), которые вы можете использовать:
Маска подсети Сетевые адреса
255.0.0.0 10.0.0.0 - 10.255.255.255
255.255.0.0 172.16.0.0 - 172.31.255.255
255.255.255.0 192.168.0.0 - 192.168.255.255
Например: ваш WIFI маршрутизатор может иметь IP адрес 192.168.1.1, ваш компьютер может иметь адрес 192.168.1.12. это означает, что вы можете использовать адрес 192.168.1.10 и оставить некоторый диапазон адресов для других компьютеров в сети. Если вы используете в сети протокол DHCP, проверьте, чтобы этот адрес не дублировался в сети (исключите его из диапазона DHCP).
Теперь скомпилируйте программу командой "make", загрузите файл eth_rem_dev.hex в микроконтроллер. Откройте web браузер и наберите в адресной строке: http://Ваш_IP_адрес/secret.
Леко;-)
Производительность
Встроенные системы обычно маленькие, маленькие не только физически, но также в смысле объема памяти и производительности CPU.
Все, реализованные в таких системах протоколы TCP/IP таким образом имеют гораздо меньшее максимальное количество параллельных пользователей (2-5 параллельных http соединений).
Реализуя TCP/IP, tuxgraphics использовал другой подход. Количество данных, которое мы хотим показать очень маленькое. Возможно, вы захотите отображать показания присоединенных датчиков или переключать что ни будь. Для всего этого вам потребуется всего лишь несколько байт данных. Мы ограничили размер web страницы нескольким сотнями байт. С этим ограничением, нам не потребуется ограничивать количество параллельных соединений.
AVR микроконтроллер имеет удивительный процессор. Большинство операций выполняется за один такт. С TCP/IP, реализованным tuxgraphics, на этом контроллере мы реально можем получить верх производительности, выходящий за пределы этого web сервера. В нем нет жестко запрограммированного ограничения числа пользователей и он может обслужить сотни web страниц в секунду. Некоторые web серверы, реализованные на небольших персональных компьютерах не смогут дать такой производительности.
Загрузки и ссылки
- Страница загрузок для данной статьи: программы the eth_rem_dev, схемы, обновленное ПО.
- Предыдущая статья с описанием устройства Ethernet –устройство на микроконтроллере AVR.