Хабрахабр

[Из песочницы] Разработка TELNET-сервера на базе W5500 и ATMEGA8

Последнее время большую популярность приобрёл программно-аппаратный комплекс Arduino, который предназначен для разработки различных интересных электронных конструкций. Конструкции изготовляются путём соединения базовой платы Arduino с дополнительными необходимыми модулями. На базовой плате Arduino находится микроконтроллер, прошивка на который пишется в специальной среде разработки для Arduino с использованием, как правило, готовых библиотек на тот или иной модуль.

При этом чаще всего, подразумевается удалённое управление своей конструкцией. Один из модулей – W5500 – предназначен для изготовления электронных конструкций, которые будут связаны с Интернет. Самый тривиальный проект (кроме Hello world) – удалённое включение светодиодов через web-браузер (рис. Например, это может быть «умный дом», робот и тому подобное. Если вместо светодиодов подключить транзисторные ключи и реле, можно коммутировать более мощные нагрузки. 1). Таким образом, по сути, программа (прошивка) данной конструкции представляет собой web-сервер, обрабатывающий http-запросы удалённого пользователя.

Рис. 1. Управление светодиодами через браузер.

3 В (рис. В основе модуля W5500 лежит сам чип W5500 с его обвеской, а также, разъём BLS подключения МК по SPI, разъём RJ-45 для подключения к компьютерной сети, линейный регулятор напряжения питания на 3. 2).

2. Рис. Модуль W5500.

3). Чип W5500 представляет собой полноценный контроллер, в который встроена обработка целого стека сетевых протоколов, начиная от Ethernet и заканчивая TCP (рис. В примере выше (на Arduino) в качестве прикладного протокола используется http. Реализуя конструкцию на базе данного чипа, программисту нет необходимости писать код обработки протокола TCP/IP, достаточно реализовать только протокол прикладного уровня, который будет вложен в TCP.

Рис. 3. Структура чипа W5500.

Данная программа не будет предусматривать обработчик http. Не занимаясь Arduino, я решил в деталях изучить документацию на чип W5500 и самостоятельно реализовать программу на базе микроконтроллера Atmega8. Не совсем точно говорить о протоколе Telnet, как это сказано в названии данной статьи. Требуется реализовать простейший (RAW) обмен данными через протокол TCP, используя удалённый терминал. Однако большинство telnet-клиентов поддерживают RAW и не требуют вышесказанного. У него есть свои специфические особенности, основанные на обмене дополнительной информации о параметрах терминалов. Она будет заниматься только инициализацией W5500, управление сокетами, приёмом и передачей данных. Таким образом, программа МК Atmega8 не будет предусматривать обработчик протокола прикладного уровня.

При этом конструкция подключается к управляемому устройству через UART интерфейс (три провода GND, TxD, RxD). Основное применение данной конструкции – управление устройствами через удалённый терминал. Например, командная строка Windows или Linux, или способ настройки роутера через терминал по протоколу Telnet. Управление через терминал – это классический профессиональный подход в той или иной сфере при отсутствии графического интерфейса. Последний пример фактически равноценен идее, о которой идёт речь в данной статье.

Это может быть подключение к обычному ПК к COM-порту RS-232 через микросхему-переходник MAX232, или к USB (виртуальный COM-порт) через микросхему PL2303. При разработке того или иного устройства при необходимости я предусматриваю управление им текстовыми командами через терминал, который подключен по UART интерфейсу. С распространением смартфонов на базе Android стало удобно подключение через Bluetooth: к UART интерфейсу устройства подключается модуль Bluetooth (например, HC-06), а к модулю подключается смартфон беспроводным способом. В качестве терминала можно использовать стандартную программу HyperTerminal. Таким образом, можно управлять устройством через терминал с мобильного телефона через Bluetooth в небольшом радиусе действия. В Интернете множество приложений, реализующих терминал через Bluetooth. В качестве терминала может выступать стандартный HyperTerminal, которой поставляется с Windows XP, или можно запустить из командной строки Windows утилиту «telnet» и работать в ней. Конструкция, о которой идёт речь в данной статье, позволяет реализовать управление через терминал, используя Интернет. 4). Если же речь идёт о смартфоне, то можно выбрать одно из приложений на Android (их также большое множество) (рис.

4. Рис. Приложения по запросу «TCP terminal» на Google Play.

Итого, общая память 16 KB на приём и 16 KB на передачу информации. Чип W5500 имеет 8 независимых сокетов, каждый из которых обладает памятью для приёма и передачи информации по 2 KB. В описываемом здесь приложении будут использоваться параметры памяти по умолчанию, и задействованы все 8 сокетов. Эти параметры применяются по умолчанию, но при необходимости на этапе инициализации чипа память по сокетам можно перераспределить. Режим работы всех восьми сокетов, который нам необходим – режим TCP сервера. Каждому сокету на этапе его инициализации присваивается множество параметров, главные из которых – режим его работы и TCP порт. Я взял восемь подряд идущих портов, начиная, к примеру, от 4000. Необходимо присвоить каждому сокету различные порты. Сетевые параметры модуля W5500 должны соответствовать настройкам домашней сети, к которой он подключается. На этапе инициализации модуля W5500 ему присваиваются зашитые в программу МК Atmega8 сетевые параметры: IP-адрес, маска подсети, IP-адрес шлюза и даже физический MAC-адрес. Адрес узла ссылается на устройство W5500, а порт – на сокет в устройстве. При удалённом подключении к нашему описываемому устройству в настройках терминала указывается адрес узла (IP-адрес или доменное имя) и порт. Следовательно, имеется возможность осуществлять восемь независимых одновременных подключений. Один сокет может работать только с одним подключением. 168. На рисунке 5 показаны параметры подключения в стандартной программе HyperTerminal к W5500 с IP-адресом 192. 111 к сокету 0 (порт 4000). 0. Для подключения в глобальной сети Интернет (извне) требуется соответствующе настроить домашний роутер.

Рис. 5. Подключение через TCP/IP в HyperTerminal.

Прежде всего, по способу упаковки TCP пакета, можно выделить два случая. Я перепробовал множество различных приложений TCP-терминалов, у каждого есть свои преимущества и недостатки. Таким образом, поле данных каждого пакета занимает 1 байт и содержит введённый пользователем символ. В первом случае TCP пакет формируется и отправляется серверу сразу при введённом в терминал символе. Во втором случае набор символов (команда) вводится в отдельное текстовое поле, а при нажатии на кнопку «Отправить» формируется всего-навсего один пакет с полем данных, содержимое которого представляет собой введённый пользователем набор символов. Программа HyperTerminal работает как раз в таком режиме. Второй случай наиболее предпочтительный и удобный, а также экономичный в трафике. Размер поля данных такого пакета в байтах совпадает с количеством введённых символов. Наша конструкция работает с обоими случаями, передавая на выход (TxD) UART МК Atmega8 все символы, введённые удалённым пользователем с любого сокета.

Можно сделать, чтобы однобайтовый TCP пакет программа МК формировала также непосредственно, по поступлению одного байта (символа) на ножку RxD UART МК. Что касается организации передачи информации от сервера к клиенту, здесь тоже есть свои особенности. Кстати говоря, данный сигнал применяется для коммутации MAX485 на передачу в случае преобразования RS-232 в полудуплексный интерфейс RS-485. Можно сделать формирование TCP пакета из множества поступающих байтов на МК по присутствию специального дополнительно сигнала, который присутствует только во время передачи последовательности от подключенного устройства (сигнал упаковки). небольшую задержку, в течение которой будет производиться приём символов и формирование TCP пакета. Однако, как я убедился, удобнее всего применять таймер, т.е. Работает это следующим образом. Именно этот способ я реализовал в описываемой конструкции. 3 сек.) запускается при поступлении первого символа и сбрасывается при поступлении каждого очередного символа на UART МК. Таймер (время задано примерно 0. В моём конкретном случае происходит массовая рассылка по всем сокетам, к которым подключены клиенты. Если в течение заданного времени символы не поступали, пакет с поступившими символами формируется и отправляется клиенту, а таймер останавливается.

Описываемый удалённый терминал не защищён от «подслушивания» с помощью анализаторов трафика. Теперь речь пойдёт о конфиденциальности. Для этого имеются другие современные протоколы удалённого терминала. Даже сам протокол Telnet не предусматривает парольной авторизации и шифрования. Однако такой способ авторизации защитит от безконтрольного «левого» трафика. А в случае с Telnet, как и в случае RAW (без прикладного протокола) можно реализовать косвенный способ парольной авторизации, который разве что будет неэффективный при намеренном умышленном вмешательстве. В своей прошивке я реализовал страницу приветствия клиента, если тот подключился к серверу, т.е. Он может исходить от шпионских программ, которые, перебирая диапазон IP-адресов известных провайдеров и диапазон портов, могут внезапно подключиться к нашему устройству (если оно «слушает» соединения из Интернета). к конструкции на базе модуля W5500.

6). Страница приветствия содержит информацию об IP-адресе клиента, номера сокета (для контроля) и предложением ввести пароль (рис.

Рис. 6. Страница приветствия сервера W5500.

В случае неправильно введённого пароля по истечению заданного времени пользователя информирует соответствующее сообщение, и сервер разрывает соединение (рис. После подключения внутри программы МК запускается таймер на время (примерно на 18 сек.), в течение которого пользователь должен успеть ввести определённый пароль (одинаковый на всех сокетах). 7).

Рис. 7. Сообщение о некорректном пароле.

8). В случае корректно введённого пароля пользователю также высвечивается соответствующее сообщение (рис. Работа такого моста проверялась только на уровне пользовательских команд. После этого устанавливается «прозрачный» мост между удалённым терминалом и UART интерфейсом МК, к которому по SPI подключен модуль W5500. А уж тем более, в описываемой конструкции не гарантируется (точнее, не предусмотрен) полнодуплексный обмен данными. Может не гарантироваться полноценный высокоскоростной обмен данными, если в каких-либо случаях в роли клиентского приложения будет выступать не пользовательский терминал, а какая-либо другая программа.

Рис. 8. Сообщение о корректном пароле.

Длинна пароля – 8 символов. При вводе пароля пользователю на терминал не возвращаются вводимые им символы, а также не работает «Backspace» (откат при неправильно введённом символе). Но любой пакет не должен превышать 10 байтов. Программа МК сканирует первые пришедших от клиента 8 символов вне зависимости от распределения их по TCP пакетам. Как было проверено с помощью анализатора трафика, при выполнении этой функции формируется два TCP пакета: первый пакет с данными в 1 байт содержит первый символ передаваемого текстового файла, а второй пакет – всё остальное содержимое. Кстати говоря, функция «Отправить текстовый файл» в программе HyperTerminal работает весьма интересно.

Один пароль служит для установления моста «TCP-UART» (обычное использование), о чём говорилось выше, а второй пароль – для управления модулем W5500 или другими параметрами конструкции. Сервер предусматривает два различных пароля. Я намеренно предусмотрел, чтобы данный режим был возможен только на одном из свободных сокетов. В случае ввода данного пароля пользователю высвечивается другая страница приветствия, и он попадает в режим управления. Перед разрывом высветится сообщение о номере сокета, который уже работает (занят) в режиме управления (рис. Если сокет с данным режимом занят, и будет произведена попытка авторизоваться в этот режим на другом сокете, соединение будет немедленно разорвано сервером. 9).

Команда должна завершаться символом перевода на новую строку (клавиша Enter). Режим управления предусматривает определённые мной команды, перечень которых можно увидеть, введя команду «help». На рисунке 10 продемонстрировано вышесказанное. Кроме того, если активен режим управления, сервер W5500 выдаёт в терминал служебные сообщения, например, о подключающихся клиентах на другие сокеты с их IP-адресами или об освободившемся сокете. Перечень команд пока что не полный, со временем будет пополняться.

9. Рис. Сообщение о занятом сокете при вводе пароля режима управления.

Рис. 10. Режим управления W5500.

Следующие две команды предназначены для чтения и записи адресуемого регистра чипа W5500. Команда «echo» отключает или включает возврат печатаемого символа на терминал (самоконтроль). Эти универсальные команды я ввёл, прежде всего, для отладки. Значения регистров по адресам указаны в документации на чип W5500. Аналогично, команда «sr» читает статус сокета, выдавая его значение в виде HEX-числа. Команда «rl» немедленно «перезагружает» сокет, номер которого указан после. Можно ввести гораздо большее число команд. Команда «ens» выдаёт таблицу состояний каждого сокета: состояние «0» — сокет свободный, ждёт клиента, состояние «1» — сокет в режиме обычного использования, состояние «2» — сокет в режиме управления. Также может оказаться полезным ввести специальные команды, которые будут управлять дополнительными свободными пинами МК. Будет полезно менять параметры, которые вписываются в чип на этапе инициализации при включении устройства (например, сетевые параметры), сохраняя их в энергонезависимую память МК. Обязательно нужна команда конфигурации UART интерфейса МК. Например, «PC0=1», «PC2=0» и т.д.

Кроме вышеперечисленных таймеров, задействован таймер, благодаря которому через каждые примерно полминуты по всем задействованным сокетам рассылаются т.н. Рассмотрим более тонкие детали работы программы МК. Это нужно для проверки соединения в случае отсутствия пользовательского обмена данными. контрольные TCP пакеты «keep-alive». таймаут, и сокет будет перезагружен. Если по какой-либо причине со стороны клиента не будет ответа с подтверждением в течение определённого времени, установленного внутри W5500, сработает т.н. Соединение может внезапно потеряться, например, по причине разрыва на канальном или физическом уровне: выдернули Ethernet кабель, отключился Интернет или потеряно Wi-Fi соединение и т.д.

Во-первых – базовые функции записи и чтения регистров W5500 по адресам. Основываясь на документации к чипу W5500 (datasheet) в программном коде реализованы следующие функции. Последняя функция представляет собой композицию вышеупомянутых функций: закрытие, открытие, прослушивание. Функции верхнего уровня – аппаратный сброс, инициализация чипа, инициализация сокета, открытие сокета, сокет на прослушивание, дисконнет и закрытие сокета, отправка команды «keep_alive», перезагрузка сокета. Наконец, самые основные функции – обработка принятой информации (чтение из буфера RX) и обработка отправляемой информации (запись в буфер TX). Большинство функций возвращают значение статуса сокета после их выполнения. Функция приёма переписывает принятые данные из буфера RX в собственный буфер (не кольцевой) размером 128 байт. Рекомендации по реализации этих функций я взял с официального сайта производителя чипа W5500 (ссылка). В буфер TX W5500 функцией передачи переписываются данные из промежуточного буфера также небольшого размера. Этого размера вполне достаточно для простых приложений, да и с микроконтроллера Atmega8 много не возьмёшь. Последний реализован автоматически в среде разработки CVAVR с помощью вспомогательного приложения CodeWizardAVR на этапе создания проекта. А в него в свою очередь попадают данные из кольцевого буфера UART.

Кроме того, к определённому выходу МК подключен вывод RST (аппаратный сброс), и к входу внешнего прерывания INT0 подключен соответствующий вывод INT. Модуль W5500 подключен к SPI интерфейсу МК (MOSI, MISO, SCK, SCLK). МК узнаёт, на каких сокетах произошло событие, затем переписывает коды событий для каждого сокета в определённый массив. Последний используется по прямому назначению: При возникновении того или иного события в модуле W5500 он формирует импульс на выводе INT, который обрабатывается контроллером в теле внешнего прерывания. Всего документировано пять событий: клиент подключился, клиент отключился (точнее, подал запрос на отключение), поступили данные от клиента, сработал таймаут, данные отправлены успешно. Дальнейшая обработка прерывания происходит внутри основного цикла программы. В данную обработку помещён оператор switch-case. В основном цикле обрабатываются все события, кроме последнего. В нём после функции обработки принятой информации также помещён оператор switch-case, но в данном случае этот «переключатель» связан с переменной, отвечающей за состояние сокета, о котором говорилось выше (значения 0, 1, 2). Самая большая часть программного кода на языке Си встречается в секции обработки третьего события (приём данных). Принятые символы переписываются в отдельный парольный буфер. Первая секция отвечает за процедуру распознавания пароля. В случае того или иного совпадения присваивается соответствующее состояние. При определённых условиях работают функции сравнения принятой строки со строками-константами, содержащих пароли. Это режим обычного использования. Вторая секция самая простая – содержимое собственного буфера принятой информации перенаправляется на UART микроконтроллера. Третья секция (самая большая) отвечает за обработку команд – режим управления устройством.

Ещё в тело основного цикла помещена функция чтения из UART, внутри которой переписываются принятые контроллером символы в собственный (промежуточный) буфер передачи и происходит сброс таймера, отвечающий за формирование TCP пакета. Кроме продолжения обработчика прерываний в основном цикле программы помещены обработчики виртуальных таймеров – таймаут для разрыва соединения при неуспешной попытке ввода пароля, периодическая отправка «keep-alive» и отправка клиенту сформированного по таймеру TCP пакета.

Таким образом, происходит последовательная обработка всех сокетов. Все процедуры сокетов помещены в цикл от 0 до 7, итератор которого привязан к номеру сокета. Однако такая конфигурация не заработала, и данный вопрос пока отложен на будущее. Изначально я подразумевал, что, если присвоить каждому из восьми сокетов одинаковый номер порта, то можно обеспечить подключение до восьми пользователей по одному и тому же порту.

На двусторонней печатной плате размещены МК Atmega8, кварц на частоту 11. Разрабатывая печатную плату конструкции, я предусмотрел часы реального времени (RTC) на микросхеме DS1307. Эскиз печатной платы в программе «Sprint Layout» представлен на рисунке 11. 0592 МГц (частота выбрана для точности работы UART), разъём для модуля W5500, разъёмы портов МК (в том числе SPI для прошивки, UART), RTC с собственным кварцем и отсеком для батарейки CR2032, линейный регулятор на 5 В (7805), разъём питания и прочее. Единственный элемент, который изображён красным цветом, припаивается на обратной стороне, но я его припаял на лицевую сторону.

Рис. 11. Эскиз печатной платы.

Часы в данной конструкции будут использоваться для отметки времени при тех или иных событиях сокетов W5500, и данное время будет приписываться пользователю в терминал рядом с сообщением, если пользователь подключен в режиме управления. Фотографии готовой конструкции представлены на рисунке 12. А также, часы пригодятся на будущее для экспериментов с протоколом настройки времени NTP или для других каких-либо целей.

Рис. 12. Фотографии готовой конструкции.

Основное достоинство – цена. В заключении стоит отметить, что конструкция собственного изготовления по большей части оправдывает похожие устройства промышленного уровня. А такой недостаток, как ограниченный функционал, неизбежен. Изготовить получилось гораздо дешевле, чем цена готового подобного устройства. В данном случае применён упрощённый контроллер Atmega8, так как ставилась соответствующая упрощённая цель.

Рис. 13. Промышленный конвертер TCP/IP – RS-232.

У него, кроме гибкого интерфейса управления, есть ещё одно преимущество. На рисунке 13 в качестве примера изображён промышленный конвертер TCP/IP в RS-232, выполненный на базе чипа W5100, очень похожим на W5500. Через него можно подключиться с помощью обычного терминала, у которого нет режима TCP/IP подключения. Кроме работы с TCP/IP терминалом, имеется возможность с помощью специального драйвера, который поставляется с устройством, на клиентской стороне установить виртуальный COM-порт. То есть, устройство, изображённое на рисунке 13, является полноценным мостом RS-232 через сетевую инфраструктуру. Более того, устройство может поддерживать полноценный обмен данными по RS-232 в случае, если вместо терминала через виртуальный COM-порт подключается какая-либо программа.

Теги
Показать больше

Похожие статьи

Добавить комментарий

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

Кнопка «Наверх»
Закрыть