Создание веб-сайта для связи со встроенным устройством

В настоящее время я работаю над проектом, в котором пытаюсь управлять встроенным устройством через веб-сайт с выходом в Интернет. Идея состоит в том, что пользователь может зайти на веб-сайт и попросить это устройство выполнить какое-либо действие. Действие на веб-сайте будет преобразовано в серию команд CLI, а затем отправлено на устройство. В будущем связь потенциально может быть двусторонней, но сейчас я сосредоточен на передаче данных между сервером и устройством.

Веб-сервер представляет собой стек LAMP, использующий Python (Django), а устройство, с которым я пытаюсь связаться, — это Beagle Board, работающая под управлением eLinux. В любой момент времени будет существовать только одно устройство, связывающееся с сервером.

У меня есть все функциональные части, написанные на стороне сервера и устройства, но у меня возникли некоторые проблемы с выяснением того, как написать коммуникационный уровень. Одна из моих больших проблем заключается в том, что устройство будет мобильным и будет перемещаться каждые несколько дней. Таким образом, я не могу гарантировать статический IP-адрес для устройства. Мои познания в области сетевого программирования довольно минимальны, поэтому я не очень хорошо представляю, с чего начать.

Есть ли у кого-нибудь идеи/ресурсы о том, как я могу начать развивать такое общение?

Спасибо!


person user459998    schedule 27.09.2010    source источник


Ответы (4)


Вы можете просто зарегистрировать динамическое имя хоста с помощью провайдера, такого как DynDNS, и устройство обновит свой IP-адрес на этом веб-сайте, чтобы динамическое имя хоста всегда указывает на IP-адрес устройства — для Linux доступно множество клиентов, сценариев и т. д., которые делают именно это.

person Jim Brissom    schedule 27.09.2010
comment
+1: Наверное, проще, чем писать что-то для подключения устройства. Зачем изобретать велосипед, верно? :) - person Jon Cage; 28.09.2010

Если сервер будет статическим, вы всегда можете заставить устройство установить соединение с сервером, чтобы сообщить его IP-адрес.

Вы можете написать простой сервер UDP, чтобы устройство прослушивало входящие сообщения, а затем напишите клиент на python для вызова вашего веб-сервера.

person Jon Cage    schedule 27.09.2010

Мой обычный способ поведения (конечно, поскольку он может проходить через NAT и т.п.) состоит в том, чтобы устройство настроило обратный туннель SSH, который просто «звонит домой»: http://www.howtoforge.com/reverse-ssh-tunneling

Имейте в виду, что соединения SSH время от времени прерываются, поэтому я бы установил на сервере метод сердцебиения, и если клиент (Beagle Board) пропускает установленное количество сердцебиений, пусть он уничтожит туннель и создаст новый.

person Wrikken    schedule 27.09.2010
comment
Я бы выбрал этот вариант, потому что ваше клиентское устройство может не иметь общедоступного IP-адреса в некоторых телефонных сетях. - person peter_mcc; 28.09.2010
comment
На самом деле оператор сказал, что он будет мобильным (то есть не статичным), не подключенным к модему или мобильному телефону. Однако ответ Вриккена - хорошее предложение :) - person Jon Cage; 28.09.2010

устройство будет мобильным и будет перемещаться каждые несколько дней. Таким образом, я не могу гарантировать статический IP-адрес для устройства.

Ваше устройство может быть клиентом веб-сайта.

Ваш веб-сайт имеет два интерфейса.

  1. HTML интерфейс для людей.

  2. Не-HTML-интерфейс к устройству. В качестве клиента веб-сайта устройству потребуется клиентская библиотека HTTP для отправки запроса на веб-сайт. Этот запрос будет включать в себя IP-адрес устройства, а также всю обычную мелочь, скрытую в HTTP-запросе. (Есть куча стандартных заголовков, которые отправляются в запросе)

После того, как устройство сделало свой первоначальный запрос, ваш веб-сайт может сохранить текущий статус устройства и связаться с ним через другой протокол, если вы хотите это сделать. (Я предполагаю, что «у меня все функциональные части написаны на стороне сервера и устройства» означает, что у вас есть какой-то другой протокол для управления устройством, и этот протокол не основан на HTTP.)

В долгосрочной перспективе может быть проще, если устройство будет опрашивать веб-сайт на наличие команд, обновлений или чего-то еще. Таким образом, устройство является чистым веб-клиентом, использующим только HTTP, а ваш веб-сайт — чистым веб-сервером, использующим только HTTP. Тогда вам не нужен ваш более специализированный второй протокол. Использование только HTTP означает, что вы можете использовать SSL для обеспечения безопасной связи.

Если ваше устройство использует HTTP для получения команд и обновлений, вам необходимо разработать удобное представление для данных, которые можно легко закодировать в HTTP-запросы и ответы. Варианты включают XML, JSON и YAML. Вы всегда можете изобрести свой собственный формат данных; однако вы, вероятно, будете более довольны отладкой стандартизированного формата, такого как JSON.

Создание этих двух интерфейсов в Django довольно тривиально. У вас просто будут некоторые URL-адреса, которые предназначены для людей, а некоторые — для вашего устройства. У вас будут функции просмотра для людей, которые возвращают HTML-страницы, и функции просмотра для вашего устройства, которые возвращают сообщения JSON или XML.

person S.Lott    schedule 28.09.2010