Есть ли способ передавать и получать данные между моделируемым и реальным модемом в UnetStack? - PullRequest
1 голос
/ 07 ноября 2019

Я работаю над протоколом маршрутизации на основе атрибутов , где исходный узел (Узел A) собирает атрибуты от двух соседних узлов (Узлы B и C) и, основываясь на ранжировании, Узел A решает переслать егоданные либо к узлу B, либо к узлу C

Теперь я хочу протестировать этот алгоритм в тестовом режиме с реальными модетами, совместимыми с UnetStack, но доступно только два реальных модема, поэтому, если я создаю свою топологию с исходным узлом(Узел A) работает на ноутбуке (с использованием имитированного модема), а соседние узлы (Узлы B и C) работают с использованием реальных модемов. Есть ли способ, которым Узел A может передавать и получать данные от Узлов B и C. Поскольку Узлы B и C используют реальные модемы.

Пожалуйста, дайте мне знать, как я могу сделать это, используя только два реальных модема, такжепредложить, если есть какой-либо другой подход.

1 Ответ

1 голос
/ 13 ноября 2019

Когда 2 модема находятся в воде, они могут общаться друг с другом, используя свой PHYSICAL сервисный агент (часто называемый phy). Агенты более высокого уровня, такие как uwlink, затем используют phy для обеспечения надежности и т. Д.

В моделируемой среде ФИЗИЧЕСКАЯ услуга предоставляется агентом HalfDuplexModem (также называемым phy). Этот агент может общаться с HalfDuplexModem агентами на других имитируемых узлах так же, как модемы под водой общаются друг с другом. Агенты более высокого уровня, такие как uwlink, будут использовать этот phy для связи, и приложение не заметит разницы.

Однако HalfDuplexModem в моделируемой среде не может напрямую передать пакетк реальному модему в воде, или получите пакет от него. Узлы в моделируемой среде могут общаться только друг с другом, а узлы в воде могут общаться только друг с другом. Таким образом, вы можете представить себе симулированный мир как одну подсеть, а реальный мир - как другую подсеть, даже если оба они могут быть частью одного Unet. Чтобы соединить подсети вместе, вам нужен узел шлюза, который передает пакеты между подсетями.

Чтобы сделать вещи более конкретными, скажем, узлы B и C находятся в водяная подсеть , и узел Aнаходится в подсети моделирования . Чтобы узел A мог общаться с узлами B и C, вам необходим хотя бы один из узлов B или C, который также должен находиться в подсети моделирования. Чтобы избежать многошаговой маршрутизации, скажем, мы предпочитаем, чтобы узлы B и C присутствовали в обеих подсетях. Способ сделать это - создать симуляцию с узлами A, B и C. Затем на узлах B и C добавьте новый phy2 PHYSICAL агент, который будет использоваться новым агентом службы uwlink2 LINK. Агент phy2 будет прокси для реального модема, посылая любые TxFrameReq или DatagramReq модему через UnetSocket и передавая RxFrameNtf (и другие уведомления) от модема. Затем настройте router на узлах B и C для маршрутизации пакетов на узлы B и C через uwlink2 и на узел A через uwlink.

Настройка агента на узлах B и C будет выглядеть как-тонапример:

|--------------------- Simulator -------------------------------|    |--- Modem ----|
[DatagramReq] --> router -A--> uwlink  --> phy (HalfDuplexModem)
                     \----BC-> uwlink2 --> phy2 -->  UnetSocket  --> phy (on modem)

с общей конфигурацией сети:

    A -sim--- B ---(UnetSocket)--- modem B --\
     \                                    acoustic
      \-sim-- C ---(UnetSocket)--- modem C --/

Единственный агент, который вам нужно написать, это прокси phy2. Писать довольно просто, так как вам нужно отправить все сообщения на него через сокет к модему и отправить все уведомления из сокета обратно в тему уведомлений для прокси-агента.

...