Обнаружение нажатия кнопки через компьютерную сеть

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

Я нашел продукт с аналогичным функционалом.

Я предполагаю, что для устройства потребуется микроконтроллер, связанный с контроллером ввода-вывода Ethernet? Нужна ли мне ОС для генерации пакетов сообщений TCP/IP, которые могут быть обнаружены на ПК? Пожалуйста, предложите блок-схему, которой я могу следовать, чтобы сделать это.

взгляните на arduino.cc/en/Tutorial/WebServer
Этот вопрос слишком широк.
@OlinLathrop: Согласен, я запрашиваю схему, с которой я могу начать работать, буду признателен, если я получу дорожную карту и смогу изучить особенности.

Ответы (3)

Мне непонятно, что именно вы хотите. Я думаю, что это примерно так: у вас есть ряд линий, которые должны быть сопряжены с микроконтроллером, и этот микроконтроллер посылает сигнал на компьютер. Компьютер обрабатывает этот сигнал.

Что касается части микроконтроллера, вы можете использовать микросхему со встроенным Ethernet, например PIC18F67J60 , упомянутую Олином. Вы также можете использовать микросхему меньшего размера (более простую в программировании) с внешней микросхемой Ethernet, такой как ENC28J60 . Вы можете написать программное обеспечение для микроконтроллера, используя стек TCP/IP от Microchip , стек TCP/IP от Olin Lathrop (см. раздел «Пример прошивки для сети») или реализацию Мэтью Шинкеля в Jalv2 .

Поскольку микроконтроллер посылает сигнал компьютеру, проще всего сделать компьютер сервером, а микроконтроллер клиентом. Это означало бы, что вам нужен какой-то сервер на компьютере. Я бы порекомендовал вам использовать HTTP-сервер, потому что для него доступно больше всего информации. Для Linux вы можете использовать сервер LAMP , для Windows используйте WAMP или XAMPP.

Вам нужно будет создать скрипт на стороне сервера, который обрабатывает запрос от клиента. Клиент должен вызвать этот скрипт. Вы могли бы, например, сделать запрос клиента, /button.php?button=17когда была нажата кнопка номер 17. Тогда сценарий на стороне сервера может быть таким:

<?php
if (!isset($_GET['button'])) {                    // Check if ?button exists
    die('The button variable is mandatory.');     // If not, quit
}

$button = (int) $_GET['button'];                  // Cast ?button to an integer
if ($button == 0) {                               // Check if it was an integer
    die('Invalid button number.');                // If not, quit
}

// Do stuff with $button

Вот схема блока:

введите описание изображения здесь

Позвольте мне объяснить это.

  • Кнопки и другие вводы-выводы формируют вход для микроконтроллера, который вы собираетесь использовать. Это будут кнопки, с которыми вы собираетесь взаимодействовать, но также могут быть и другие вещи, такие как устройства I2C / SPI или что-то еще.

  • Вы можете получить информацию от этого IO с помощью базового программирования чипа . Чип должен считывать значения со входов.

  • Чип (может быть PIC) с ethernet (может быть встроенным) обрабатывает входящую информацию, и передает ее на IP сервера , скажем , 192.168.0.10.

  • Для этого его необходимо сначала отправить на маршрутизатор с IP-адресом 192.168.0.1, используя стек TCP/IP . На чипе этого не заметишь. Это так же, как вы связываетесь с сервером напрямую.

  • Маршрутизатор обрабатывает пакет и отправляет его на сервер по адресу 192.168.0.10. Вам не нужно этого делать, маршрутизатор сделает это сам.

  • Сервер получает HTTP - запрос и должен его обработать. Он отправляет ответ маршрутизатору по адресу 192.168.0.10, который перенаправляет его на чип. На схеме блока это не показано, потому что в данном приложении это не нужно: данные должны отправляться с чипа на сервер , а не обратно.

  • Данные с чипа могут использоваться сервером для отображения на экране, сохранения в файле или других действий с ними. Это полностью зависит от вас.

Вы также можете, как предлагает Олин в комментариях, использовать TCP-сервер вместо HTTP-сервера. Это возможно и более эффективно (теоретический профи, вы этого не заметите). Я бы порекомендовал новичку в сети использовать HTTP-сервер. Существует множество информации по этой теме, и с ней очень легко начать работу. Если вы уже знаете что-то о сети, вы также можете создать TCP-сервер. Ни один из двух серверов не будет более сложным для реализации на стороне клиента.

1: Я не понимаю, как проще программировать чип меньшего размера, чем 18F67J60. Размер прямо пропорционален сложности. Преимущество '67J60 состоит в том, что он имеет встроенный MAC/PHY. 2: У меня также есть бесплатный сетевой стек для линейки 'J60, включенный в выпуск PIC Development Tools на embedinc.com/pic/dload.htm . 3. В чем сложность HTTP, если можно создать простой TCP-сервер только для приема данных с этих устройств?
Спасибо за такой подробный ответ. Итак, если я вас правильно понял, схема будет заключаться в том, чтобы считывать контакты, которые нужно отслеживать, кодировать их в HTTP-запрос и отправлять по TCP/IP (используя источник библиотеки, который вы упомянули). На стороне ПК декодируйте сообщение и используйте его в каком-нибудь приложении. Любые особенности сети, о которых мне нужно позаботиться?
@OlinLathrop 1: техническое описание 18F67J60 содержит почти 500 страниц. Например у 16Ф88 его меньше половины; так что может быть проще для начинающих (включая меня). 2: спасибо, я отредактирую это. 3: на HTTP-серверах доступно гораздо больше информации. Поскольку для HTTP существуют решения с открытым исходным кодом, это не сильно усложнит код.
@OlinLathrop: Протокол какого уровня мне действительно нужно использовать, учитывая, что мое намерение состоит в том, чтобы просто определить статус линии ( Hi / Lo ) в моем настольном приложении?
@Блимер точно. Вам не понадобятся сетевые особенности, хотя было бы полезно иметь статический IP-адрес или имя хоста сервера, чтобы вы могли жестко закодировать его в чипе. Кроме того, кодировка HTTP-запроса не будет такой сложной, это базовая строка с добавлением номера кнопки.
@CamilStaps: Спасибо. Это будет самая минималистская схема? Простите мое понимание сети.
@Bleamer не минималист, но, на мой взгляд, самый простой. Я добавил схему блока с объяснением для вас.
@Bleamer нет проблем :) удачи!
PIC 16F88 слишком мал для поддержки сетевого стека TCP. Большая часть руководства '67J60 описывает детали MAC/PHY. Либо вы используете существующее программное обеспечение для его управления, либо вам нужно прочитать эквивалентную таблицу данных для внешнего MAC/PHY. Спецификация '67J60 выглядит большой, потому что все в одном документе.
@OlinLathrop: Вы предлагаете использовать 18F67J60?
@OlinLathrop правда, это плохой пример. Но я уверен, что есть чипы, с которыми проще начать, чем с 18F67J60, у которых достаточно памяти для программ стека TCP/IP. С другой стороны, я никогда не пробовал 18F67J60, и может быть довольно легко начать с ним работать.
@Bleamer: я думал написать свой собственный TCP-сервер на хост-компьютере. Это легко сделать. Да, я думаю, что для этого подойдет чип 18F67J60 или его старший брат 18F87J60, если у вас много кнопок для подключения. Это 80-контактная версия 64-контактного 67J60.

Я бы предложил использовать недорогой микроконтроллер, который я использую под названием «Electric Imp», он небольшой (размером с SD-карту) и содержит все, что вам нужно, чтобы иметь кнопку, которая обеспечивает безопасное подключение через Wi-Fi к Интернету и даже работает на заряд батареи.

Конечно, как только ваше нажатие кнопки исчезнет из Интернета, у вас будет 1001 вариант того, что вы можете с этим сделать.

Одна действительно приятная особенность заключается в том, что ваши обновления кода передаются на устройство из Интернета, поэтому его можно обновить на месте.

Возьмите микро с поддержкой Ethernet, например PIC18F67J60, и подключите к нему все кнопки. Микросхема устраняет дребезг кнопок. Когда он видит активность, заслуживающую отчета, он открывает TCP-соединение с известным сервером на известном порту, отправляет информацию и закрывает соединение.