Требуется написать коммуникационный сервер (пакеты TCP)

20 000 руб. за проект • наличный расчёт, безналичный расчёт, электронные деньги
30 июля 2014, 18:02 • 11 откликов • 71 просмотр
Есть много устройств (железяки), которые установлены в вагонах (в каждом), у всех у них есть модемы (т.е. выход в интернет. Таких устройств будет ровно 5000 шт. (и больше не будет!)
Есть сервер (платформа может быть любой, это не так важно, важно сделать как можно быстрее, т.е. на той ОС на которой будет проще).
Есть оператор (живой человек, даже с высшим образованием), у которого на экране браузера есть список этих устройств и есть интерфейс который позволяет отображать текущее состояние каждого устройства и позволяет изменять настройки и отправлять на устройство (повторюсь, что через браузер). Должно быть установлено соединение между устройством и сервером (с которого браузер и загружает страничку). Устройство может в любой момент времени прислать что-то важное (например, что температура в котле высокая, или авария туалетного трубопровода и т.п.). Само устройство старается быть на связи, т.е. подключенным к gprs интернету. Оператор (тот самый с высшим образованием) тоже может внезапно отправить команду и устройство ее получив ее выполняет и отвечает, что все выполнено.
Каждое устройство имеет свой уникальный номер (IMEI для модема) и в пакете от устройства этот номер присутствует обязательно (т.е. сервер должен знать от кого пришел пакет и может сохранить данные в соответствующую данному устройству строку в таблице BD).

Итак это все хотелки.
У нас есть готовый пользовательский интерфейс на PHP, но нет системы приема и отправки сообщений, т.е. связующего звена между устройством и пользовательским интерфейсом (по сути сервера).
Пробовали сокетами в PHP, но сокеты рвут соединение. При этом, если соединение рвется, то оператор округляет трафик за время сессии в большую сторону до 1 кб или 10 кб или 100 кб в зависимости от тарифа.
Кроме того, необходимо учитывать, что устройство может проезжать "слепую" зону, т.е. там где устройство не может выйти на связь (нет сигнала GSM) особенно это применимо именно в РЖД, где вышки стоят у дорог, но не у железных.
Пакеты строго TCP (т.е. с гарантированной доставкой). Кроме того, на каждый пакет получатель отвечает (квитирование обязательно!), мол получил, все ок. Если нет, то повторная попытка отправить данные.
У оператора есть индикация кто онлайн, а кто нет. Я это к тому, что рвать соединение самим не нужно. И к тому, что если оператор (с высшим образованием) решил что-то изменить, то нужно это сначала сохранить в базе, а когда устройство появится онлайн, то устройство скажет, что оно онлайн и ему нужно пропихнуть конфигурационные пакеты (все это кроме самой связи не проблема и уже сделано). Тоже самое и устройством, оно может накопить данные за время пребывания без интернет и слить несколько пакетов с данными после подключения (это тоже уже готово). Устройства могут выходить на связь в любой момент.
Устройств может быть одновременно много (не более 5000, но понятно, что все разом не нападут со своими данными).
Задача: написать обработчик пакетов, который бы обеспечил бы получение пакетов и передачу их в среду интерфейса (который на PHP ), и обратная задача: от интерфейса нужно передавать команды через сервер на устройство.
Имеется протокол общения PHP интерфейса и устройства. Он полностью текстовый.
Платформа у нас никсовая.
Вот пример пакетов (текстовых):
устройство на сервер:
#GP2_xxxxxxxxxxx_010_1
здесь:  xxxxxxxxxxx это IMEI
010 - это код параметра "реле"
1 - это значение параметра "реле"
Т.е. реле сообщило серверу что реле включено.

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