Как организовать работу с socket с gprs терминалом?

Ссылка скопирована
1 ответ

Поделитесь опытом пожалуйста.
JavaScript
Создал tcp сервер с помощью net из node.
Есть gprs терминал Teleofis, при первом подключении отправляю запрос на авторизацию, получаю ответ, если он верный, отправляю подтверждение авторизации. Сам сокет сохраняю в список активных клиентов.
К самому терминалу подключено разное оборудование, которое будет опрашиваться отдельно по запросу.
Я могу сокет отправить в отдельную функцию, но все равно socket.on("data") будет отрабатывать в одном месте, и я не могу тут сделать проверку от какого оборудования пришел ответ.
Как в моем случае организовать опрос оборудования?
Наброски кода в codesandbox
И тут:

const net = require("net"); const server = net.createServer(); const activeClients = []; // создаю tcp сервер для подключения gprs терминалов, к которым подключено оборудование server.listen(   {     port: 1015,     host: "localhost",     exclusive: true,   },   () => {     console.log("Сервер запущен на ", server.address());     console.log("Сервер запущен в ", Date());   }, );  server.on("connection", (socket) => {   soketConnection({ socket }); });  function soketConnection({ socket }) {   socket.write(/*отправляю запрос на первое соединение*/);    socket.on("data", (data) => {     console.log(data);     if (/*если пришел пакет от модема*/ true) {       // socket записываю в текущие клиенты       activeClients.push(socket);       socket.write(/*отправляю подтверждение соединения*/);     } else {       console.log("пакет пришел от оборудования");       /* допустим я тут вызову функцию, которая обработает данные от устройства, но данные будут от разных устройств и по пакету я не могу их проверить*/       // нужно как-то перенести чтение приходящих данных в отдельную функцию, которая будет вызываться при необходимости и при опросе конкретного оборудования     }   }); }

const net = require("net"); const server = net.createServer(); const activeClients = []; // создаю tcp сервер для подключения gprs терминалов, к которым подключено оборудование server.listen( { port: 1015, host: "localhost", exclusive: true, }, () => { console.log("Сервер запущен на ", server.address()); console.log("Сервер запущен в ", Date()); }, ); server.on("connection", (socket) => { soketConnection({ socket }); }); function soketConnection({ socket }) { socket.write(/*отправляю запрос на первое соединение*/); socket.on("data", (data) => { console.log(data); if (/*если пришел пакет от модема*/ true) { // socket записываю в текущие клиенты activeClients.push(socket); socket.write(/*отправляю подтверждение соединения*/); } else { console.log("пакет пришел от оборудования"); /* допустим я тут вызову функцию, которая обработает данные от устройства, но данные будут от разных устройств и по пакету я не могу их проверить*/ // нужно как-то перенести чтение приходящих данных в отдельную функцию, которая будет вызываться при необходимости и при опросе конкретного оборудования } }); }

Дополнительно:

В моем случае нужно использовать socket.once
socket.once("data", (data) => console.log(data))

Ответы:

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

Я бы добавил пару моментов:
1) сразу разделять по протоколам и запускать сервер на определенном порту для каждого протокола отдельно.
2) Если нужно обрабатывать данные отдельно от сервера после расшифровки пакетов отправлять их по mqtt а дальше уже слушать чем угодно.

Еще надо обратить внимание на activeClients тк подключения то туда сейчас добавляются в вот как их оттуда убрать мертвые это вопрос интересный потому что disconected работает не так как хотелось бы.

  • спасибо за помощь.
    сокет после первого запроса на соединение и отправляет все данные, в том числе Imei, если данные приходят верные, я ему отправляю подтверждение.
    Логику удаления сокета из активных клиентов сделал, в зависимости или сам терминал разорвал соединение или стал не доступным. Использовал socket.resetAndDestroy().

    Мне получается в конструкции if else if забить на данные, а слушать данные уже в функции опроса счетчика?

    А уже при опросе счетчика из нужного места я смогу взять сокет ил активных клиентов по Imei и отправлять запросы и получать.

    Или разбираться только с mqtt?

  • Сохранять полностью обьект сокет особо смысла нет, туда можно добавлять только imai.

    Последнюю часть про данные не совсем понял. В колбэке data я у себя обрабатываю буфер в объект с данными, добавляю imai и отправляю по mqtt. Так получается разделение сервисов где node.js получает данные приводит их у человекопонятному виду и отправляет куда-то в неизвестность где можно подключиться и получать эти данные по мере их поступления (у меня Laravel)

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

Так что не придумывайте - вы уже на стадии опроса должны знать что опрашиваете.

  • оборудование нормальное, teleofis.
    Я скорее всего что-то не понимаю или отсутствие опыта.
    Сам терминал прокладка между сервером и счетчиком.
    Мне и не хватает "мозгов", как после подключения терминала слушать данные только в момент опроса счетчика.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Мария Код Ответ

Для организации работы с сокетами и GPRS терминалом вам понадобится использовать язык программирования, который поддерживает работу с сетевыми соединениями, такой как PHP.

Для начала, вам необходимо установить соединение с GPRS терминалом через сокет. Для этого создайте сокет с помощью функции socket_create и установите соединение с вашим терминалом по IP-адресу и порту с помощью функции socket_connect.

Пример кода на PHP для создания сокета и установки соединения с GPRS терминалом:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "Ошибка создания сокета: " . socket_strerror(socket_last_error());
}
 
$ip = '192.168.1.1'; // IP адрес вашего GPRS терминала
$port = 12345; // Порт для соединения
 
$result = socket_connect($socket, $ip, $port);
if ($result === false) {
    echo "Ошибка соединения с терминалом: " . socket_strerror(socket_last_error());
}

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { echo "Ошибка создания сокета: " . socket_strerror(socket_last_error()); } $ip = '192.168.1.1'; // IP адрес вашего GPRS терминала $port = 12345; // Порт для соединения $result = socket_connect($socket, $ip, $port); if ($result === false) { echo "Ошибка соединения с терминалом: " . socket_strerror(socket_last_error()); }

После установления соединения вы можете отправлять и принимать данные от GPRS терминала с помощью функций socket_send и socket_recv. Например, чтобы отправить данные на терминал, используйте следующий код:

$data = "Hello, GPRS terminal!";
socket_send($socket, $data, strlen($data), 0);

$data = "Hello, GPRS terminal!"; socket_send($socket, $data, strlen($data), 0);

Чтобы принять данные от терминала, используйте следующий код:

$buffer = '';
socket_recv($socket, $buffer, 1024, 0);
echo "Полученные данные: " . $buffer;

$buffer = ''; socket_recv($socket, $buffer, 1024, 0); echo "Полученные данные: " . $buffer;

Не забудьте закрыть соединение с терминалом после завершения работы с ним с помощью функции socket_close:

socket_close($socket);

socket_close($socket);

Это основные шаги для организации работы с сокетами и GPRS терминалом. Убедитесь, что ваш GPRS терминал настроен на прослушивание соединений на указанном порту и имеет правильную конфигурацию для взаимодействия с вашим скриптом.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

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

Вам также может быть интересно