Глава 6. Обзор классов Модуля Satellite
В данной главе будет дан обзор основных классов модуля Satellite. Обзор каждого класса будет строиться по одной и той же схеме:
описание полей;
описание атрибутов NS-3;
описание методов.
Следует обратить внимание, что под атрибутами класса понимаются те поля C++ класса, которые зарегистрированы в системе NS-3 с помощью вызова метода .AddAttribute(...) базового класса. Такая регистрация, позволяет системе конфигурации и рефлексии NS-3 выполнять доступ (чтение, запись к этим полям экземпляров класса). Проще говоря: она создаёт мост между системой конфигурации NS-3 и существующим полем C++-класса, делая это поле настраиваемым извне без изменения исходного кода. Каждый вызов .AddAttribute() регистрирует в объекте TypeId метаданные, которые включают:
Имя атрибута (строка);
Описание (для документации и GUI);
Значение по умолчанию (ns3::AttributeValue);
Аксессор (связь с полем класса, например &SatGwMac::m_guardTime);
Чекер (валидатор типа и диапазона значений);
Эта запись попадает в глобальный реестр типов NS-3 при инициализации программы (благодаря NS_OBJECT_ENSURE_REGISTERED).
6.1 Класс SatNetDevice
Класс SatNetDevice представляет собой сетевое устройство, предназначенное для использования в симуляциях спутниковой связи в NS-3, в частности на узлах пользовательских терминалов и шлюзов. Он интегрирует спутниковый стек протоколов (LLC, MAC, PHY) с общей архитектурой узла NS-3, обеспечивая передачу и прием данных, а также поддержку трассировки статистики производительности.
Описание полей
Нет публичных полей.
Описание атрибутов
ReceiveErrorModel (PointerValue):
модель ошибок приемника для симуляции потери пакетов.
SatMac (PointerValue):
указатель на уровень управления доступом к среде (MAC), присоединенный к данному устройству.
SatPhy (PointerValue):
указатель на физический уровень (PHY), присоединенный к данному устройству.
SatLlc (PointerValue):
указатель на уровень управления логическим каналом (LLC), присоединенный к данному устройству.
MaximumTransmissionUnit (UintegerValue, по умолчанию: 0xffff):
максимальная единица передачи (MTU) в байтах.
EnableStatisticsTags (BooleanValue, по умолчанию: false):
логический флаг, при значении true добавляет теги времени и адреса к каждому переданному пакету для вычисления статистики.
PacketTrace (TracedCallback):
источник трассировки для событий пакетов (отправка/получение).
Tx (TracedCallback):
источник трассировки для пакетов, отправленных в канал.
SignallingTx (TracedCallback):
источник трассировки для отправленных сигнальных (управляющих) пакетов.
Rx (TracedCallback):
источник трассировки для полученных пакетов.
RxDelay (TracedCallback):
источник трассировки для полученных пакетов с информацией о задержке.
RxJitter (TracedCallback):
источник трассировки для полученных пакетов с информацией о джиттере.
RxLinkDelay (TracedCallback):
источник трассировки для полученных пакетов с информацией о задержке на линии связи.
RxLinkJitter (TracedCallback):
источник трассировки для полученных пакетов с информацией о джиттере на линии связи.
Описание методов
GetTypeId(void):
статический метод для регистрации TypeId системы объектов NS-3.
регистрирует все атрибуты устройства (ReceiveErrorModel, SatMac, SatPhy и др.);
регистрирует источники трассировки (Tx, Rx, RxDelay и др.);
Возвращает объект TypeId.
SatNetDevice():
конструктор по умолчанию.
инициализирует указатели на PHY, MAC, LLC нулевыми значениями;
устанавливает флаг статистики в false;
устанавливает значение MTU по умолчанию (0xffff).
Receive(Ptr packet):
метод вызывается при получении пакета от нижележащих слоев.
на основе типа узла определяет направление линии (прямое или обратное);
создает запись трассировки события получения пакета;
если включен флаг статистики, извлекает теги адреса, времени и времени в линии для вычисления задержки и джиттера;
вызывает колбек приема (m_rxCallback) для передачи пакета на верхний уровень.
SetPhy(Ptr phy):
устанавливает указатель на физический уровень (SatPhy раздел 6.2).
SetMac(Ptr mac):
устанавливает указатель на уровень MAC (SatMac раздел 6.3).
SetLlc(Ptr llc):
устанавливает указатель на уровень LLC (SatLlc раздел 6.4).
SetNodeInfo(Ptr nodeInfo):
устанавливает информационный объект узла, содержащий тип узла, идентификатор и MAC-адрес.
ToggleState(bool enabled):
переключает состояние устройства (включено/выключено), используемое для скачкообразного перемещения луча (beam hopping).
если параметр enabled равен true, вызывает метод Enable у MAC-уровня;
если параметр enabled равен false, вызывает метод Disable у MAC-уровня.
SetReceiveErrorModel(Ptr em):
устанавливает модель ошибок для симуляции потерь пакетов (хотя в модуле спутниковой связи она обычно используется на уровне PHY).
SetIfIndex(const uint32_t index):
устанавливает индекс интерфейса устройства.
GetIfIndex(void) const:
возвращает индекс интерфейса устройства.
GetPhy(void) const:
возвращает указатель на физический уровень (SatPhy).
GetMac(void) const:
возвращает указатель на уровень MAC (SatMac).
GetLlc(void) const:
возвращает указатель на уровень LLC (SatLlc).
SetPacketClassifier(Ptr classifier):
устанавливает классификатор пакетов для определения идентификатора потока (flowId).
GetPacketClassifier(void) const:
возвращает указатель на классификатор пакетов.
SetAddress(Address address):
устанавливает MAC-адрес устройства, преобразуя переданный адрес в тип Mac48Address.
GetAddress(void) const:
возвращает MAC-адрес устройства.
SetMtu(const uint16_t mtu):
устанавливает значение максимальной единицы передачи (MTU). Возвращает true.
GetMtu(void) const:
возвращает текущее значение MTU.
IsLinkUp(void) const:
возвращает true, указывая на то, что ссылка активна.
AddLinkChangeCallback(Callback callback):
пустой метод, требуемый интерфейсом NetDevice (обратные вызовы изменений ссылки не поддерживаются).
IsBroadcast(void) const:
возвращает true, так как устройство поддерживает широковещательную рассылку.
GetBroadcast(void) const:
возвращает широковещательный MAC-адрес (ff:ff:ff:ff:ff:ff).
IsMulticast(void) const:
возвращает true, так как устройство поддерживает групповую рассылку.
GetMulticast(Ipv4Address multicastGroup) const:
принимает IPv4-адрес мультикаст-группы. Возвращает соответствующий MAC-адрес.
GetMulticast(Ipv6Address addr) const:
принимает IPv6-адрес мультикаст-группы. Возвращает соответствующий MAC-адрес.
IsPointToPoint(void) const:
возвращает false, так как это не соединение точка-точка.
IsBridge(void) const:
возвращает false, так как устройство не является сетевым мостом.
Send(Ptr packet, const Address& dest, uint16_t protocolNumber):
основной метод отправки пакета с верхнего уровня.
если включена статистика, добавляет в пакет теги с адресом источника и метками времени (SatAddressTag, SatDevTimeTag, SatDevLinkTimeTag), проверяя их наличие перед добавлением;
создает запись трассировки отправки;
инициирует трассировку Tx;
классифицирует пакет для получения идентификатора потока (flowId);
ставит пакет в очередь на уровне LLC.
SendFrom(...):
принимает пакет, исходный адрес, адрес назначения и номер протокола.
если включена статистика, добавляет теги адреса и времени, аналогично методу Send;
создает запись трассировки отправки;
классифицирует пакет;
ставит пакет в очередь на уровне LLC.
SendControlMsg(Ptr msg, const Address& dest):
метод для отправки управляющих сообщений.
создает пакет на основе размера сообщения;
если включена статистика, добавляет теги адреса и времени;
резервирует идентификатор в MAC и сохраняет сообщение в контейнере;
добавляет к пакету тег SatControlMsgTag с типом сообщения и идентификатором;
выполняет трассировку сигнального пакета (SignallingTx);
ставит пакет в очередь на уровне LLC.
GetNode(void) const:
возвращает указатель на узел Node, к которому подключено это устройство.
SetNode(Ptr node):
устанавливает указатель на узел Node.
NeedsArp(void) const:
возвращает true, указывая на необходимость использования ARP.
SetReceiveCallback(NetDevice::ReceiveCallback cb):
устанавливает функцию обратного вызова, которая будет вызвана при получении пакета.
DoDispose(void):
приватный метод для освобождения ресурсов перед уничтожением объекта.
обнуляет обратные вызовы;
освобождает ресурсы MAC и LLC, если они заданы;
обнуляет указатели на PHY, MAC, LLC, Node, модель ошибок и классификатор;
вызывает метод DoDispose родительского класса.
SetPromiscReceiveCallback(PromiscReceiveCallback cb):
устанавливает функцию обратного вызова для приема пакетов в промискуитетном режиме.
SupportsSendFrom(void) const:
возвращает true, указывая, что устройство поддерживает отправку данных от указанного исходного адреса.
GetChannel(void) const:
возвращает нулевой указатель, так как каналы присоединяются к PHY-уровню, а не непосредственно к NetDevice.
6.2 Класс SatPhy
Класс SatPhy является базовым классом физического уровня для спутниковой системы связи в симуляторе NS-3. Он реализует общую функциональность для различных типов узлов спутниковой сети, таких как пользовательский терминал, шлюз и спутник. Класс управляет объектами передатчика (SatPhyTx) и приемника (SatPhyRx), обрабатывает параметры антенного усиления, мощности передачи, шумовой температуры и различных потерь сигнала. Кроме того, SatPhy отвечает за расчет отношения сигнал/шум (SINR), управление трассировкой пакетов (задержка, джиттер, MODCOD) и передачу статистической информации на верхние уровни через обратные вызовы.
Описание полей
Нет публичных полей.
Описание атрибутов
ReceiveCb (CallbackValue):
callback для обработки принятых пакетов физическим уровнем и передачи их на верхний уровень;
CnoCb (CallbackValue):
callback для передачи информации об отношении несущая/плотность шума (C/N0);
AverageNormalizedOfferedLoadCallback (CallbackValue):
callback для передачи информации о средней нормированной нагрузке канала произвольного доступа;
EnableStatisticsTags (BooleanValue, по умолчанию: false):
флаг, указывающий, следует ли добавлять специальные теги к передаваемым пакетам для вычисления статистики (задержки, джиттера и т.д.).
Описание методов
SatPhy(CreateParam_t& params):
Основной конструктор для создания объекта PHY с заданными параметрами.
создает объекты SatPhyTx и SatPhyRx в зависимости от указанного стандарта (DVB или LORA);
устанавливает каналы передачи и приема, а также привязывает PHY к устройству и модели мобильности;
инициализирует идентификаторы спутника и луча.
Initialize():
Метод инициализации физического уровня.
вычисляет эквивалентную изотропно излучаемую мощность ( EIRP) без усиления антенны;
устанавливает идентификаторы спутника и луча в модулях TX и RX;
настраивает обратные вызовы для приема пакетов, информации C/N0 и нагрузке произвольного доступа;
конфигурирует максимальное усиление антенны, потери антенны и значение затухания по умолчанию для модулей TX и RX.
CalculateSinr(double sinr, double otherInterference):
Рассчитывает итоговое отношение сигнал/интерференция/шум (SINR) с учетом дополнительной интерференции.
принимает рассчитанный SINR и значение другой интерференции;
возвращает финальное значение SINR по формуле сложения обратных величин.
SetTxAntennaGainPattern(...):
Устанавливает диаграмму направленности передающей антенны.
принимает указатель на шаблон диаграммы направленности и модель мобильности спутника;
передает эти параметры в модуль SatPhyTx.
SetRxAntennaGainPattern(...):
Устанавливает диаграмму направленности приемной антенны.
принимает указатель на шаблон диаграммы направленности и модель мобильности спутника;
передает эти параметры в модуль SatPhyRx.
ConfigureRxCarriers(...):
Конфигурирует приемные несущие.
принимает конфигурацию несущих (SatPhyRxCarrierConf) и конфигурацию суперфрейма;
передает параметры в модуль SatPhyRx для настройки приемников.
SetRxFadingContainer(...):
Устанавливает контейнер модели затухания для приемного пути. Принимает указатель на контейнер затухания и передает его в модуль SatPhyRx.
SetTxFadingContainer(...):
Устанавливает контейнер модели затухания для передающего пути. Принимает указатель на контейнер затухания и передает его в модуль SatPhyTx.
SetNodeInfo(...):
Устанавливает информацию об узле.
принимает указатель на объект SatNodeInfo, содержащий тип узла, идентификатор и MAC-адрес;
сохраняет информацию и передает ее в модуль SatPhyRx.
BeginEndScheduling():
Запускает планирование начала и конца фрейма или окна для процессов, использующих длину фрейма в качестве интервала. Делегирует вызов модулю SatPhyRx.
GetPhyTx():
Возвращает указатель на модуль передатчика (SatPhyTx).
GetPhyRx():
Возвращает указатель на модуль приемника (SatPhyRx).
SetPhyTx(...):
Устанавливает модуль передатчика. Принимает указатель на объект SatPhyTx и присваивает его внутреннему члену класса.
SetPhyRx(...):
Устанавливает модуль приемника. Принимает указатель на объект SatPhyRx и присваивает его внутреннему члену класса.
GetTxChannel():
Возвращает указатель на канал передачи. Получает канал из внутреннего модуля SatPhyTx.
SendPdu(...):
Отправляет блок данных (PDU) через физический уровень.
принимает контейнер пакетов, идентификатор несущей, длительность передачи и информацию о передаче (MODCOD, тип пакета и т.д.);
если включено, добавляет к пакетам временные метки;
создает параметры сигнала (SatSignalParameters) с указанием мощности, длительности и данных;
инициирует передачу через модуль SatPhyTx.
SendPduWithParams(...):
Отправляет PDU с использованием готовых параметров сигнала.
принимает указатель на параметры сигнала;
в базовой реализации вызывает ошибку, так как предназначен для переопределения в дочерних классах.
SetSatId(...):
Устанавливает идентификатор спутника. Принимает числовой идентификатор и обновляет его в объекте PHY, а также в модулях TX и RX.
SetBeamId(...):
Устанавливает идентификатор луча.
принимает числовой идентификатор луча;
обновляет идентификатор в PHY и модулях TX/RX;
возвращает true, если произошло подключение к лучу или отключение от него.
Receive(...):
Обрабатывает получение пакета от нижнего уровня.
принимает параметры сигнала и флаг наличия физической ошибки;
записывает событие в трассировку пакетов (отправка или сброс);
если произошла ошибка PHY, пакеты сбрасываются;
в противном случае вызывает методы трассировки задержки/джиттера и информации о MODCOD, а затем передает пакеты на верхний уровень через колбек m_rxCallback.
CnoInfo(...):
Передает информацию об отношении несущая/шумовая плотность ( C/N0 ). – принимает идентификаторы спутника и луча, адреса отправителя и получателя, значение C/N0 и флаг спутникового MAC; – вызывает соответствующий callback для уведомления верхних уровней.
AverageNormalizedOfferedRandomAccessLoadInfo(...):
Передает информацию о средней нормализованной нагрузке канала произвольного доступа.
принимает идентификаторы спутника, луча и несущей, идентификатор канала распределения и значение нагрузки;
вызывает колбек для уведомления о нагрузке произвольного доступа.
SetChannelPairGetterCallback(...):
Устанавливает колбек для получения пар каналов. Принимает функцию обратного вызова, которая позволяет получить пару каналов (передача и прием) для конкретного луча.
RxTraces(...):
Приватный метод. Выполняет трассировку принятых пакетов.
принимает контейнер принятых пакетов;
извлекает адрес отправителя из тегов пакета;
вызывает трассировочные источники для регистрации получения, задержки, джиттера и других параметров для каждого пакета.
ModcodTrace(...):
Приватный метод. Выполняет трассировку информации о модуляции и кодировании (MODCOD).
принимает параметры принятого сигнала;
в зависимости от направления линии (прямая или обратная) извлекает адрес и вызывает трассировочный источник RxLinkModcod.
6.3 Класс SatMac
Класс SatMac является базовым классом MAC уровня для устройств спутниковой сети (SatNetDevices). Он реализует общую функциональность уровня управления доступом к среде для пользовательских терминалов и шлюзов. Более специализированные реализации находятся в производных классах. Сам спутник не имеет подуровня MAC.
Описание полей
Нет публичных полей.
Описание атрибутов
EnableStatisticsTags (Boolean, по умолчанию: false):
если включено, к каждому переданному пакету добавляются специальные теги для помощи в вычислении статистики;
NcrVersion2 (Boolean, по умолчанию: false):
используемая версия протокола NCR (значение false соответствует версии 1, true — версии 2).
Описание методов
GetTypeId():
Статический метод для регистрации TypeId.
регистрирует класс в системе NS-3;
добавляет атрибуты EnableStatisticsTags и NcrVersion2;
добавляет источники трассировки для отслеживания пакетов, задержки, джиттера и времени обслуживания луча;
SatMac(...):
Конструктор класса.
существует в двух перегрузках: одна не принимает аргументов (вызывает ошибку использования), вторая принимает идентификаторы спутника satId и луча beamId;
инициализирует внутренние переменные и режимы регенерации на основе топологии.
~SatMac():
Деструктор класса.
DoDispose():
Приватный метод очистки ресурсов.
записывает длительность последнего обслуживания луча в трассировку, если передача была включена;
обнуляет все колбеки (передачи, приема, управления, маршрутизации);
вызывает метод DoDispose родительского класса.
SetNodeInfo(Ptr nodeInfo):
Устанавливает информацию об узле. Сохраняет указатель на объект с информацией об узле, включая его тип, идентификатор и MAC-адрес.
GetSatId()
Возвращает идентификатор спутника.
SetSatId(uint32_t satId):
Устанавливает идентификатор спутника.
GetBeamId():
Возвращает идентификатор луча.
SetBeamId(uint32_t beamId):
Устанавливает идентификатор луча.
GetAddress():
Возвращает MAC-адрес устройства, полученный из информации об узле.
SetHandoverModule(Ptr handoverModule):
Устанавливает модуль хэндовера. Сохраняет указатель на модуль, ответственный за выполнение переключения между лучами.
SetTransmitCallback(SatMac::TransmitCallback cb):
Устанавливает колбек передачи. Сохраняет функцию обратного вызова, которая используется для отправки пакетов на физический уровень (PHY).
SetReceiveCallback(SatMac::ReceiveCallback cb):
Устанавливает колбек приема. Сохраняет функцию обратного вызова, которая вызывается при получении пакета для передачи на верхний уровень;
SetLoraReceiveCallback(SatMac::LoraReceiveCallback cb):
Устанавливает колбек для приема пакетов LoRa.
SetReadCtrlCallback(SatMac::ReadCtrlMsgCallback cb):
Устанавливает колбек для чтения управляющих сообщений.
SetReserveCtrlCallback(SatMac::ReserveCtrlMsgCallback cb):
Устанавливает колбек для резервирования ID управляющего сообщения.
SetSendCtrlCallback(SatMac::SendCtrlMsgCallback cb):
Устанавливает колбек для отправки управляющего сообщения.
SetBeamSchedulerCallback(SatMac::BeamSchedulerCallback cb):
Устанавливает колбек для получения планировщика луча. Используется для получения объекта SatBeamScheduler по ID луча.
SetUpdateIslCallback(SatMac::UpdateIslCallback cb):
Устанавливает колбек для обновления маршрутов межспутниковых линий (ISL).
SetRoutingUpdateCallback(SatMac::RoutingUpdateCallback cb):
Устанавливает колбек обновления маршрутизации. Сохраняет функцию, вызываемую для обновления таблиц маршрутизации и ARP после хэндовера.
ReserveIdAndStoreCtrlMsgToContainer(Ptr msg):
Резервирует идентификатор и сохраняет управляющее сообщение. Вызывает соответствующий колбек для сохранения сообщения в контейнере и получения его ID.
SendCtrlMsgFromContainer(uint32_t sendId):
Отправляет управляющее сообщение из контейнера.
использует внутренний ID (sendId) для отправки сообщения через колбек;
возвращает ID, используемый при получении этого сообщения.
ReceiveQueueEvent(SatQueue::QueueEvent_t event, uint8_t flowIndex):
Обрабатывает события очереди.
является виртуальным методом, предназначенным для переопределения в производных классах;
в базовой реализации не выполняет действий.
Enable():
Включает уровень MAC в работу.
устанавливает флаг m_txEnabled в true, разрешая передачу данных на PHY-уровень;
сохраняет время включения луча.
Disable():
Выключает уровень MAC.
записывает время обслуживания луча в трассировку перед отключением;
устанавливает флаг m_txEnabled в false.
SetSatelliteAddress(Address satelliteAddress):
Устанавливает адрес спутника.
сохраняет MAC-адрес спутника на другом конце линии связи;
устанавливает флаг m_isRegenerative в true, указывая на регенеративный режим.
SetTimeTag(SatPhy::PacketContainer_t packets):
Приватный метод установки временных тегов.
добавляет теги SatMacTimeTag и SatMacLinkTimeTag к пакетам, если включен сбор статистики;
используется для вычисления задержки на стороне приемника.
SendPacket(...):
Защищенный метод отправки пакетов.
принимает контейнер пакетов, идентификатор несущей, длительность передачи и параметры сигнала;
вызывает SetTimeTag для добавления временных меток;
если спутник регенеративный, обновляет адрес назначения в MAC-теге на адрес спутника;
обрабатывает управляющие сообщения, найденные в пакетах: извлекает их из тегов, отправляет через контейнер управляющих сообщений и обновляет теги;
вызывает колбек m_txCallback для передачи пакетов на физический уровень.
RxTraces(SatPhy::PacketContainer_t packets):
Защищенный метод обработки трассировки приема.
перебирает полученные пакеты, если включен сбор статистических тегов;
проверяет, предназначен ли пакет текущему узлу (по MAC-адресу);
извлекает адрес отправителя из тегов;
вычисляет задержку и джиттер на основе временных тегов (SatMacTimeTag, SatMacLinkTimeTag);
вызывает источники трассировки Rx, RxDelay, RxJitter, RxLinkDelay, RxLinkJitter с соответствующими параметрами.
6.4 Класс SatLlc
Класс SatLlc представляет собой базовый класс уровня управления логическим каналом (LLC). Он управляет экземплярами инкапсуляторов и деинкапсуляторов, отвечающих за фрагментацию, дефрагментацию и инкапсуляцию пакетов данных. Класс обеспечивает базовую функциональность для обработки пакетов, управления очередями и взаимодействия с верхними и нижними уровнями через колбеки. Поскольку логика работы для шлюза и пользовательского терминала различается, SatLlc является абстрактным классом, который расширяется в производных классах (SatGwLlc и SatUtLlc).
Описание полей
Нет публичных полей.
Описание атрибутов
FwdLinkArqEnabled (Boolean, по умолчанию: false):
Включает механизм ARQ (автоматический повторный запрос) в прямой линии связи (от шлюза к пользовательскому терминалу).
RtnLinkArqEnabled (Boolean, по умолчанию: false):
Включает механизм ARQ в обратной линии связи (от пользовательского терминала к шлюзу).
Описание методов
SatLlc():
Конструктор по умолчанию. Инициализирует члены класса значениями по умолчанию, а также получает режимы регенерации сигнала для прямой и обратной линий связи из топологии синглтона SatTopology.
~SatLlc():
Деструктор класса.
DoDispose():
Приватный метод очистки. Удаляет все инкапсуляторы и деинкапсуляторы из контейнеров, обнуляет колбеки и вызывает метод DoDispose родительского класса.
Enque(Ptr packet, Address dest, uint8_t flowId):
Принимает пакет от верхнего уровня для постановки в очередь на передачу. Если необходимый инкапсулятор не найден, он создается. Метод добавляет к пакету тег времени и тег сквозного адреса E2E, затем передает пакет в соответствующий инкапсулятор.
Receive(Ptr packet, Mac48Address source, Mac48Address dest):
Принимает пакет данных от нижнего уровня (MAC). Записывает событие в трассировку, извлекает идентификатор потока из тега пакета и находит соответствующий деинкапсулятор для обработки пакета. Если деинкапсулятор не существует, он создается.
ReceiveAck(Ptr ack, Mac48Address source, Mac48Address dest):
Обрабатывает полученное сообщение подтверждения ARQ (ACK). Находит соответствующий инкапсулятор, меняя местами источника и получателя, и передает ему ACK для обработки.
GetSatLinkTxDir():
Виртуальный метод для получения направления линии передачи. В базовой реализации возвращает LD_UNDEFINED.
GetSatLinkRxDir():
Виртуальный метод для получения направления линии приема. В базовой реализации возвращает LD_UNDEFINED.
ReceiveHigherLayerPdu(Ptr packet, Mac48Address source, Mac48Address dest):
Принимает PDU от сущности инкапсулятора или деинкапсулятора. Проверяет наличие тега управляющего сообщения. Если это ACK ARQ, считывает сообщение через колбек и вызывает ReceiveAck. В противном случае удаляет тег адреса E2E и передает пакет на верхний уровень через колбек получения.
AddEncap(...):
Добавляет инкапсулятор в контейнер. Принимает на вход MAC-адрес источника, MAC-адрес назначения, идентификатор потока, указатель на добавляемый инкапсулятор. Метод создает ключ на основе адресов и идентификатора потока и сохраняет указатель на инкапсулятор. • AddDecap(...): Добавляет деинкапсулятор в контейнер. Принимает на вход MAC-адрес источника, MAC-адрес назначения, идентификатор потока, указатель на добавляемый деинкапсулятор. Метод создает ключ на основе адресов и идентификатора потока и сохраняет указатель на деинкапсулятор.
SetNodeInfo(Ptr nodeInfo):
Устанавливает указатель на информацию об узле, содержащую тип узла, идентификатор и MAC-адрес.
SetReceiveCallback(SatLlc::ReceiveCallback cb):
Устанавливает колбек, который вызывается для передачи полученных пакетов на верхний уровень.
BuffersEmpty():
Проверяет, пусты ли буферы во всех инкапсуляторах. Возвращает true, если количество байт в буфере каждого инкапсулятора равно нулю, иначе false.
ControlBuffersEmpty():
Проверяет, пусты ли буферы, предназначенные для управляющих сообщений (control flow), во всех инкапсуляторах.
GetNBytesInQueue():
Возвращает общее количество байт, находящихся в очередях всех инкапсуляторов. Метод суммирует размеры пакетов, хранящихся в SatQueue каждого инкапсулятора.
GetNPacketsInQueue():
Возвращает общее количество пакетов, находящихся в очередях всех инкапсуляторов. Метод суммирует количество пакетов в SatQueue каждого инкапсулятора.
SetReadCtrlCallback(SatLlc::ReadCtrlMsgCallback cb):
Устанавливает колбек для чтения управляющих сообщений из хранилища сообщений.
SetCtrlMsgCallback(SatBaseEncapsulator::SendCtrlCallback cb):
Устанавливает колбек для отправки управляющих сообщений. Этот колбек сохраняется и используется инкапсуляторами.
SetGwAddress(Mac48Address address):
Устанавливает MAC-адрес шлюза.
SetSatelliteAddress(Mac48Address address):
Устанавливает MAC-адрес спутника (используется при регенерации в сети).
SetAdditionalHeaderSize(uint32_t additionalHeaderSize):
Устанавливает дополнительный размер заголовка, который должен быть добавлен при инкапсуляции.
NotifyTxOpportunity(...):
Чистый виртуальный метод, вызываемый с уровня MAC для уведомления о возможности передачи (Tx Opportunity). Должен быть реализован в производных классах. Принимает на вход размер доступного окна передачи в байтах, MAC-адрес пользовательского терминала, для которого предоставлена возможность, идентификатор потока, ссылку для возврата количества байт, оставшихся неиспользованными, ссылку для возврата минимального размера следующего окна передачи.
GetSchedulingContexts(std::vector>& output):
Чистый виртуальный метод для создания и заполнения объектов планирования на основе информации уровня LLC. Используется уровнем MAC для assists в планировании. Принимает на вход ссылку на вектор, куда будут добавлены указатели на объекты планирования.
GetNBytesInQueue(Mac48Address utAddress):
Чистый виртуальный метод для получения количества байт в очередях для конкретного пользовательского терминала. Должен быть реализован в производных классах. Принимает на вход MAC-адрес интересующего пользовательского терминала.
GetNPacketsInQueue(Mac48Address utAddress):
Чистый виртуальный метод для получения количества пакетов в очередях для конкретного пользовательского терминала. Должен быть реализован в производных классах. Принимает на вход MAC-адрес интересующего пользовательского терминала.
CreateEncap(Ptr key):
Чистый виртуальный метод для динамического создания нового инкапсулятора по требованию. Реализуется в производных классах, которые знают, какой тип инкапсулятора создать. Принимает на вход ключ, содержащий информацию о потоке для создания инкапсулятора.
CreateDecap(Ptr key):
Чистый виртуальный метод для динамического создания нового деинкапсулятора по требованию. Реализуется в производных классах, которые знают, какой тип деинкапсулятора создать. Принимает на вход ключ, содержащий информацию о потоке для создания деинкапсулятора.
6.5 Класс SatEnvVariables
Класс SatEnvVariables предназначен для управления переменными окружения и файловыми путями. Он отвечает за автоматическое определение расположения рабочего каталога, пути к исполняемому файлу, а также за поиск и создание директорий для данных и результатов симуляции. Класс обеспечивает механизм для организации выходных файлов в структурированные папки, логирования информации о запуске и сохранения различий в версиях кода.
Описание полей
Нет публичных полей.
Описание атрибутов
CurrentWorkingDirectory (String, по умолчанию: «»):
путь к текущему рабочему каталогу симулятора.
PathToExecutable (String, по умолчанию: «»):
путь к исполняемому файлу симулятора.
DataPath (String, по умолчанию: «contrib/satellite/data»):
относительный путь к папке с данными, содержащей сцены и дополнительные файлы.
SimulationCampaignName (String, по умолчанию: «»):
название кампании симуляции, которое влияет на структуру папки с результатами.
SimulationTag (String, по умолчанию: «default»):
тег, связанный с текущей симуляцией, используемый для идентификации выходных данных.
EnableSimulationOutputOverwrite (Boolean, по умолчанию: true):
флаг, разрешающий перезапись выходных файлов, если директория уже существует.
EnableSimInfoOutput (Boolean, по умолчанию: true):
флаг, включающий вывод информационного файла о параметрах симуляции.
EnableSimInfoDiffOutput (Boolean, по умолчанию: true):
флаг, включающий создание файла с различиями в коде (git diff).
ExcludeSatelliteDataFolderFromSimInfoDiff (Boolean, по умолчанию: true):
флаг, определяющий исключение папки с данными спутника из отчета о различиях.
Описание методов
GetTypeId(void):
статический метод для регистрации TypeId в NS-3.
возвращает уникальный идентификатор типа для объекта SatEnvVariables;
добавляет атрибуты в систему конфигурации.
GetInstanceTypeId(void) const:
метод получения идентификатора типа экземпляра. Возвращает TypeId, связанный с данным объектом.
SatEnvVariables():
конструктор класса.
инициализирует члены класса значениями по умолчанию;
вызывает ConstructSelf для обработки атрибутов на этапе создания;
запускает метод Initialize для первичной настройки путей.
~SatEnvVariables():
деструктор класса. Вызывает метод Dispose для освобождения ресурсов.
DoInitialize():
метод инициализации, вызываемый объектом.
определяет текущий рабочий каталог и путь к исполняемому файлу для ОС Linux или Apple;
проверяет наличие обязательных директорий (additional-input, scenarios, sgp4);
если включен вывод информации, инициализирует выходные папки и создает логи.
DoDispose():
метод очистки, сбрасывает строки путей и флаги инициализации.
SetCurrentWorkingDirectory(std::string currentWorkingDirectory):
метод для установки текущего рабочего каталога, принимает строку с путем к каталогу и сохраняет её в соответствующем члене класса.
SetPathToExecutable(std::string pathToExecutable):
метод для установки пути к исполняемому файлу, принимает строку с путем и обновляет член класса.
GetOutputPath():
метод получения пути к директории для вывода результатов.
если путь не инициализирован, вызывает InitializeOutputFolders для создания каталога;
возвращает строку с полным путем к выходной папке.
SetOutputPath(std::string outputPath):
метод явной установки пути для вывода результатов.
проверяет валидность указанной директории;
устанавливает флаг инициализациoного пути в true.
SetOutputVariables(std::string campaignName, std::string simTag, bool enableOutputOverwrite):
метод для установки параметров вывода и создания соответствующей папки. – принимает имя кампании, тег симуляции и флаг разрешения перезаписи; – обновляет внутренние переменные и вызывает инициализацию папок.
GetCurrentWorkingDirectory():
метод получения текущего рабочего каталога.
возвращает значение из атрибута, если оно задано;
в противном случае возвращает автоматически определенный путь.
GetPathToExecutable():
метод получения пути к исполняемому файлу.
возвращает значение из атрибута, если оно задано;
в противном случае возвращает автоматически определенный путь.
GetDataPath():
геттер для пути к директории данных, возвращает значение переменной-члена m_dataPath.
LocateDataDirectory():
метод для поиска директории с данными; – использует LocateDirectory с путем из m_dataPath для поиска папки в файловой системе; – возвращает полный путь к найденной директории.
LocateDirectory(std::string initialPath):
метод поиска директории путем подъема по дереву каталогов.
принимает начальный относительный путь;
проверяет наличие директории в текущем уровне и выше (до m_levelsToCheck раз);
возвращает полный путь к найденной директории или вызывает ошибку, если она не найдена.
LocateFile(std::string initialPath):
метод поиска файла путем подъема по дереву каталогов.
принимает начальный относительный путь к файлу;
проверяет наличие файла в текущем уровне и выше;
возвращает полный путь к найденному файлу или вызывает ошибку.
IsValidDirectory(std::string path):
статический метод проверки существования директории.
использует системный вызов stat для проверки пути и типа файла;
возвращает true, если путь существует и является директорией.
IsValidFile(std::string pathToFile):
метод проверки существования файла.
использует системный вызов stat для проверки пути;
возвращает true, если файл существует.
GetCurrentDateAndTime():
метод получения текущей даты и времени;
формирует строку с датой и временем в формате «дд-мм-гггг чч:мм:сс»;
возвращает полученную строку.
CreateDirectory(std::string path):
метод создания директории.
принимает путь к создаваемой папке;
использует системный вызов mkdir с правами доступа O777.
DumpSimulationInformation():
приватный метод для записи информации о симуляции в файл.
создает файл SimInfo.log в выходной директории;
выполняет команды git для получения информации о ревизии и времени завершения;
использует ExecuteCommandAndReadOutput для записи данных.
DumpRevisionDiff(std::string dataPath):
приватный метод для записи различий в коде.
создает файл SimDiff.log;
выполняет команду git diff с исключениями, если настроено;
сохраняет вывод команды в файл.
ExecuteCommandAndReadOutput(std::string command, Ptr outputContainer):
приватный метод для выполнения shell-команды.
принимает строку команды и контейнер для записи вывода;
использует popen для выполнения команды в цикле;
считывает вывод построчно и добавляет его в контейнер.
InitializeOutputFolders(std::string campaignName, std::string simTag, bool enableOutputOverwrite):
приватный метод для создания структуры выходных папок.
формирует путь на основе корневой папки, имени кампании и тега;
если папка существует и перезапись запрещена, добавляет числовой суффикс;
создает директорию и возвращает полный путь.
FormOutputPath(...):
приватный метод для составления строки c путем к выходной директории.
принимает корневой путь симуляции, имя кампании, тег симуляции и защитный тег;
объединяет компоненты в единую строку с использованием разделителя.
AddToPath(std::string path, std::string stringToAdd):
приватный метод для добавления сегмента к пути.
принимает базовый путь и добавляемую строку;
корректно добавляет разделитель «/», если базовый путь не пуст;
возвращает результирующий путь.
6.6 Класс SatTopology
Класс SatTopology предназначен для хранения и управления топологией всей спутниковой системы во время симуляции. Он содержит информацию обо всех узлах сцены (спутники, шлюзы, пользовательские терминалы и конечные пользователи), а также о связях между ними. Класс обеспечивает доступ к различным уровням протоколов (NetDevice, LLC, MAC, PHY) для каждого типа устройства и управляет такими элементами маршрутизации, как соединение пользовательского терминала со шлюзом или лучом.
Описание полей
Нет публичных полей.
Описание атрибутов
m_gws (NodeContainer):
контейнер, содержащий все узлы шлюзов в топологии.
m_gwIds (std::map>):
отображение идентификаторов шлюзов на соответствующие указатели узлов.
m_uts (NodeContainer):
контейнер, содержащий все узлы пользовательских терминалов.
m_orbiters (NodeContainer):
контейнер, содержащий все узлы спутников (орбитальных аппаратов).
m_gwUsers (NodeContainer):
контейнер, содержащий узлы пользователей, подключенных к шлюзам.
m_utUsers (NodeContainer):
контейнер, содержащий узлы пользователей, подключенных к пользовательским терминалам.
m_detailledUtUsers (std::map, NodeContainer>):
отображение узла пользовательского терминала на контейнер подключенных к нему пользователей.
m_utToGwMap (std::map, Ptr>):
отображение, связывающее узел пользовательского терминала с обслуживающим его узлом шлюза.
m_beamToGwMap (std::map>):
отображение, связывающее идентификатор луча с обслуживающим его узлом шлюза.
m_orbiterFeederMacMap (std::map, Ptr>):
отображение слоев MAC фидерной линии спутника на фактически используемые слои MAC;
m_gwLayers (std::map, GwLayers_s>):
структура для хранения стеков протоколов (NetDevice, LLC, MAC, PHY) для каждого шлюза.
m_utLayers (std::map, UtLayers_s>):
структура для хранения стеков протоколов (NetDevice, LLC, MAC, PHY) для каждого пользовательского терминала.
m_orbiterLayers (std::map, OrbiterLayers_s>):
структура для хранения стеков протоколов (NetDevice, LLC, MAC, PHY) для каждого спутника.
m_standard (SatEnums::Standard_t):
используемый стандарт связи (например, DVB или LORA).
m_forwardLinkRegenerationMode (SatEnums::RegenerationMode_t):
режим регенерации сигнала на прямой линии связи.
m_returnLinkRegenerationMode (SatEnums::RegenerationMode_t):
режим регенерации сигнала на обратной линии связи.
m_enableMapPrint (bool):
флаг, разрешающий или запрещающий вывод карт топологии.
Методы класса
SatTopology():
Конструктор по умолчанию. Инициализирует внутренние переменные, устанавливая флаг m_enableMapPrint в значение false.
~SatTopology():
Деструктор. Вызывает метод Reset для очистки всех ресурсов.
DoDispose():
Приватный метод диспетчеризации. Вызывает Reset для освобождения памяти и затем метод диспетчеризации родительского класса.
Reset():
Метод для сброса состояния топологии. Очищает все контейнеры узлов, карты отображений и устанавливает флаг печати карты в false.
SetStandard(SatEnums::Standard_t standard):
Метод для установки стандарта связи, используемого в симуляции (например, DVB или LORA).
GetStandard():
Метод для получения текущего стандарта связи.
SetForwardLinkRegenerationMode( SatEnums::RegenerationMode_t forwardLinkRegenerationMode):
Метод для установки режима регенерации для прямой линии связи.
GetForwardLinkRegenerationMode():
Метод для получения текущего режима регенерации прямой линии связи.
SetReturnLinkRegenerationMode( SatEnums::RegenerationMode_t returnLinkRegenerationMode):
Метод для установки режима регенерации для обратной линии связи.
GetReturnLinkRegenerationMode():
Метод для получения текущего режима регенерации обратной линии связи.
AddGwNode(uint32_t gwId, Ptr gw):
Метод добавления узла шлюза в топологию с указанным идентификатором.
AddUtNode(Ptr ut):
Метод добавления узла пользовательского терминала в топологию.
AddOrbiterNode(Ptr orbiter):
Метод добавления узла спутника в топологию.
AddGwUserNode(Ptr gwUser):
Метод добавления узла пользователя, подключенного к шлюзу.
AddUtUserNode(Ptr utUser, Ptr ut):
Метод добавления узла пользователя, подключенного к конкретному пользовательскому терминалу.
ConnectGwToUt(Ptr ut, Ptr gw):
Метод для создания связи между пользовательским терминалом и шлюзом. Проверяет, что терминал еще не подключен.
UpdateGwConnectedToUt(Ptr ut, Ptr gw):
Метод для изменения шлюза, обслуживающего конкретный пользовательский терминал. Используется при хэндовере.
DisconnectGwFromUt(Ptr ut):
Метод для разрыва связи между пользовательским терминалом и шлюзом.
GetGwFromUt(Ptr ut):
Метод для получения указателя на узел шлюза, к которому подключен указанный пользовательский терминал.
ConnectGwToBeam(uint32_t beamId, Ptr gw):
Метод для связи шлюза с определенным лучом по его идентификатору.
GetGwFromBeam(uint32_t beamId):
Метод для получения указателя на узел шлюза, обслуживающего указанный луч.
AddOrbiterFeederMacPair(Ptr mac, Ptr usedMac):
Метод для создания ассоциации между слоем MAC фидерной линии спутника и фактически используемым слоем MAC.
GetOrbiterFeederMacUsed(Ptr mac):
Метод для получения указателя на фактически используемый слой MAC фидерной линии спутника.
GetGwAddressInUt(uint32_t utId):
Метод для получения MAC-адреса шлюза в представлении пользовательского терминала. Учитывает маршрутизацию через спутник.
GetGwNodes():
Метод для получения контейнера со всеми узлами шлюзов.
GetUtNodes():
Метод для получения контейнера со всеми узлами пользовательских терминалов.
GetOrbiterNodes():
Метод для получения контейнера со всеми узлами спутников.
GetGwUserNodes():
Метод для получения контейнера с узлами пользователей шлюза.
GetUtUserNodes():
Метод для получения контейнера с узлами пользователей пользовательских терминалов.
GetUtUserNodes(NodeContainer uts):
Метод для получения контейнера узлов пользователей, подключенных к списку указанных пользовательских терминалов.
GetUtUserNodes(Ptr ut):
Метод для получения контейнера узлов пользователей, подключенных к конкретному пользовательскому терминалу.
GetUtNode(Ptr utUser):
Метод для получения узла пользовательского терминала, обслуживающего указанного пользователя.
GetNGwNodes():
Метод для получения количества узлов шлюзов.
GetNUtNodes():
Метод для получения количества узлов пользовательских терминалов.
GetNOrbiterNodes():
Метод для получения количества узлов спутников.
GetNGwUserNodes():
Метод для получения количества узлов пользователей шлюза.
GetNUtUserNodes():
Метод для получения количества узлов пользователей пользовательских терминалов.
GetGwNode(uint32_t nodeId):
Метод для получения узла шлюза по индексу в контейнере.
GetUtNode(uint32_t nodeId):
Метод для получения узла пользовательского терминала по индексу в контейнере.
GetOrbiterNode(uint32_t nodeId):
Метод для получения узла спутника по индексу в контейнере.
GetGwUserNode(uint32_t nodeId):
Метод для получения узла пользователя шлюза по индексу в контейнере.
GetUtUserNode(uint32_t nodeId):
Метод для получения узла пользователя пользовательского терминала по индексу в контейнере.
GetNodeFromId(uint32_t nodeId):
Метод для поиска узла по его глобальному идентификатору среди всех контейнеров (шлюзы, терминалы, спутники, пользователи).
AddGwLayersDvb(...):
Метод для хранения уровней протокола DVB (NetDevice, LLC, MAC, PHY) для шлюза. Принимает идентификаторы спутника и луча для шлюза и пользовательского терминала, а также указатели на соответствующие объекты уровней.
проверяет отсутствие дубликатов для заданной пары «спутник-луч»;
сохраняет указатели на сетевое устройство, LLC, MAC и PHY в структуру m_gwLayers.
AddGwLayersLora(...):
Метод для хранения уровней протокола LoRa для шлюза. Принимает параметры аналогично методу DVB, но с использованием специфичных для LoRa классов MAC.
проверяет уникальность идентификаторов спутника и луча;
сохраняет устройства, MAC-уровень Lorawan и физический уровень в структуру слоев шлюза.
UpdateGwSatAndBeam(Ptr gw, uint32_t satId, uint32_t beamId):
Метод для обновления идентификаторов спутника и луча, с которыми работает шлюз.
GetGwSatId(Ptr gw):
Метод для получения идентификатора спутника, с которым связан шлюз.
GetGwBeamId(Ptr gw):
Метод для получения идентификатора луча, с которым связан шлюз.
GetGwNetDevice(Ptr gw, uint32_t utSatId, uint32_t utBeamId):
Метод для получения указателя на сетевое устройство шлюза, обслуживающего заданный спутник и луч пользовательского терминала.
GetGwLlc(Ptr gw, uint32_t utSatId, uint32_t utBeamId):
Метод для получения указателя на уровень LLC шлюза для заданных спутника и луча.
GetDvbGwMac(Ptr gw, uint32_t utSatId, uint32_t utBeamId):
Метод для получения указателя на уровень MAC шлюза по стандарту DVB для заданных спутника и луча.
GetLoraGwMac(Ptr gw, uint32_t utSatId, uint32_t utBeamId):
Метод для получения указателя на уровень MAC шлюза по стандарту LoRa для заданных спутника и луча.
GetGwPhy(Ptr gw, uint32_t utSatId, uint32_t utBeamId):
Метод для получения указателя на физический уровень (PHY) шлюза для заданных спутника и луча.
AddUtLayersDvb(...):
Метод для хранения уровней протокола DVB для пользовательского терминала. Принимает идентификаторы спутника, луча и группы, а также указатели на уровни стека протоколов.
проверяет, что слои еще не были добавлены для этого узла;
сохраняет параметры и указатели в структуру m_utLayers.
AddUtLayersLora(...):
Метод для хранения уровней протокола LoRa для пользовательского терминала.
выполняет действия аналогично методу DVB, но для LoRa-стека;
сохраняет MAC-уровень LorawanEndDevice.
UpdateUtSatAndBeam(Ptr ut, uint32_t satId, uint32_t beamId):
Метод для обновления идентификаторов спутника и луча, в зоне обслуживания которых находится пользовательский терминал.
UpdateUtGroup(Ptr ut, uint32_t groupId):
Метод для обновления идентификатора группы для пользовательского терминала.
GetUtSatId(Ptr ut):
Метод для получения идентификатора спутника, обслуживающего пользовательский терминал.
GetUtBeamId(Ptr ut):
Метод для получения идентификатора луча, в котором находится пользовательский терминал.
GetUtGroupId(Ptr ut):
Метод для получения идентификатора группы пользовательского терминала.
GetUtNetDevice(Ptr ut):
Метод для получения указателя на сетевое устройство пользовательского терминала.
GetUtLlc(Ptr ut):
Метод для получения указателя на уровень LLC пользовательского терминала.
GetDvbUtMac(Ptr ut):
Метод для получения указателя на уровень MAC пользовательского терминала по стандарту DVB.
GetLoraUtMac(Ptr ut):
Метод для получения указателя на уровень MAC пользовательского терминала по стандарту LoRa.
GetUtPhy(Ptr ut):
Метод для получения указателя на физический уровень (PHY) пользовательского терминала.
AddOrbiterFeederLayers(...):
Метод для хранения уровней протокола фидерной линии спутника. Принимает идентификаторы спутника и луча пользовательского терминала, а также указатели на устройства и слои протоколов.
проверяет уникальность параметров;
сохраняет слои LLC, MAC и PHY фидерной линии в структуру m_orbiterLayers.
AddOrbiterUserLayersDvb(...):
Метод для хранения уровней протокола пользовательской линии спутника по стандарту DVB. Принимает идентификаторы спутника и луча, указатели на устройство и слои протоколов. Сохраняет слои LLC, MAC и PHY пользовательской линии в структуру слоев спутника.
AddOrbiterUserLayersLora(...):
Метод для хранения уровней протокола пользовательской линии спутника по стандарту LoRa. Сохраняет в структуру спутника специфичные для LoRa MAC-уровень и физический уровень.
GetOrbiterSatId(Ptr orbiter):
Метод для получения идентификатора спутника.
GetOrbiterNetDevice(Ptr orbiter):
Метод для получения указателя на сетевое устройство спутника.
GetOrbiterFeederLlc(Ptr orbiter, uint32_t utBeamId):
Метод для получения указателя на уровень LLC фидерной линии спутника для заданного луча.
GetOrbiterUserLlc(Ptr orbiter, uint32_t beamId):
Метод для получения указателя на уровень LLC пользовательской линии спутника для заданного луча.
GetOrbiterFeederMac(Ptr orbiter, uint32_t utBeamId):
Метод для получения указателя на уровень MAC фидерной линии спутника для заданного луча.
GetDvbOrbiterUserMac(Ptr orbiter, uint32_t beamId):
Метод для получения указателя на уровень MAC пользовательской линии спутника по стандарту DVB.
GetLoraOrbiterUserMac(Ptr orbiter, uint32_t beamId):
Метод для получения указателя на уровень MAC пользовательской линии спутника по стандарту LoRa.
GetOrbiterFeederPhy(Ptr orbiter, uint32_t utBeamId):
Метод для получения указателя на физический уровень фидерной линии спутника для заданного луча.
GetOrbiterUserPhy(Ptr orbiter, uint32_t beamId):
Метод для получения указателя на физический уровень пользовательской линии спутника для заданного луча.
PrintTopology(std::ostream& os):
Метод для вывода в консоль подробной информации о топологии сети в поток вывода.
выводит информацию о спутниках, их позициях, подключенных шлюзах и пользовательских терминалах, а также о межспутниковых линиях (ISL);
выводит список шлюзов с их позициями и идентификаторами спутников/лучей;
выводит список пользовательских терминалов с указанием обслуживающих их шлюзов;
выводит информацию о пользователях сети.
GetClosestSat(GeoCoordinate position):
Метод для поиска индекса спутника, ближайшего к заданным географическим координатам.
вычисляет расстояние от заданной точки до каждого спутника в топологии;
возвращает индекс спутника с минимальным расстоянием.
6.7 Класс SatFwdLinkScheduler
Класс SatFwdLinkScheduler отвечает за планирование и формирование BBфреймов (Base Band Frames) для прямой линии связи (от шлюза к пользовательским терминалам). Экземпляр данного класса создается для каждого MAC-адреса шлюза и управляет очередями пакетов, используя контейнер BBфреймов. Планировщик поддерживает адаптивное кодирование и модуляцию (ACM), выбирая наиболее подходящие схемы модуляции и кодирования (MODCOD) на основе оценок отношения несущая/шум (C/N0) для каждого пользовательского терминала. Для получения объектов планирования и уведомления о возможностях передачи (TX opportunities) используется взаимодействие с верхними уровнями. Оно осуществляется через механизм колбеков.
Описание полей
Нет публичных полей.
Описание атрибутов
Interval (TimeValue, по умолчанию: 20 ms):
временной интервал для периодического планирования.
BBFrameConf (PointerValue):
конфигурация BBфреймов, используемая данным планировщиком.
DummyFrameSendingEnabled (BooleanValue, по умолчанию: false):
флаг, определяющий, отправляются ли фиктивные кадры (Dummy Frames) для заполнения эфира.
AdditionalSortCriteria (EnumValue, по умолчанию: NO_SORT):
дополнительный критерий сортировки объектов планирования, полученных от LLC (отсутствие сортировки, по задержке буферизации, по нагрузке).
CnoEstimationMode (EnumValue, по умолчанию: LAST):
режим работы оценщика C/N0 (последнее значение, минимальное значение в окне, среднее значение в окне).
CnoEstimationWindow (TimeValue, по умолчанию: 5000 секунд):
временное окно для оценки отношения C/N0.
Методы класса
SatFwdLinkScheduler(Ptr conf, Mac48Address address, double carrierBandwidthInHz):
Основной конструктор класса. Принимает указатель на конфигурацию BBфреймов, MAC-адрес узла и полосу пропускания несущей (Если вы встретите термин «полоса пропускания несущей» в контексте спутниковой связи (например, в настройках модема или мануале к антенне), это абсолютно нормальное явление, означающее ширину спектра выделенного канала. Однако в официальной технической литературе, стандартах и при проектировании спутниковых сетей грамотнее и корректнее использовать термин «ширина полосы несущей») в герцах.
сохраняет переданные параметры конфигурации и адреса;
инициализирует атрибуты объекта через список конструкции;
создает объект для генерации случайных чисел.
GetNextFrame():
Виртуальный метод для получения следующего фрейма к передаче.
в базовом классе вызывает фатальную ошибку, так как должен быть переопределен в подклассах;
возвращает пару, состоящую из указателя на BBфрейм и его длительности;
если фрейм не сформирован, возвращает фиктивную длительность.
CnoInfoUpdated(Mac48Address utAddress, double cnoEstimate):
Метод, вызываемый при обновлении информации об отношении C/N0 для пользовательского терминала.
ищет оценщика C/N0 в контейнере по MAC-адресу терминала;
если оценщик не найден, создает новый экземпляр с заданным режимом оценки и добавляет его в контейнер;
добавляет новое значение оценки (выборку) в соответствующий оценщик.
SortSchedulingObjects(std::vector>& so):
Сортирует вектор объектов планирования согласно настроенному критерию.
если список не пуст и содержит более одного элемента, применяет сортировку;
использует функции сравнения CompareSoFlowId(), CompareSoPriorityHol() или CompareSoPriorityLoad() в зависимости от значения атрибута AdditionalSortCriteria;
критерии сортировки включают ID потока, задержку начала пакета ( HOL) или размер буфера.
SetSchedContextCallback(SatFwdLinkScheduler::SchedContextCallback cb):
Устанавливает коллбэк для получения контекстов планирования от верхнего уровня.
SetTxOpportunityCallback(SatFwdLinkScheduler::TxOpportunityCallback cb):
Устанавливает коллбэк для уведомления верхнего уровня о возможности передачи данных.
SetSendControlMsgCallback(SatFwdLinkScheduler::SendControlMsgCallback cb):
Устанавливает коллбэк для отправки управляющих сообщений.
SendControlMsg(Ptr message, const Address& dest):
Метод для отправки управляющего сообщения заданному адресату. Использует установленный коллбэк m_sendControlMsgCallback для передачи сообщения. Возвращает результат операции отправки.
GetDefaultFrameDuration():
Метод для получения длительности фрейма, используемого по умолчанию. Возвращает длительность BBфрейма для стандартной схемы MODCOD и нормального типа кадра из конфигурации.
CnoMatchWithFrame(double cno, Ptr frame):
Проверяет, соответствует ли оценка C/N0 заданному фрейму.
определяет наилучшую схему MODCOD для заданного значения C/N0 и типа фрейма;
сравнивает полученную схему с MODCOD самого фрейма;
возвращает true, если канал позволяет использовать фрейм с таким или более низким MODCOD.
GetSchedulingObjectCno(Ptr ob):
Получает оценку C/N0 для указанного объекта планирования. Ищет оценщика в контейнере по MAC-адресу, содержащемуся в объекте планирования. Возвращает оценку C/N0 или NAN (not a number), если данные недоступны.
CreateCnoEstimator():
Приватный метод-фабрика для создания оценщика C/N0. В зависимости от режима m_cnoEstimatorMode (LAST, MINIMUM, AVERAGE) создает экземпляр SatBasicCnoEstimator с заданным окном оценки.
DoDispose():
Приватный метод очистки ресурсов.
обнуляет коллбэки (m_schedContextCallback, m_txOpportunityCallback, m_sendControlMsgCallback);
очищает контейнер оценщиков C/N0.
Конфигурация планировщика обратного канала выполняется с помощью атрибутов классов SatBeamScheduler и SatFrameAllocator. Также на функциональность планировщика обратного канала (SatBeamScheduler) влияют конфигурации суперкадра, формы сигнала (waveform) и сервисов нижнего уровня. Смотрите главы, посвященные конфигурации структуры суперкадра, конфигурации формы сигнала и конфигурации LLS.
6.8 Класс SatBeamScheduler
Класс SatBeamScheduler реализует планировщик ресурсов для конкретного луча в спутниковой сети связи. Он по сути является планировщиком обратного канала, использующим кроме собственных атрибутов еще атрибуты класса SatFrameAllocator. На его функциональность влияют конфигурации суперкадра, формы сигнала (waveform) и сервисов нижнего уровня. Смотрите разделы, посвященные конфигурации структуры суперкадра, конфигурации формы сигнала и конфигурации LLS. Данный класс используется компонентом NCC (Network Control Center) для управления распределением пропускной способности, обработки запросов на ресурсы от пользовательских терминалов (UT), оценки отношения несущая/шум ( C/N0 ) и формирования расписания передачи ( TBTP — Time Burst Time Plan). Планировщик поддерживает протоколы динамического распределения ресурсов (DAMA), включая постоянную (CRA) и динамическую (RBDC, VBDC) скорость, а также управляет слотами произвольного доступа и обеспечивает корректную передачу контекста при переключении терминалов между лучами при выполнении хэндовера.
Описание полей
Нет публичных полей.
Описание атрибутов
CnoEstimationMode (Enum, по умолчанию: LastValueInWindow):
режим оценки отношения несущая/шум ( C/N0 ). Определяет алгоритм вычисления оценки (последнее значение, минимальное или среднее в окне).
CnoEstimationWindow (Time, по умолчанию: 1000 мс):
временное окно для оценки C/N0. Задает интервал времени, в течение которого собираются отсчеты для вычисления качества сигнала.
MaxTwoWayPropagationDelay (Time, по умолчанию: 560 мс):
максимальная двусторонняя задержка распространения сигнала между шлюзом и пользовательским терминалом. Учитывается при расчете времени старта планирования, чтобы TBTP был получен терминалом вовремя.
MaxTBTPTxAndProcessingDelay (Time, по умолчанию: 100 мс):
максимальная задержка передачи и обработки сообщения TBTP на шлюзе. Используется для компенсации времени формирования и отправки расписания.
ControlSlotsEnabled (Boolean, по умолчанию: false):
флаг, указывающий на включение генерации управляющих слотов. Если включен, планировщик выделяет слоты для передачи управляющей информации.
ControlSlotInterval (Time, по умолчанию: 1000 мс):
временной интервал генерации управляющих слотов для пользовательских терминалов. Определяет периодичность выделения ресурсов под сигнализацию.
HandoverStrategy (Enum, по умолчанию: Basic):
стратегия переключения между лучами. Определяет, как передаются запросы на емкость и информация о C/N0 при передаче терминала другому планировщику.
SuperFrameAllocatorType (Enum, по умолчанию: Default):
тип аллокатора суперфреймов. Задает конкретную реализацию механизма распределения ресурсов (слотов) внутри кадров.
Методы класса
Initialize(...):
основной метод инициализации планировщика. Принимает идентификаторы спутника и луча, указатели на сетевые устройства шлюза и спутника, колбэки для отправки управляющих сообщений, последовательность суперфреймов, максимальный размер кадра в байтах, а также адреса спутника и шлюза.
рассчитывает смещение счетчика суперфреймов на основе максимальных задержек распространения и обработки;
создает оценщика C/N0 для спутника;
настраивает генератор случайных чисел для распределения каналов произвольного доступа;
создает экземпляр аллокатора суперфреймов в соответствии с заданным типом;
планирует первый запуск метода Schedule() (основного цикла планирования).
AddUt(Address utId, Ptr llsConf):
добавляет пользовательский терминал в управление планировщика. Принимает адрес (MAC) терминала и конфигурацию служб нижнего уровня. Возвращает индекс выделенного канала произвольного доступа.
создает объекты DAMAзаписи и оценщик C/N0 для нового терминала;
вычисляет время первой генерации управляющего слота;
добавляет информацию о терминале во внутренние структуры;
проверяет и резервирует минимальную гарантируемую скорость (CRA) в аллокаторе ресурсов.
HasUt(Address utId):
проверяет, находится ли пользовательский терминал с указанным адресом под управлением данного планировщика. Возвращает true, если терминал найден, иначе false.
HasUt():
проверяет наличие хотя бы одного пользовательского терминала под управлением планировщика. Возвращает true, если список терминалов не пуст.
UpdateUtCno(Address utId, double cno):
обновляет оценку C/N0 для конкретного пользовательского терминала. Принимает адрес терминала и новое значение отношения несущая/шум.
UpdateSatelliteCno(Address satelliteMac, double cno):
обновляет оценку C/N0 для спутника. Принимает MAC-адрес спутника и значение C/N0, а также сохраняет адрес спутника для последующей отправки отчетов.
UtCrReceived(Address utId, Ptr crMsg):
обрабатывает входящее сообщение от пользовательского терминала с запросом на емкость (Capacity Request). Принимает адрес отправителя и указатель на сообщение CR, которое сохраняется в очереди для обработки на следующем цикле планирования.
Send(Ptr message):
отправляет управляющее сообщение широковещательно всем абонентам луча.
SendTo(Ptr message, Address utId):
отправляет управляющее сообщение конкретному пользовательскому терминалу по указанному адресу.
SendToSatellite(Ptr msg, Address satelliteMac):
отправляет управляющее сообщение на спутник (например, отчет о C/N0) через фидерную линию.
SetSendTbtpCallback(SendTbtpCallback cb):
устанавливает колбэк, который вызывается при отправке сформированного сообщения TBTP для уведомления верхних уровней системы.
CreateTimu():
создает и возвращает сообщение TIM unicast (SatTimuMessage), содержащее необходимую информацию (идентификаторы спутника и луча, адреса) для подключения терминала к данному лучу.
TransferUtToBeam(Address utId, Ptr destination):
передает управление пользовательским терминалом другому планировщику луча (выполняет хендовер). Принимает адрес терминала и указатель на планировщик целевого луча.
перемещает объект с информацией о терминале (SatUtInfo) в целевой планировщик;
освобождает зарезервированные минимальные ресурсы в текущем планировщике;
в зависимости от выбранной стратегии (Basic или CheckGateway) очищает или сохраняет накопленные сообщения CR.
ConnectUt(Mac48Address address):
уведомляет спутниковое сетевое устройство и MAC шлюза о подключении пользовательского терминала.
DisconnectUt(Mac48Address address):
уведомляет спутниковое сетевое устройство и MAC шлюза об отключении пользовательского терминала.
ConnectGw(Mac48Address address):
уведомляет спутниковое сетевое устройство о подключении шлюза к данному лучу.
DisconnectGw(Mac48Address address):
уведомляет спутниковое сетевое устройство об отключении шлюза от данного луча.
RemoveUt(Address utId):
удаляет пользовательский терминал из планировщика, освобождая все связанные ресурсы и информацию.
ReserveLogonChannel(uint32_t logonChannelId):
резервирует указанный канал произвольного доступа (RA) для использования в качестве канала входа в сеть (logon). Принимает идентификатор канала, который исключается из случайного распределения среди обычных терминалов.
6.9 Класс SatRequestManager
Класс SatRequestManager реализует логику формирования запросов на пропускную способность (Capacity Requests) на стороне пользовательского терминала (UT). Он периодически или по событию анализирует состояние очередей пакетов для различных классов услуг (RC), рассчитывает требуемые ресурсы на основе алгоритмов RBDC (Rate-Based Dynamic Capacity) и VBDC (Volume-Based Dynamic Capacity), и отправляет соответствующие управляющие сообщения на шлюз (NCC). Также класс отвечает за отправку отчетов об уровне несущая/шум (C/N0) и корректировку запросов с учетом уже выделенных ресурсов.
Описание полей
Нет публичных полей.
Описание атрибутов
EvaluationInterval (Time, по умолчанию: 0.1 с):
интервал времени, с которым менеджер периодически выполняет оценку состояния очередей и принимает решение о необходимости отправки запроса на ресурсы.
CnoReportInterval (Time, по умолчанию: 1.1 с):
интервал времени между отправками отчетов об отношении несущая/шум (C/N0) на шлюз, если в течение этого периода не было отправлено сообщение с запросом емкости.
RttEstimate (Time, по умолчанию: 560 мс):
оценка времени кругового обхода (RTT), используемая для отслеживания количества запросов RBDC, которые были отправлены, но на которые еще не получен ответ (прогноз находящихся в пути запросов).
OverEstimationFactor (Double, по умолчанию: 1.1):
коэффициент переоценки объема запрашиваемых ресурсов, применяемый для компенсации накладных расходов протоколов инкапсуляции (например, RLE) и заголовков FPDU (Frame Protocol Data Unit — это блок данных протокола кадра, который представляет собой физический кадр, передаваемый через спутниковый канал).
EnableOnDemandEvaluation (Boolean, по умолчанию: false):
флаг, разрешающий запуск механизма оценки ресурсов по требованию (при поступлении первого пакета в пустую очередь), а не только по таймеру.
GainValueK (Double, по умолчанию: 1.0):
коэффициент усиления K , используемый в формуле расчета RBDC для регулировки запроса скорости в зависимости от текущего размера очереди.
RbdcCapacityRequestAlgorithm (Enum, по умолчанию: Legacy):
выбор алгоритма для расчета запросов на динамическую скорость (в текущей реализации доступен только алгоритм Legacy).
VbdcCapacityRequestAlgorithm (Enum, по умолчанию: Legacy):
выбор алгоритма для расчета запросов на динамический объем (в текущей реализации доступен только алгоритм Legacy).
Методы класса
Initialize(Ptr llsConf, Time superFrameDuration):
метод инициализации менеджера запросов. Принимает конфигурацию служб нижнего уровня и длительность суперфрейма.
создает и очищает контейнеры для отслеживания ожидающих запросов RBDC и VBDC, а также выделенных ресурсов для каждого RC;
сохраняет конфигурацию и длительность суперфрейма;
планирует периодический вызов метода оценки через заданный интервал EvaluationInterval;
планирует периодическую отправку отчетов C/N0 через интервал CnoReportInterval.
AddQueueCallback(uint8_t rcIndex, SatRequestManager::QueueCallback cb):
регистрирует колбэк для получения статистики очереди конкретного класса услуг (RC). Принимает индекс RC и функцию обратного вызова, возвращающую структуру SatQueue::QueueStats_t.
SetCtrlMsgCallback(SatRequestManager::SendCtrlCallback cb):
устанавливает колбэк для отправки управляющих сообщений (CR, отчеты C/N0 ) на нижний уровень (MAC). В качестве аргумента ожидает функцию, принимающую указатель на сообщение и адрес назначения.
SetCtrlMsgTxPossibleCallback(SatRequestManager::CtrlMsgTxPossibleCallback cb):
устанавливает колбэк для проверки возможности передачи управляющего сообщения в текущий момент времени (например, наличие выделенного слота).
SetNodeInfo(Ptr nodeInfo):
сохраняет указатель на информацию об узле (MAC-адрес, ID), используемую при трассировке и формировании отчетов.
CnoUpdated(...):
метод обратного вызова для обновления значения C/N0. Принимает идентификаторы спутника и луча, MAC-адреса источника и шлюза, значение C/N0 и флаг, указывающий к какому сигналу оно относится: со спутника или от шлюза. Сохраняет полученное значение C/N0 в соответствующую переменную-член (m_lastCno или m_lastSatelliteCno).
ReceiveQueueEvent(SatQueue::QueueEvent_t event, uint8_t rcIndex):
обрабатывает события от очереди. Принимает тип события и индекс RC. Если событие FIRST_BUFFERED_PKT (первый пакет в очереди) и включен режим EnableOnDemandEvaluation, запускает немедленную оценку потребности в ресурсах.
DoPeriodicalEvaluation():
периодический метод, который вызывает DoEvaluation() и планирует свой собственный вызов на следующий интервал EvaluationInterval.
DoEvaluation():
основная логика оценки и отправки запросов.
проверяет возможность отправки управляющего сообщения через колбэк;
обновляет счетчики ожидающих запросов VBDC на основе фактически выделенных ресурсов (из TBTP);
вызывает CheckForVolumeBacklogPersistence() для проверки необходимости принудительного обновления AVBDC
2 AVBDC (Absolute Volume-Based Dynamic Capacity) механизм динамического запроса у центра управления сетью пропускной способности. Используется терминалами работающими по стандарту DVBRCS. ;
для каждого RC получает статистику очереди и вызывает соответствующие алгоритмы расчета (DoRbdc или DoVbdc);
формирует сообщение SatCrMessage с полученными элементами;
если сообщение не пустое, вызывает SendCapacityRequest();
сбрасывает счетчики выделенных ресурсов для следующего цикла.
DoRbdcLegacy(uint8_t rc, const SatQueue::QueueStats_t& stats):
реализует алгоритм расчета запроса RBDC (на основе скорости).
вычисляет входящую скорость с учетом коэффициента переоценки;
учитывает текущий размер очереди и коэффициент усиления K для запроса резерва;
вычитает скорость постоянного назначения (CRA), если она настроена;
ограничивает запрос максимальной скоростью сервиса;
квантует результат и обновляет счетчики ожидающих запросов.
DoVbdcLegacy(uint8_t rc, const SatQueue::QueueStats_t& stats, uint32_t& rcVbdcBytes):
реализует логику выбора типа запроса объема (VBDC или AVBDC).
если установлен флаг принудительного обновления AVBDC (по истечению срока жизни backlog), запрашивает абсолютный объем очереди через GetAvbdcBytes;
иначе проверяет наличие входящего объема (volumeIn): если ожидающих запросов нет, отправляет AVBDC (полный объем очереди), иначе отправляет VBDC (только новый входящий объем).
GetVbdcBytes(uint8_t rc, const SatQueue::QueueStats_t& stats):
рассчитывает значение для запроса VBDC (инкрементное).
берет объем входящих данных с учетом коэффициента переоценки;
вычитает объем, который мог быть предоставлен за счет CRA;
квантует значение и добавляет его к общему счетчику ожидающих байтов для данного RC.
GetAvbdcBytes(uint8_t rc, const SatQueue::QueueStats_t& stats):
рассчитывает значение для запроса AVBDC (абсолютное).
сбрасывает счетчики выделенных и ожидающих ресурсов для данного RC;
берет полный размер очереди с учетом переоценки;
вычитает CRA и квантует результат, устанавливая его как новый объем ожидающих запросов.
CheckForVolumeBacklogPersistence():
проверяет, истекло ли время сохранения backlog (задержанных данных) для ожидающих запросов VBDC. Если срок истек, а данные все еще нужны, устанавливает флаг m_forcedAvbdcUpdate для отправки полного обновления.
SendCapacityRequest(Ptr crMsg):
отправляет сформированное сообщение с запросом емкости на шлюз.
отменяет запланированную отправку отчета C/N0, так как оценка C/N0 будет прикреплена к этому сообщению;
добавляет последнюю оценку C/N0 к сообщению и отправляет его через колбэк m_ctrlCallback;
планирует таймер отчета C/N0.
SendCnoReport():
отправляет отдельный отчет C/N0 , если сообщение CR не отправлялось.
проверяет возможность передачи и наличие валидных значений C/N0 (для линии от шлюза и от спутника);
формирует и отправляет сообщение SatCnoReportMessage для каждого доступного значения;
планирует свой следующий вызов.
AssignedDaResources(uint8_t rcIndex, uint32_t bytes):
метод обратного вызова, вызываемый при получении TBTP, для информирования менеджера о том, сколько ресурсов было выделено терминалу. Добавляет полученные байты в счетчик m_assignedDaResourcesBytes.
SendHandoverRecommendation(uint32_t satId, uint32_t beamId):
формирует и отправляет сообщение с рекомендацией о переключении (handover) на указанные спутник и луч.
SendLogonMessage():
формирует и отправляет сообщение Logon для входа в сеть, если передача возможна.
SetHeaderOffsetVbdc(double headerOffsetVbcd):
устанавливает поправочный коэффициент для учета заголовков при расчете VBDC.
GetQuantizedRbdcValue(uint8_t index, uint16_t reqRbdcKbps):
приводит запрошенную скорость RBDC к дискретным значениям в соответствии с факторами масштабирования и требованиями стандарта.
GetQuantizedVbdcValue(uint8_t index, uint16_t reqVbdcBytes):
приводит запрошенный объем VBDC к дискретным значениям в соответствии с коэффициентами масштабирования.
6.10 Класс SatReturnLinkEncapsulator
Класс SatReturnLinkEncapsulator реализует протокол инкапсуляции обратной линии ( RLE, Return Link Encapsulation) в соответствии со спецификацией ETSI TS 103 179. Он отвечает за формирование пакетов данных на передающей стороне (пользовательский терминал), включая инкапсуляцию, фрагментацию и конкатенацию пакетов верхнего уровня, а также за прием и сборку (дефрагментацию) пакетов на принимающей стороне (шлюз). Экземпляры класса создаются для каждого потока данных (определяемого адресом и идентификатором RC) и управляют буферизацией данных для соответствия возможностям передачи (Tx opportunities), предоставляемым MACслоем.
Описание полей
Нет публичных полей.
Описание атрибутов
Данный класс не определяет собственных атрибутов, помимо унаследованных от базового класса (SatBaseEncapsulator).
Методы класса
SatReturnLinkEncapsulator(...):
конструктор класса. Принимает MAC-адрес инкапсулятора, MAC-адрес деинкапсулятора, E2E-адрес источника, E2E-адрес назначения, идентификатор потока (RC index) и размер дополнительного заголовка.
инициализирует базовый класс SatBaseEncapsulator переданными адресами;
создает временный объект заголовка PPDU
3 Physical Layer Protocol Data Unit протокольный блок данных физического уровня. Это блок данных, который формируется и передается на физическом уровне. Простыми словами, это формат кадра, в который упаковываются все служебные данные и полезная информация непосредственно перед их отправкой в эфир через спутниковый модем. для вычисления m_minTxOpportunity на основе максимального размера заголовка;
устанавливает начальные значения счетчиков фрагментов и состояния буферов приемника в ноль.
EnquePdu(Ptr p, Mac48Address dest):
помещает пакет верхнего уровня в очередь на передачу. Принимает указатель на пакет и MAC-адрес назначения.
проверяет, что размер пакета не превышает MAX_HL_PDU_PACKET_SIZE, в противном случае происходит фатальная ошибка;
присваивает пакету тег SatEncapPduStatusTag со статусом FULL_PDU, указывая, что он является целым и не фрагментированным;
добавляет к пакету MACтег с адресами источника и назначения для идентификации на нижних уровнях;
добавляет пакет в очередь передачи m_txQueue.
NotifyTxOpportunity(uint32_t bytes, uint32_t& bytesLeft, uint32_t& nextMinTxO):
метод, вызываемый MAC-слоем при наличии слота для передачи. Принимает размер доступного окна в байтах и ссылки на переменные для возврата количества оставшихся данных и минимального размера следующего окна.
если очередь передачи пуста, возвращает пустой указатель;
вызывает приватный метод GetNewRlePdu() для формирования пакета RLE в пределах заданных ограничений;
если пакет успешно сформирован, добавляет к нему MACтег, E2Eтег и тег идентификатора потока (Flow ID);
обновляет выходные параметры bytesLeft (текущий размер очереди) и nextMinTxO (минимальный требуемый размер для следующей отправки).
GetNewRlePdu(uint32_t txOpportunityBytes, uint32_t maxRlePduSize, uint32_t additionalHeaderSize):
приватный метод, выполняющий логику инкапсуляции, фрагментации и упаковки. Принимает размер окна передачи, максимальный размер PPDU и размер дополнительных заголовков.
просматривает первый пакет в очереди и определяет требуемый размер заголовка PPDU в зависимости от его статуса (FULL, START или CONTINUATION);
если доступного пространства txOpportunityBytes недостаточно даже для заголовка, возвращает пустой указатель;
Логика упаковки (Packing):
если пакет целиком помещается в доступное пространство, он извлекается из очереди, ему добавляется заголовок PPDU с индикаторами Start и/или End, и пакет возвращается для передачи.
Логика фрагментации (Fragmentation):
если пакет слишком велик для одного окна, он извлекается и разделяется;
для первого фрагмента пакета со статусом FULL_PDU статус меняется на START_PDU, заголовок заполняется полным размером пакета и текущим ID фрагмента, который инкрементируется;
создается фрагмент размером, равным доступному пространству, а оставшаяся часть пакета с измененным статусом (END_PDU или оставшимся FULL_PDU) возвращается в начало очереди;
для последующих фрагментов используется статус CONTINUATION_PDU;
возвращает сформированный фрагмент или упакованный пакет с прикрепленным заголовком PPDU.
ReceivePdu(Ptr p):
обрабатывает входящий пакет от нижних слоев. Принимает указатель на принятый пакет.
удаляет из пакета служебные теги (статус инкапсуляции, идентификатор потока);
проверяет наличие и корректность MACтега (адрес назначения должен совпадать с адресом деинкапсулятора);
передает пакет в приватный метод ProcessPdu() для выполнения процедур дефрагментации.
ProcessPdu(Ptr p):
приватный метод, реализующий автомат дефрагментации на основе заголовка PPDU. Принимает пакет после удаления служебных тегов.
удаляет и анализирует заголовок SatPPduHeader (индикаторы Start, End, Fragment ID, длина PPDU, общая длина);
обработка FULL_PPDU:
если установлены флаги Start и End, сбрасывает состояние сборки и немедленно передает пакет наверх через колбэк m_rxCallback;
обработка START_PPDU:
если установлен только флаг Start, сбрасывает предыдущее состояние сборки, сохраняет ID фрагмента, ожидаемый общий размер пакета и сохраняет первый фрагмент в буфере m_currRxPacketFragment;
обработка CONTINUATION_PPDU:
если флаги не установлены, проверяет совпадение ID фрагмента с ожидаемым и добавляет данные в конец буфера сборки;
обработка END_PPDU:
если установлен только флаг End, добавляет последние данные, проверяет соответствие собранного размера ожидаемому и, при успехе, передает собранный пакет наверх, затем вызывает метод Reset для очистки буферов.
IncreaseFragmentId():
приватный вспомогательный метод, который увеличивает значение счетчика m_txFragmentId на единицу. Если значение достигает MAX_FRAGMENT_ID, оно сбрасывается в ноль.
Reset():
приватный метод очистки состояния приемника. Обнуляет m_currRxFragmentId, m_currRxPacketSize, m_currRxPacketFragmentBytes и освобождает буфер m_currRxPacketFragment.
GetMinTxOpportunityInBytes():
возвращает значение m_minTxOpportunity, указывающее минимальный размер в байтах, который требуется MAC — слою для передачи любого пакета данным инкапсулятором.
6.11 Класс SatReturnLinkEncapsulatorArq
Класс SatReturnLinkEncapsulatorArq наследуется от описанного выше класса SatReturnLinkEncapsulator ( раздел 6.10) и расширяет его функционал, реализуя механизм ARQ (Automatic Repeat reQuest) для обеспечения надежной доставки данных. Он поддерживает алгоритм выборочной повторной передачи (Selective Repeat ARQ). На стороне передатчика (пользовательский терминал) класс управляет буферами отправленных пакетов и пакетов, ожидающих повторной передачи, а также контролирует таймеры и количество попыток повторной отправки. На стороне приемника (шлюз) он отвечает за упорядочивание входящих пакетов, отправку подтверждений (ACK) и обработку ситуаций, когда пакеты теряются или приходят не по порядку.
Описание полей
Нет публичных полей.
Описание атрибутов
MaxRtnArqSegmentSize (Uinteger, по умолчанию: 37):
максимальный размер сегмента ARQ в байтах. Ограничивает размер создаваемых RLE PDU при использовании ARQ.
MaxNoOfRetransmissions (Uinteger, по умолчанию: 2):
максимальное количество повторных передач для одного пакета. Если лимит превышен, пакет отбрасывается, а ресурсы освобождаются.
RetransmissionTimer (Time, по умолчанию: 0.6 с):
значение таймера повторной передачи. Определяет время ожидания подтверждения (ACK) перед тем, как пакет будет перемещен в буфер ретрансляции для повторной отправки.
WindowSize (Uinteger, по умолчанию: 10):
размер окна ARQ. Задает количество пакетов, которые могут быть отправлено одновременно (находиться в «полете») без получения подтверждения.
ArqHeaderSize (Uinteger, по умолчанию: 1):
размер заголовка ARQ в байтах. Учитывается как накладные расходы при формировании пакетов.
RxWaitingTime (Time, по умолчанию: 1.8 с):
время ожидания на стороне приемника (шлюз); если пакет с ожидаемым порядковым номером не поступает в течение этого времени, он считается потерянным, и приемник переходит к обработке следующих номеров.
Методы класса
NotifyTxOpportunity(uint32_t bytes, uint32_t& bytesLeft, uint32_t& nextMinTxO):
переопределенный метод обработки возможности передачи. Принимает доступное количество байтов, ссылки на переменные для возврата оставшихся байтов и минимального размера следующего окна.
приоритет отдается буферу ретрансляции: если там есть пакеты, они извлекаются и отправляются в первую очередь;
при ретрансляции счетчик попыток увеличивается, контекст пакета перемещается обратно в буфер отправленных и планируется таймер ретрансляции;
если буфер ретрансляции пуст, проверяется доступность порядкового номера;
создается новый RLE PDU(Protocol Data Unit) с помощью родительского класса;
к пакету добавляется заголовок ARQ с порядковым номером;
контекст пакета сохраняется в буфере отправленных (m_txedBuffer), запускается таймер ожидания ACK и обновляются статистические данные;
возвращает сформированный пакет или пустой указатель, если ресурсов или порядковых номеров недостаточно.
ReceiveAck(Ptr ack):
обрабатывает входящее подтверждение (ACK) от приемника. Принимает указатель на сообщение ACK. Извлекает порядковый номер из сообщения и вызывает приватный метод CleanUp() для удаления пакета из внутренних буферов и освобождения порядкового номера.
ArqReTxTimerExpired(uint8_t seqNo):
приватный метод, вызываемый при истечении таймера повторной передачи для конкретного порядкового номера.
проверяет счетчик ретрансляций в контексте пакета;
если количество попыток меньше максимально допустимого, перемещает контекст пакета из буфера отправленных (m_txedBuffer) в буфер ретрансляции (m_retxBuffer) для отправки при следующей возможности;
если лимит попыток исчерпан, вызывает метод CleanUp() для удаления пакета и освобождения ресурсов.
CleanUp(uint8_t sequenceNumber):
приватный метод для очистки ресурсов, связанных с конкретным порядковым номером.
освобождает порядковый номер в менеджере последовательностей (m_seqNo), делая его доступным для новых передач;
ищет и удаляет контекст пакета из буфера отправленных и из буфера ретрансляции, уменьшая соответствующие счетчики размеров буферов.
ReceivePdu(Ptr p):
переопределенный метод приема пакета данных. Принимает указатель на пакет от нижних уровней.
удаляет служебные теги (статус PDU, ID потока, MACтеги) и извлекает заголовок ARQ для получения порядкового номера;
немедленно отправляет ACK для полученного пакета, вызывая метод SendAck;
преобразует 8-битный порядковый номер из заголовка в 32-битное непрерывное пространство с помощью метода ConvertSeqNo;
если полученный номер меньше ожидаемого (m_nextExpectedSeqNo), пакет игнорируется как дубликат;
если пакет соответствует ожидаемому номеру или больше него, он добавляется в буфер переупорядочивания (m_reorderingBuffer);
при обнаружении пропусков в нумерации создаются пустые записи для пропущенных номеров с запущенными таймерами ожидания (RxWaitingTimer);
вызывает метод ReassembleAndReceive для попытки сборки и отправки упорядоченных данных наверх.
ConvertSeqNo(uint8_t seqNo):
приватный метод конвертации порядкового номера.
анализирует текущий ожидаемый номер (m_nextExpectedSeqNo) и полученный 8-битный номер;
чтобы корректно восстановить абсолютный 32-битный номер, основываясь на размере окна ARQ, определяет, относится ли полученный номер к текущему циклу счета, к следующему или к предыдущему.
ReassembleAndReceive():
приватный метод для последовательной обработки буфера переупорядочивания.
сканирует буфер, начиная с m_nextExpectedSeqNo;
пока пакет с ожидаемым номером присутствует в буфере и помечен как успешно принятый, отменяет его таймер ожидания, передает данные наверх через метод ProcessPdu() (унаследованный от базового класса), удаляет его из буфера и инкрементирует m_nextExpectedSeqNo;
процесс останавливается при обнаружении разрыва в последовательности (пакета, который еще не получен или не истек его таймер ожидания).
RxWaitingTimerExpired(uint32_t seqNo):
приватный метод, вызываемый при истечении времени ожидания для конкретного порядкового номера.
находит запись в буфере переупорядочивания и помечает пакет как «принятый» (с пустым указателем на данные), чтобы система могла пропустить этот отсутствующий номер и продолжить обработку последующих пакетов;
вызывает ReassembleAndReceive для продвижения окна приема.
SendAck(uint8_t seqNo):
приватный метод отправки подтверждения.
создает управляющее сообщение SatArqAckMessage с полученным порядковым номером и идентификатором потока;
отправляет это сообщение через колбэк управления m_ctrlCallback на адрес пользовательского терминала (источника данных), чтобы подтвердить успешный прием.
GetTxBufferSizeInBytes():
возвращает текущий объем данных, ожидающих передачи. Возвращает сумму байтов в очереди RLE (m_txQueue) и в буфере ретрансляции (m_retxBufferSize).
6.12 Класс SatChannel
Для моделирования спутниковых коммуникаций в модуле Satellite используется специализированный класс физического канала спутниковой связи. Он называется SatChannel (файл satellite-channel.h), в качестве базового он использует класс Channel из NS3. Канал отвечает за передачу пакетов от передатчика (класс SatPhyTx) к приемникам (класс SatPhyRx) с учетом физических характеристик канала. Один спутниковый канал отображается в частотный диапазон, что означает, что к одному и тому же каналу могут быть подключены несколько узлов (UT, GW, другие спутники) в роли приемников или передатчиков. Также к каналу могут быть привязаны несколько лучей (использующие тот же частотный диапазон). Это позволяет на стороне приемника рассчитывать помехи для каждого пакета. Приемник проверяет все входящие пакеты, предназначены ли они для приема или пакет вызывает помехи при определенной мощности приема.
Основные задачи класса SatChannel
передача пакетов набору приемников;
расчет задержки распространения пакета на основе модели задержки распространения;
расчет мощности сигнала принимаемого пакета на основе модели потерь в свободном пространстве и замираний (марковское/Лоо — модель замираний спутникового канала предложенная Ч.Лоо в работе «A statistical model for a land mobile satellite link» (1985) Она хорошо описывает ситуации, когда прямая видимость спутника есть, но она не идеальна — сигнал проходит сквозь «пятнистую» среду (как просветы в листве).);
обработка функции трассировки входных/выходных данных при замираниях.
Возможности и моделируемые эффекты
задержка распространения (propagation delay):
рассчитывается на основе динамического положения узлов на орбитах (имитируется классом SatMobilityModel) и скорости света. Например, для геостационарной орбиты задержка составит ∼250 мс;
модели потерь в канале (Channel Loss):
модель усиления/потерь (GainPattern):
учитывает диаграммы направленности антенн (лучевую структуру) спутников и терминалов;
модель распространения (PropagationModel):
моделирует атмосферные поглощения, тропосферные эффекты, затухание в дожде и т.д. В большинстве случаев использованы модели, рекомендованные ITU-R(Сектор радиосвязи международного союза электросвязи (МСЭ));
модель помех (InterferenceModel) имитирует интерференцию между сигналами, что имеет место в многолучевых и многочастотных спутниковых системах.
обработка помех:
канал хранит состояние текущих передач, что позволяет модели SatInterferenceModel точно рассчитывать соотношение сигнал/(помеха+шум) ( SINR) для каждого принимаемого пакета.
Описание полей
Нет публичных полей.
Описание атрибутов
EnableRxPowerOutputTrace (Boolean, по умолчанию: false):
включает вывод трассировки мощности принимаемого сигнала.
EnableFadingOutputTrace (Boolean, по умолчанию: false):
включает вывод трассировки значений замираний сигнала.
EnableExternalFadingInputTrace (Boolean, по умолчанию: false):
включает использование внешних входных данных для моделирования замираний.
RxPowerCalculationMode (Enum, по умолчанию: RxPowerCalculation):
определяет режим расчета мощности принимаемого сигнала: математический расчет, использование входной трассировки мощности или использование входной трассировки C/N0.
ForwardingMode (Enum, по умолчанию: AllBeams):
определяет логику пересылки пакетов: только целевому узлу, только приемникам в целевом луче или всем приемникам канала.
Описание методов
Методы можно разделить на 5 логических групп:
1. Управление жизненным циклом и конфигурацией
SatChannel() / ~SatChannel():
конструктор и деструктор. Инициализируют атрибуты по умолчанию (например, режим пересылки ONLY_DEST_BEAM) и очищают ресурсы.
GetTypeId(void):
регистрирует класс SatChannel в системе типов ns3 под именем «ns3::SatChannel«. Определяет атрибуты, доступные для настройки через сценарий симуляции:
EnableRxPowerOutputTrace:
включение трассировки выходной мощности.
EnableFadingOutputTrace:
включение трассировки замираний.
EnableExternalFadingInputTrace:
использование внешних файлов трассировок замираний.
RxPowerCalculationMode:
Режим расчета мощности (расчет, трассировка мощности, трассировка C/N0 (отношение несущая/шум)).
ForwardingMode:
режим пересылки пакетов.
DoDispose():
освобождает указатели на модели задержки и контейнер приемников перед уничтожением объекта.
SetChannelType() / GetChannelType():
устанавливает/возвращает тип канала (например, FORWARD_USER_CH, RETURN_FEEDER_CH), что определяет, как обрабатываются сигналы.
SetFrequencyId() / SetFrequencyConverter() / SetBandwidthConverter():
настраивают параметры частоты и полосы пропускания, используемые для расчетов.
SetPropagationDelayModel() / GetPropagationDelayModel():
устанавливает модель для расчета времени распространения сигнала.
SetFreeSpaceLoss() / GetFreeSpaceLoss():
устанавливает объект для расчета потерь в свободном пространстве.
2. Управление приемниками
AddRx(Ptr phyRx):
добавляет объект приемника (SatPhyRx) в список m_phyRxContainer. Это позволяет каналу знать, кому передавать сигналы.
RemoveRx(Ptr phyRx):
удаляет приемник из списка (используется, например, при хэндовере между лучами).
GetNDevices() / GetDevice():
возвращают количество подключенных устройств и указатель на устройство по индексу (требование базового класса Channel).
3. Передача и прием сигналов (Основная логика)
StartTx(Ptr txParams):
это метод, вызываемый передатчиком (SatPhyTx). Он определяет логику доставки пакетов приемникам в зависимости от режима пересылки (m_fwdMode):
ONLY_DEST_NODE:
пакет получает только целевой узел. Используется проверка MAC-адреса назначения.
ONLY_DEST_BEAM:
пакет получают все приемники в одном луче (Beam ID совпадает).
ALL_BEAMS:
пакет получают все приемники в канале. Этот режим необходим для моделирования межлучевых помех (co-channel interference). Для каждого подходящего приемника вызывается метод ScheduleRx().
ScheduleRx(Ptr txParams, Ptr receiver):
планирует событие приема. Вычисляет задержку распространения на основе координат передатчика и приемника. Создает копию параметров сигнала и планирует вызов StartRx в контексте узла-приемника через функцию Simulator::ScheduleWithContext().
StartRx(Ptr rxParams, Ptr phyRx):
Вызывается по истечении времени задержки. Выполняет подготовку параметров сигнала перед передачей их PHYуровню приемника:
определяет несущую частоту;
в зависимости от режима расчета мощности (m_rxPowerCalculationMode) вызывает соответствующий метод расчета;
передает управление приемнику phyRx->StartRx.
4. Расчет мощности и обработка трассировок
DoRxPowerCalculation(...):
Основной метод расчета мощности принятого сигнала. Формула включает:
мощность передатчика;
коэффициенты усиления антенн передатчика и приемника (зависят от позиции);
потери в свободном пространстве (m_freeSpaceLoss);
внутреннее замирание (марковские замирания);
внешнее замирание (погода/атмосфера).
результат записывается в rxParams->m_rxPower_W.
GetExternalFadingTrace(...):
Получает значение внешнего замирания из контейнера трассировок (SatFadingExternalInputTraceContainer). Использует ID узла и тип канала для поиска нужного значения. Учитывает модель мобильности узла.
DoRxPowerInputTrace(...):
Используется, если режим мощности задан как RX_PWR_INPUT_TRACE. Вместо расчета берет значение плотности мощности из внешнего контейнера трассировки и умножает на полосу пропускания канала.
DoRxCnoInputTrace(...):
Используется, если задан режим RX_CNO_INPUT_TRACE. Получает значение C/N0 (отношение несущая/шум) из трассировки. Рассчитывает мощность Prx , необходимую для получения на входе приемника заданного отношения C/N0 . Расчет выполняется по формуле: Prx = N B × C/N0 где N — мощность шума, B — полоса.
DoRxPowerOutputTrace(...):
сохраняет данные о принятой мощности (время, плотность мощности) в контейнер вывода для последующего анализа.
DoFadingOutputTrace(...):
сохраняет значение внутреннего (марковского) замирания в контейнер вывода.
5. Вспомогательные методы
GetSourceAddress(...):
необходим для правильной привязки трассировок и расчетов. Извлекает MACадрес источника из первого пакета пакетного бёрста, используя тег SatMacTag.
Архитектура и взаимодействие с другими компонентами
В листинге ниже показана схема по которой используется класс SatChannel при имитации реальных условий распространения радиосигнала.
[SatNetDevice] -> [SatPhyTx] --> [SatChannel(delay/losses/interference)] --> [SatPhyRx] -> [SatNetDevice]
Канал «знает» о всех подключенных к нему объектах SatPhyRx. При вызове метода SatPhyTx::StartTx() канал получает пакет, планирует его «доставку» каждому приемнику через планировщик событий NS-3 с учетом рассчитанной задержки. Перед доставкой, имитируемой вызовом метода SatPhyRx::StartRx(), применяются модели потерь, чтобы определить, будет ли пакет успешно принят, поврежден или потерян.
Роли которые может «играть» класс SatChannel
Роль обычно определяется сегментом системы связи, в котором используется канал:
Прямой канал ( Forward Channel): GW -> SAT -> UT;
Обратный канал ( Return Channel): UT -> SAT -> GW;
Канал межспутниковой связи ( Inter-Satellite Link, ISL): SAT <-> SAT.
Конфигурация и использование
Канал конфигурируется в сценарии через атрибуты и SatChannelConf. Параметры задаются через вспомогательные классы. Примерный псевдокод настройки показан ниже:
Ptr<SatChannel> channel = CreateObject<SatChannel>(); channel->SetAttribute(«PropagationModel», StringValue(«ns3::SatUmaPropagationLossModel»)); channel->SetAttribute(«DelayModel», StringValue(«ns3::SatConstantSpeedPropagationDelayModel»)); // Channel assignment to PHY-layers of transmitter and receivers phyTx->SetChannel(channel); phyRx->SetChannel(channel);
6.12.1 Конфигурирование бюджета канала
Конфигурация бюджета канала для спутникового модуля лучше всего изучить на примере бюджета канала, расположенном в директории /contrib/satellite/examples и реализованном в файле sat-link-budget-example.cc. Параметры (атрибуты), влияющие на бюджет канала, находятся в объектах PHY. Каждый тип объекта PHY имеет небольшие отличия от других объектов PHY, связанные с конфигурацией бюджета канала. В качестве входных данных пример считывает файл sat-link-budget-input-attributes.xml. В этом файле содержатся все необходимые атрибуты для бюджета канала со значениями по умолчанию (такими же, как установлены на уровне кода). Достаточно изменить нужные значения и выполнить повторный запуск, чтобы смоделировать их влияние на бюджет канала. Префиксы атрибутов имеют следующие значения:
SatGwPhy предназначены для PHY в шлюзе;
SatGeoFeederPhy — для PHY фидерного канала в геостационарном спутнике;
SatGeoUserPhy — для PHY пользовательского канала в геостационарном спутнике;
SatUtPhy — для PHY в терминале пользователя.
6.13 Класс SatOrbiterFeederPhy
Класс SatOrbiterFeederPhy моделирует физический уровень фидерной линии спутника. Он управляет передачей и приемом сигналов между спутником и шлюзом, поддерживая как прозрачный режим, так и режим регенерации сигнала на физическом уровне. В данном классе реализована логика обработки пакетов, поступающих от шлюза и предназначенных для ретрансляции, а также управление мощностью и очередью пакетов при регенерации.
Описание полей
Нет публичных полей.
Описание атрибутов
PhyRx (PointerValue):
объект уровня PhyRx, прикрепленный к этому физическому уровню.
PhyTx (PointerValue):
объект уровня PhyTx, прикрепленный к этому физическому уровню.
RxTemperatureDbk (double, по умолчанию: 28.4):
шумовая температура приемника на фидерной линии спутника в дБК.
RxMaxAntennaGainDb (double, по умолчанию: 54.00):
максимальный коэффициент усиления приемной антенны в дБ.
TxMaxAntennaGainDb (double, по умолчанию: 54.00):
максимальный коэффициент усиления передающей антенны в дБ.
TxMaxPowerDbw (double, по умолчанию: -4.38):
максимальная мощность передачи в дБВт.
TxOutputLossDb (double, по умолчанию: 1.75):
потери на выходе передатчика в дБ.
TxPointingLossDb (double, по умолчанию: 0.00):
потери из-за неточности наведения антенны (pointing loss) в дБ.
TxOboLossDb (double, по умолчанию: 4.00):
потери, связанные с выходным резервом (OBO) передатчика, в дБ.
TxAntennaLossDb (double, по умолчанию: 1.00):
потери передающей антенны в дБ.
RxAntennaLossDb (double, по умолчанию: 1.00):
потери приемной антенны в дБ.
DefaultFadingValue (double, по умолчанию: 1.00):
значение замирания сигнала по умолчанию.
ExtNoisePowerDensityDbwhz (double, по умолчанию: -207.0):
плотность мощности внешнего шума, характеризуемая отношением сигнал-интерференция ( C I ) в дБ.
ImIfCOverIDb (double, по умолчанию: 27.0):
интермодуляционная помеха от соседних каналов, характеризуемая отношением C I в дБ.
FixedAmplificationGainDb (double, по умолчанию: 82.0):
фиксированный коэффициент усиления усилителя, используемый в обратной линии на спутнике.
QueueSize (uint32_t, по умолчанию: 100000):
максимальный размер FIFO-очереди в байтах.
Описание методов
GetTypeId(void):
Статический метод для регистрации TypeId в системе NS-3.
регистрирует все атрибуты класса и его базовый класс;
настраивает доступ к методам получения и установки значений атрибутов;
добавляет источники трассировки для отслеживания размера очереди.
SatOrbiterFeederPhy(...):
Основной конструктор.
принимает ссылку на параметры создания params, указатель на результаты линии связи linkResults, структуру параметров несущей parameters и указатель на конфигурацию суперкадра superFrameConf;
из объекта топологии получает режимы регенерации для прямой и обратной линий;
если режим регенерации обратной линии — REGENERATION_PHY, инициализирует FIFO-очередь;
устанавливает атрибут TxMode в TRANSPARENT или NORMAL в зависимости от режима регенерации;
конфигурирует параметры несущих приемника, включая температуру шума, внешнюю плотность шума и фактор помех;
создает и настраивает носители приемника через базовый класс.
DoDispose(void):
Метод очистки объекта. Вызывает метод DoDispose родительского класса.
DoInitialize(void):
Метод инициализации объекта, вызывает метод DoInitialize родительского класса.
SendPduWithParams(Ptr txParams):
Отправляет PDU в модуль PHY TX.
устанавливает временные метки для пакетов, если режим регенерации отличается от прозрачного;
копирует указатель на phyTx отправителя в параметры сигнала;
в прозрачном режиме вычисляет мощность передачи как произведение принятой мощности на фиксированный коэффициент усиления;
в режиме REGENERATION_PHY проверяет наличие места в очереди, добавляет пакет в очередь и инициирует отправку, если передатчик свободен;
в других случаях вызывает StartTx для немедленной отправки.
SendFromQueue(void):
Приватный метод. Извлекает пакет из очереди и начинает его передачу.
проверяет, что очередь не пуста, в противном случае вызывается фатальная ошибка;
устанавливает флаг m_isSending в true;
извлекает первый элемент из очереди, обновляет текущий размер очереди в байтах и пакетах;
запускает трассировку состояния очереди;
планирует вызов метода EndTx после завершения передачи текущего пакета;
инициирует передачу через объект m_phyTx.
EndTx(void):
Приватный метод. Обработчик завершения передачи.
сбрасывает флаг m_isSending в false;
если очередь не пуста, вызывает метод SendFromQueue для отправки следующего пакета.
RxTraces(SatPhy::PacketContainer_t packets):
Вызывает источники трассировки для каждого полученного пакета.
перебирает (итерирует) пакеты в контейнере;
извлекает адрес назначения E2E из тега SatAddressE2ETag;
вычисляет задержку и джиттер на основе тега времени SatPhyLinkTimeTag и передает их в соответствующие трассировочные колбеки.
Receive(Ptr rxParams, bool phyError):
Принимает пакеты от нижнего уровня.
определяет событие (получение или сброс) на основе наличия физической ошибки;
добавляет запись в трассировку пакетов;
если ошибка присутствует, пакеты сбрасываются;
в режимах регенерации обновляет теги пакетов информацией о спутнике и луче;
вызывает метод RxTraces и трассировку модуляции/кодирования;
передает пакеты на вышестоящий уровень через колбек m_rxCallback.
GetAdditionalInterference(void):
Возвращает значение дополнительной интерференции, используется для учета межканальных помех при расчете SINR.
GetSatLinkTxDir(void):
Возвращает направление линии передачи — перечисление SatEnums::LD_RETURN, указывающее на обратную линию.
GetSatLinkRxDir(void):
Возвращает направление линии приема — перечисление SatEnums::LD_FORWARD, указывающее на прямую линию.
GetE2ESourceAddress(SatPhy::PacketContainer_t packets):
Извлекает исходный MAC-адрес из пакетов.
ищет тег SatAddressTag в пакетах;
возвращает адрес источника из найденного тега или пустой адрес Mac48Address, если тег не найден.
6.14 Класс SatHandoverModule
Класс SatHandoverModule предназначен для управления процессом хэндовера (передачи обслуживания) пользовательского терминала в спутниковой сети. Он отслеживает актуальность текущего соединения с лучом спутника и, при ухудшении параметров сигнала или выходе из зоны покрытия, определяет наилучшего кандидата для переключения (новый спутник и луч) на основе заданного алгоритма, после чего инициирует запрос на изменение точки подключения.
Описание полей
Нет публичных полей.
Описание атрибутов
Timeout (Time, по умолчанию: 1000 мс):
время ожидания перед отправкой новой рекомендации по хэндоверу, если предыдущая не была подтверждена (не получен сигнал TIM-U).
HandoverDecisionAlgorithm (Enum, по умолчанию: SAT_N_CLOSEST_SAT):
алгоритм, используемый для принятия решения о необходимости и цели хэндовера.
NumberClosestSats (Uinteger, по умолчанию: 1):
количество ближайших спутников, которое рассматривается алгоритмом SAT_N_CLOSEST_SAT при поиске наилучшего варианта для переключения.
AntennaGainTrace (TracedCallback):
источник трассировки для записи значений усиления антенны во время проверки соответствия текущего луча требованиям.
Описание методов
GetTypeId(void):
регистрирует атрибуты класса (Timeout, HandoverDecisionAlgorithm, NumberClosestSats) в системе NS-3. Возвращает уникальный идентификатор TypeId для данного класса.
SatHandoverModule(Ptr utNode, NodeContainer satellites, Ptr agpContainer):
основной конструктор класса, принимающий узел пользовательского терминала, контейнер со спутниками и контейнер шаблонов усиления антенны.
инициализирует алгоритм принятия решений по умолчанию и количество рассматриваемых спутников;
сбрасывает флаги состояния и таймеры.
SetHandoverRequestCallback(SatHandoverModule::HandoverRequestCallback cb):
устанавливает колбек, который будет использоваться для отправки сообщений с рекомендацией о хэндовере. Сохраняет переданный коллбэк в члене класса m_handoverCallback для последующего вызова.
CheckForHandoverRecommendation(uint32_t satId, uint32_t beamId):
метод по диаграммам усиления антенны оценивает, остается ли текущий луч (beamId) спутника (satId) действительным для текущей позиции пользовательского терминала, используются диаграммы усиления антенны.
если текущий луч недействителен или истекло время ожидания (m_repeatRequestTimeout), запускает алгоритм поиска наилучшего спутника и луча;
вызывает коллбэк m_handoverCallback с идентификаторами нового спутника и луча, если найден более подходящий вариант;
Возвращает true, если была отправлена рекомендация, иначе false.
GetAskedSatId():
возвращает идентификатор спутника, на который был отправлен последний запрос хэндовера.
GetAskedBeamId():
возвращает идентификатор луча, на который был отправлен последний запрос хэндовера.
HandoverFinished():
сбрасывает флаг m_hasPendingRequest в false, указывая на завершение процесса хэндовера и отсутствие ожидающих запросов.
GetNClosestSats(uint32_t numberOfSats):
Приватный метод, вычисляет расстояние от пользовательского терминала до каждого спутника в сцене. Сортирует спутники по возрастанию расстояния и возвращает вектор с идентификаторами указанного количества (numberOfSats) ближайших спутников.
AlgorithmNClosest(GeoCoordinate coords):
Приватный метод, реализует логику выбора лучшего луча среди N ближайших спутников для заданных географических координат. Для каждого из ближайших спутников находит луч с максимальным усилением сигнала. Возвращает пару идентификаторов (satId, beamId), соответствующих лучшему найденному варианту.
DoDispose():
метод обнуляет коллбэк хэндовера и указатель на контейнер шаблонов усиления антенны. Вызывает метод DoDispose родительского класса Object для корректной очистки ресурсов.
6.15 Класс SatGwMac
Класс SatGwMac реализует уровень управления доступом к среде (MAC) для шлюза в спутниковой сети. Этот класс наследуется от базового класса SatMac и специализируется на управлении передачей данных по прямой линии связи (Forward Link) от шлюза к пользовательским терминалам, а также на обработке входящих пакетов и управляющих сообщений по обратной линии. Класс отвечает за планирование BB-кадров, поддержку процедур регистрации (logon) и хэндовера, а также за обеспечение синхронизации времени посредством сообщений NCR и CMT.
Описание полей
Нет публичных полей.
Описание атрибутов
Scheduler (PointerValue):
указатель на объект планировщика прямой линии связи (SatFwdLinkScheduler), используемый этим MAC-уровнем шлюза.
GuardTime (TimeValue, по умолчанию: 1 мкс):
защитный интервал времени в кадрах прямой линии связи, который вычитается из общей длительности кадра для предотвращения наложения сигналов.
NcrBroadcastPeriod (TimeValue, по умолчанию: 100 мс):
интервал времени между двумя последовательными широковещательными передачами сообщений NCR (Network Clock Reference).
UseCmt (BooleanValue, по умолчанию: false):
флаг, указывающий, следует ли использовать сообщения CMT (Clock Measurement Message) для коррекции времени на пользовательских терминалах.
CmtPeriodMin (TimeValue, по умолчанию: 550 ms):
минимальный интервал времени между двумя сообщениями CMT, адресованными одному и тому же пользовательскому терминалу.
SendNcrBroadcast (BooleanValue, по умолчанию: true):
флаг, определяющий, следует ли транслировать сообщения NCR всем пользовательским терминалам.
DisableSchedulingIfNoDeviceConnected (BooleanValue, по умолчанию: false):
если установлено значение true, периодические вызовы метода передачи не выполняются, когда к этому MAC не подключено ни одного устройства.
BBFrameTxTrace (TracedCallback):
источник трассировки для передаваемых BB-кадров.
Описание методов
GetTypeId(void):
Статический метод для регистрации TypeId в системе NS-3. Регистрирует все атрибуты класса и трассируемые источники. Возвращает уникальный идентификатор типа TypeId.
SatGwMac(...):
Основной конструктор класса.
принимает указатель на узел (Ptr), идентификатор спутника (satId), идентификатор луча (beamId), идентификатор спутника фидерной линии (feederSatId) и идентификатор луча фидерной линии (feederBeamId);
инициализирует внутренние переменные и параметры MAC-уровня шлюза.
DoDispose(void):
Метод очистки ресурсов.
обнуляет колбеки для получения пакетов, запросов емкости, хэндовера и других событий;
вызывает метод DoDispose родительского класса SatMac.
StartPeriodicTransmissions(void):
Запускает периодические передачи данных.
проверяет наличие подключенных устройств, если включен соответствующий режим;
инициирует процесс планирования и отправки кадров, вызывая метод StartTransmission;
запускает периодическую рассылку сообщений NCR, если включен режим широковещательной передачи.
Receive(...):
Обрабатывает получение пакетов от физического уровня.
принимает контейнер пакетов и параметры сигнала (Ptr);
анализирует теги пакетов для определения типа сообщения и адреса отправителя;
перенаправляет управляющие сообщения (запросы емкости, логон, хэндовер, CMT) в соответствующие обработчики;
передает пользовательские данные на верхний уровень через обратный вызов receive.
StartTransmission(uint32_t carrierId):
Начинает процесс передачи кадра.
проверяет необходимость хэндовера шлюза и выполняет переключение, если требуется;
получает следующий BB-кадр от планировщика прямой линии;
рассчитывает длительность передачи с учетом защитного времени;
отправляет пакет на физический уровень и планирует следующий вызов этого метода.
TbtpSent(Ptr tbtp):
Сохраняет информацию о переданном TBTP (Time Burst Time Plan).
принимает указатель на сообщение TBTP;
сохраняет сообщение во внутреннем контейнере, индексированном счетчиком суперфреймов;
устанавливает таймер для удаления устаревших сообщений TBTP через 10 секунд.
GetFeederSatId(void):
Возвращает идентификатор спутника фидерной линии. Используется для определения того, к какому спутнику подключен шлюз по фидерной линии. Возвращает целочисленное значение идентификатора спутника.
GetFeederBeamId(void):
Возвращает идентификатор луча фидерной линии. Используется для определения конкретного луча на спутнике фидерной линии. Возвращает целочисленное значение идентификатора луча.
ReceiveSignalingPacket(...):
Обрабатывает полученные управляющие пакеты.
принимает пакет, идентификатор спутника и идентификатор луча;
в зависимости от типа сообщения (CR, CNO, ARQ ACK, Handover, Logon) выполняет соответствующие действия: обновляет информацию о C/N0 (отношение несущей к шуму), уведомляет о хэндовере или обрабатывает логон;
передает сообщения ARQ ACK на уровень LLC.
StartNcrTransmission(void):
Запускает процесс передачи сообщений NCR (Network Clock Reference).
вызывает метод SendNcrMessage для создания и отправки широковещательного сообщения NCR;
планирует следующий вызов этого метода через интервал времени, заданный атрибутом NcrBroadcastPeriod.
SendNcrMessage(void):
Отправляет сообщение NCR.
создает объект сообщения SatNcrMessage;
передает сообщение планировщику для широковещательной рассылки всем пользовательским терминалам.
SendCmtMessage(...):
Отправляет сообщение коррекции времени (CMT) конкретному пользовательскому терминалу.
принимает адрес терминала, длительность пакета, время приема на спутнике, идентификаторы спутника и луча;
находит наиболее подходящий слот в TBTP для вычисления поправки времени;
если поправка выходит за допустимые пределы, инициирует отключение (logoff) терминала, иначе отправляет сообщение CMT.
SendLogonResponse(...):
Отправляет ответ на сообщение логона.
принимает адрес пользовательского терминала и номер канала произвольного доступа;
создает сообщение SatLogonResponseMessage с указанием канала;
передает сообщение планировщику для отправки адресату.
SetCrReceiveCallback(...):
Устанавливает колбек для получения запросов на емкость (Capacity Request). Принимает объект типа Callback, который будет вызываться при получении CR-сообщения от пользовательского терминала.
SetHandoverCallback(...):
Устанавливает колбек для обработки хэндовера. Принимает объект типа Callback, уведомляющий верхние уровни о необходимости хэндовера пользовательского терминала.
SetLogonCallback(...):
Устанавливает колбек для обработки логона. Принимает объект типа Callback для обработки сообщений регистрации пользовательских терминалов и выбора канала произвольного доступа.
SetControlMessageReceivedCallback(...):
Устанавливает колбек для уведомления о получении управляющего пакета. Принимает объект типа Callback для информирования центра управления сетью (NCC) о факте приема управляющего пакета.
SetRemoveUtCallback(...):
Устанавливает колбек для удаления пользовательского терминала. Принимает объект типа Callback, который вызывается при необходимости принудительного отключения терминала (например, при сбое синхронизации).
SetClearQueuesCallback(...):
Устанавливает колбек для очистки очередей. Принимает объект типа Callback для очистки очередей уровня LLC при запуске или остановке передач.
SetBeamCallback(...):
Устанавливает колбек для изменения луча на физическом уровне. Принимает объект типа Callback для обновления конфигурации луча в PHY-уровне при хэндовере шлюза.
SetFwdScheduler(Ptr fwdScheduler):
Устанавливает планировщик прямой линии связи.
принимает указатель на объект планировщика SatFwdLinkScheduler;
если используется NCR версии 2, включает режим отправки фиктивных кадров в планировщике.
ChangeBeam(uint32_t satId, uint32_t beamId):
Метод для обработки изменения луча.
принимает новые идентификаторы спутника и луча;
в текущей реализации является заглушкой для будущей логики переключения.
ConnectUt(Mac48Address utAddress):
Подключает пользовательский терминал к шлюзу.
принимает MAC-адрес подключаемого терминала;
добавляет терминал в список пиров;
если это первое подключенное устройство и включен режим DisableSchedulingIfNoDeviceConnected, запускает периодические передачи.
DisconnectUt(Mac48Address utAddress):
Отключает пользовательский терминал от шлюза.
принимает MAC-адрес отключаемого терминала;
удаляет терминал из списка пиров;
если это было последнее подключенное устройство и включен соответствующий режим, останавливает периодические передачи.
StopPeriodicTransmissions(void):
Останавливает периодические передачи. Устанавливает флаг m_periodicTransmissionEnabled в значение false, что предотвращает дальнейшее планирование передач.
HasPeer(void):
Проверяет наличие подключенных пиров. Возвращает true, если список подключенных пользовательских терминалов не пуст, и false в противном случае.
6.16 Класс SatOrbiterMac
Класс SatOrbiterMac моделирует уровень управления доступом к среде (MAC) глобальной линии связи спутникового узла. Он отвечает за управление передачей BB-фреймов от спутника к земным станциям, используя планировщик для формирования трафика. Класс обеспечивает циклическую отправку кадров, управление защитными интервалами времени, взаимодействие с физическим уровнем через обратные вызовы, а также сбор статистики и трассировку передаваемых данных.
Описание полей
Нет публичных полей.
Описание атрибутов
DisableSchedulingIfNoDeviceConnected (Boolean, по умолчанию: false):
Если значение равно true, периодические вызовы метода StartTransmission не выполняются, когда к этому MAC не подключены устройства.
BBFrameTxTrace (TraceSource):
Трассировка для переданных BB-кадров.
Описание методов
GetTypeId():
статический метод системы NS-3 для регистрации TypeId класса.
добавляет атрибут DisableSchedulingIfNoDeviceConnected;
добавляет источник трассировки BBFrameTxTrace.
GetInstanceTypeId():
возвращает TypeId экземпляра объекта.
SatOrbiterMac(uint32_t satId, uint32_t beamId):
параметризованный конструктор класса.
вызывает конструктор базового класса SatMac с идентификаторами спутника и луча;
инициализирует защитное время значением 1 мкс;
устанавливает начальные значения флагов.
~SatOrbiterMac():
деструктор класса.
DoDispose():
метод завершения жизненного цикла объекта. Вызывает метод DoDispose родительского класса.
DoInitialize():
метод инициализации объекта. Вызывает метод DoInitialize родительского класса.
StartPeriodicTransmissions():
запускает цикл периодической передачи BB-фреймов.
проверяет наличие подключенных устройств, если включен соответствующий режим;
очищает очереди пакетов в уровне LLC;
планирует первый вызов метода StartTransmission с нулевой задержкой.
StartTransmission(uint32_t carrierId):
приватный метод, выполняющий одну итерацию передачи кадра.
получает следующий BB-фрейм и его длительность от планировщика прямой линии;
уменьшает длительность передачи на значение защитного времени;
вызывает метод SendPacket для отправки полезной нагрузки кадра;
если передача активна, планирует свой следующий вызов через интервал времени, равный длительности кадра;
SendPacket(...):
отправляет пакет данных на физический уровень.
принимает аргументы: контейнер пакетов, идентификатор несущей, длительность передачи и структуру параметров передачи;
добавляет к пакетам тег времени для вычисления задержки на приемной стороне;
формирует параметры сигнала в структуре SatSignalParameters;
вызывает коллбэк m_txCallback для передачи данных вниз по стеку протоколов;
RxTraces(SatPhy::PacketContainer_t packets):
обрабатывает трассировку для принятых пакетов.
перебирает контейнер принятых пакетов;
проверяет MAC-теги и адрес назначения;
если пакет предназначен текущему узлу, вычисляет задержку и джиттер ссылки на основе временных тегов;
обновляет трассировки приемников.
SetFwdScheduler(Ptr fwdScheduler):
метод установки планировщика прямой линии связи. Cохраняет переданный указатель в атрибут m_fwdScheduler.
SetLlc(Ptr llc):
метод установки уровня LLC. Cохраняет переданный указатель в атрибут m_llc.
GetGuardTime():
геттер для получения значения защитного интервала времени. Возвращает значение атрибута m_guardTime.
SetGuardTime(Time guardTime):
сеттер для установки значения защитного интервала времени. Устанавливает новое значение атрибута m_guardTime.
SetTransmitCallback(SatOrbiterMac::TransmitCallback cb):
метод установки коллбэка передачи. Сохраняет переданную функцию в атрибут m_txCallback.
SetReceiveNetDeviceCallback(SatOrbiterMac::ReceiveNetDeviceCallback cb):
метод установки коллбэка приема от сетевого устройства. Сохраняет переданную функцию в атрибут m_rxNetDeviceCallback.
StopPeriodicTransmissions():
останавливает процесс периодических передач.
устанавливает значение false атрибуту m_periodicTransmissionEnabled;
очищает очереди пакетов в уровне LLC.
На сегодня это всё. В следующей статье циткла мы рассмотрим классы управления атрибутами модуля Satellite.
Работа выполнена в рамках Программы создания и развития центра НТИ на базе МФТИ, Физтех по направлению («сквозной» технологии) Национальной технологической инициативы «Перспективные технологии для космических систем и сервисов» при реализации комплексного научно-исследовательского и опытно-конструкторского проекта "Разработка комплексной среды моделирования и проектирования гибридных инфокоммуникационных сетей наземного, стратосферного и космического сегментов с использованием параметрического и структурного синтеза".
