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