@levinnsk

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

Поделитесь опытом пожалуйста.
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("пакет пришел от оборудования");
      /* допустим я тут вызову функцию, которая обработает данные от устройства, но данные будут от разных устройств и по пакету я не могу их проверить*/
      // нужно как-то перенести чтение приходящих данных в отдельную функцию, которая будет вызываться при необходимости и при опросе конкретного оборудования
    }
  });
}
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
@levinnsk Автор вопроса
В моем случае нужно использовать socket.once
socket.once("data", (data) => console.log(data))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
pLavrenov
@pLavrenov
Разработка сайтов
socket это уникальный обьект для каждого подключения, оборудование пересылает какие либо идентификационные данные (зависит от самого устройства) которые в основном включают в себя imai int(15) и возможно тип протокола, они могут присылать эти данные при подключении или всегда с данными, так например если они присылают на этапе подключения то записываем эти данные в socket (это обычный js обьект в который можно писать) и при получении данных или отправке берем эти данные и на основе их делаем выбор как обработать.

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

Еще надо обратить внимание на activeClients тк подключения то туда сейчас добавляются в вот как их оттуда убрать мертвые это вопрос интересный потому что disconected работает не так как хотелось бы.
Ответ написан
NeiroNx
@NeiroNx
Программист
Ответ пришол ровно от того оборудования которое вы опросили(опрос содержит как минимум адрес), если работает по другому выкиньте и купите нормальное.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы