За последние 24 часа нас посетили 22725 программистов и 1272 робота. Сейчас ищут 742 программиста ...

Работа с сокетами

Тема в разделе "PHP для новичков", создана пользователем Вадим Круговой, 17 июн 2019.

  1. Вадим Круговой

    С нами с:
    17 июн 2019
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте уважаемые программисты! Обращаюсь к Вам за советом с целью решения поставленной мною задачи.

    Сразу хочу Вас поставить в известность о своих знаниях касаемо PHP - начальные, ибо я не тревожит Вас и не создавал бы эту тему.

    Цель состоит в следующем:
    Разработать алгоритм обработки информации с контроллеров(клиентов) на сервере, с последующей записью этой информации в БД (MYSQL). Обмен данными между клиентом и сервером реализован посредством протокола web-socket.

    Для общего понимания расскажу как все устроено:
    Существует беспроводная ZigBee сеть, которая содержит контроллер-координатор, который посредством данной беспроводной сети, получает от ведомых контроллеров различную статистику некоторых параметров. После сбора статистики, контроллер-координатор отправляет данную информацию на сервер посредством протокола GPRS. Передаваемая информация представляет собой структурированный набор данных в виде фрейма (F1 FF 06 13 и т.д.). Далле я выполняю парсер данных и записываю ее в бд.

    Вопрос:
    Как реализовать работу с контроллером(клиентом) в рамках сессии? Т.е. например, существует 10 таких контроллеров, и все они подключились к серверу, как мне обрабатывать информацию от каждого из них в рамках активного соединения? Необходимо реализовать работу таким образом, чтобы сервер понимал, что при подключении клиента, все последующие сообщения статистики ведомых контроллеров относились только к нему.
    Возможно мой вопрос не корректен, но я по необходимости предоставлю схему работы для Вас, так сказать чтобы все описанное выше, было предметным.

    Сейчас я реализовал работу с одним контроллером, но мне не удаётся реализовать работу с двумя, так как серверу абсолютно все равно, кто шлёт информацию. Начинается путаница и несоответствие данных.

    Прошу Вас дать рекомендации.
    У меня есть соображения на счет того, что ответ на мой вопрос кроется непосредственно в методе реализации сокет сервера.

    Утром скину листинг и схему.
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Вадим Круговой По мимо данных контроллер должен так же передавать свои идентификатор. Когда контроллер будешь прошивать, задай им каждому номера. Эти номера так же вбей в базу в отдельную таблицу, с описанием контроллера.
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    Так же неясно, если связь идёт в одну сторону зачем городить веб-сокеты?
     
  4. Вадим Круговой

    С нами с:
    17 июн 2019
    Сообщения:
    5
    Симпатии:
    0
    Контроллер-координатор, осуществляющий отправку данных на сервер имеет уникальный номер IMEI, который служит идентификатором.
    Есть таблица "справочник контроллеров координаторов" и таблица "журнал данных"
    При первом подключении к серверу, уникальные данные о координаторе записываются в справочник, а информация с динамическими параметрами, например такими как: напряжение питания, ток потребления и т.д., записывается в таблицу "журнал данных", при этом каждая новая запись в журнале, соответствует ключевой записи (т.е. непосредственно относящейся к этому контроллеру). С контроллером координатором - проблем нет! Но вот как получать данные от остальных контроллеров "ведомых", с которыми он состоит в беспроводной сети, при этом сервер должен понимать, что все входящие данные относятся к модулю-координатору. Представьте 10 таких соединений. Как с ними работать в рамках сессии...
    --- Добавлено ---
    Здравствуйте. Я строил вопрос в рамках только одного направления, т.е. сбора статистики, так сказать разбил задачу на подзадачи. Естественно управление работой также должно быть реализовано. Соединение должно быть постоянным как и обмен данными между клиентом и сервером.
     

    Вложения:

  5. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Ведомый контроллер отдает данные? Да отдает. Он может отдать как его зовут? Да может =)
    Он же понимает где напряжение питания, а где ток потребления , так же и поймет где у него просто название.

    Даже если у вас тупо идет так 380, 140, вася0001
    Ему же можно обяснить что первая цифра это одно, следующая это другое...
    --- Добавлено ---
    Схема обмена даными.JPG
    --- Добавлено ---
    Контроллеру координатору должно быть пофиг, он просто передает данные. А вот в твоей БД уже видно к кому относятся данные
    Код (Text):
    1. data1 |  data2 | data3      | IMEI
    2. 221   |  4     | василий001 | 12345
    3. 220   |  4     | василий002 | 12345
    4. 222   |  4     | василий003 | 12345
     
    #5 Artur_hopf, 18 июн 2019
    Последнее редактирование: 18 июн 2019
  6. Вадим Круговой

    С нами с:
    17 июн 2019
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте. Я строил вопрос в рамках только одного направления, т.е. сбора статистики, так как . Естественно управление работой также должно быть реализовано. Соединение должно быть постоянным как и обмен данными между клиентом и сервером.
    --- Добавлено ---
    Как понимать что Василий001, Василий002, Василий003 относятся непостредствонно к IMEI 12345 в рамках этого же прозрачного TCP соединения!?
     

    Вложения:

    • Time Line.GIF
      Time Line.GIF
      Размер файла:
      21,9 КБ
      Просмотров:
      1
  7. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Вадим Круговой почему не mac 1-6 ? Три рабочие и три в резерве?
    --- Добавлено ---
    Код (Text):
    1. data1 |  data2 | data3 | IMEI
    2. 221   |  4     | mac1  | 12345
    3. 220   |  4     | mac2  | 12345
    4. 222   |  4     | mac3  | 12345
    5. 221   |  4     | mac1  | 67890
    6. 220   |  4     | mac2  | 67890
    7. 222   |  4     | mac3  | 67890
    8. 221   |  4     | mac1  | 13680
    9. 220   |  4     | mac2  | 13680
    10. 222   |  4     | mac3  | 13680
     
  8. Вадим Круговой

    С нами с:
    17 июн 2019
    Сообщения:
    5
    Симпатии:
    0
    Как понимать что Василий001, Василий002, Василий003.
    Это ежесекундно повторяющиеся данные.
    --- Добавлено ---
    Ну вот например.
    Есть клиент 1 есть Клиент 2 и Клиент 3.
    И эти клиенты постоянно шлют данные.
    Данные | Клиент
    abc | Клиент 1
    aaa | Клиент 2
    bba | Клиент 1
    123 | Клиент 3
    333 | Клиент 3

    Как понимать к какому клиенту относятся эти данные?
     
  9. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Я уже не знаю как вам объяснить по другому. Хоть в АСУТП 8 лет проработал. Вот у вас есть контроллер. Он собирает данные с каких то датчиков. У него там программка, где четко написано в модуле ввода вывода что приходит что уходит. И каким то образом прописаны данные которые он собирает. Вам к этим данным нужно прописать имя контроллера. Каким угодно образом. Когда контроллер координатор будет собирать данные он неведомым для себя образом заберет и имя контроллера, потому что он должен забирать все что там есть. То есть у вас помимо данных с датчика будет и имя, уникальное для каждого контроллера. Вам останется только перед записью данных со всех контроллеров умудрится записать и имя контроллера.
    И не записывать в таблицу так:
    Данные | Клиент
    abc | Клиент 1
    aaa | Клиент 2
    bba | Клиент 1
    123 | Клиент 3
    333 | Клиент 3


    а записывать так
    Код (Text):
    1. температура | давление|  напряжение|  ток|  сопротивление| имя контроллера|   клиент
    2. a           | b       | c          | d   |         e     |  василий       |   клиент 1
    Более того я бы вообще абстрагировался от всех контроллеров. А вас есть датчики, у всех датчиков есть позиция где они стоят. Поэтому в базу надо писать не клиент1,2,3. А конкретно позицию датчика. И таблица должна выглядеть так:
    Название датчика | Параметр датчика
    ПЕ0213 | 234
    РЕ2334 | 4
     
    #9 Artur_hopf, 18 июн 2019
    Последнее редактирование: 18 июн 2019
  10. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Вместо названия датчика, там должна быть позиция. Всякие датчики и контроллеры могут выходить из строя, не надо к ним жестко привязываться.
    --- Добавлено ---
    @Вадим Круговой и для наглядности:
    Безымянный.png
     
  11. Вадим Круговой

    С нами с:
    17 июн 2019
    Сообщения:
    5
    Симпатии:
    0
    Ну вот например.
    Есть клиент 1 есть Клиент 2 и Клиент 3.
    И эти клиенты постоянно шлют данные.
    Данные | Клиент
    abc | Клиент 1
    aaa | Клиент 2
    bb | Клиент 1
    abc | Клиент 3
    abc | Клиент 3
    Благодарю Вас за уделенное мне время. Я уловил смысл предложенной Вами схемы работы.
     
  12. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Если контроллер или датчик выйдет из строя вам будет проще.
    --- Добавлено ---
    @Вадим Круговой вас один фиг в будущем попросят вытягивать данные например за прошлый год. А если у вас за этот промежуток сгорел 1 контроллер и 10 датчиков вы эти данные никак не вытянете. А так у вас есть четкая позиция. И она никогда не изменится.