Skip to content

6 Development Guide

Mr-Method edited this page Aug 28, 2025 · 1 revision

Керівництво розробника вендорів для PON Monitor

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

Аналіз існуючих модулів

Перед створенням нового модуля рекомендується вивчити структуру існуючих:

Доступні модулі вендорів:

  • _Zte.pm - ZTE C220/C300/C320 (EPON/GPON)
  • _Zte_c6.pm - ZTE C600 (GPON/XG-PON)
  • _Bdcom.pm - BDCOM P33xx/GP36xx (EPON/GPON)
  • _Huawei_56.pm - Huawei MA56xx (GPON)
  • _Stels11.pm, _Stels12.pm, _Stels16.pm - STELS/C-Data
  • _Vsolution.pm - V-Solution V1600D8 (EPON)

Загальна архітектура модуля

Всі модулі мають однакову структуру:

# 1. Функція info() - повертає метадані
sub info {
    return {
        name => 'VendorName',
        pon_types => { 'epon' => 'EPON', 'gpon' => 'GPON' }
    };
}

# 2. Конструктор new()
sub new { ... }

# 3. Функція template() - SNMP OID схеми  
sub template { ... }

# 4. Головна функція main() - точка входу для моніторингу
sub main { ... }

# 5. Приватні функції парсингу (з "_")
sub _parse_serial { ... }
sub _parse_status { ... }

Приклад реальної структуры (ZTE)

package nod::Pon::Zte;
use strict;
use Debug;
use Net::Telnet::Cisco;

# Метадані модуля
sub info {
    return {
        name => 'ZTE C3xx',
        pon_types => {
            'epon' => 'EPON',
            'gpon' => 'GPON',
        },
    };
}

# SNMP OID шаблони
sub template {
    my $attr = shift;
    my %snmp = ();
    
    # EPON OID'и  
    $snmp{epon}{monitor} = {
        'ONU_SN'       => { OID => '.1.3.6.1.4.1.3902.1015.1010.1.1.1.1.1.4', parser => \&_epon_serial },
        ...
    };
    
    # GPON OID'и
    $snmp{gpon}{monitor} = {
        'ONU_SN'       => { OID => '.1.3.6.1.4.1.3902.1012.3.28.1.1.5',     parser => \&_gpon_serial },
        ...
    };
    
    return $attr->{TYPE} ? $snmp{$attr->{TYPE}} : \%snmp;
}

# Головна функція моніторингу
sub main {
    my $self = shift;
    my $step = shift;
    
    return $data unless $self->check_snmp();
    $data->{olt}       = $self->check_olt() if $self->{status} == 9;
    $data->{llid_name} = $self->check_llid();
    return $data unless $data->{llid_name};
    $data->{onu_list}  = $self->monitoring();
    $data->{fdb}       = $self->get_fdb() if ($self->{cfg}{telnet_fdb_force} || !($step%2));
    
    return $data;
}

Структура даних, що повертає main()

Функція main() кожного модуля вендора повертає стандартизовану структуру даних у вигляді Perl hashref:

my $data = {
    # Інформація про OLT (опціонально)
    olt => {
        name        => 'OLT-01',
        ip          => '192.168.1.100',
        model       => 'C300',
        firmware    => 'v2.1.0',
        uptime      => '123456',
        description => 'ZTE C300 Main OLT'
    },
    
    # Мапінг LLID до назв портів (обов'язково)
    llid_name => {
        '67174401' => '1/1/1',
        '67174402' => '1/1/2',
        '67174403' => '1/1/3',
        # ... інші порти
    },
    
    # Список ONU з деталями (основні дані)
    onu_list => {
        'ZTEG12345678' => {
            LLID          => '67174401',     # Внутрішній ID порту
            NAME          => '1/1/1',        # Назва порту (з llid_name)
            ONU_SN        => 'ZTEG12345678', # Серійний номер
            ONU_STATUS    => '1',            # Числовий статус
            ONU_RX_POWER  => '-23.45',       # RX потужність в dBm
            ONU_TX_POWER  => '2.34',         # TX потужність в dBm
        },
        'ZTEG87654321' => {
            # ... дані іншої ONU
        },
        # ... інші ONU
    },
    
    # FDB таблиця (опціонально, якщо підтримується)
    fdb => {
        '67174401' => {          # LLID порту
            '100' => {           # VLAN ID
                '00:11:22:33:44:55' => '1/1/1',  # MAC => назва порту
                '00:AA:BB:CC:DD:EE' => '1/1/1',
                # ... інші MAC адреси
            },
            '200' => {
                # ... інші VLAN
            }
        },
        # ... інші порти
    }
};

Мапінг статусів ONU

Кожен модуль має власну функцію парсингу статусів:

# Приклад для ZTE GPON
sub _gpon_status {
    my ($self, $status) = @_;
    my %status_map = (
        0 => 'logging',
        1 => 'LOS', 
        2 => 'Synchronization',
        3 => 'Online',
        4 => 'DyingGasp',
        5 => 'Power_Off',
        6 => 'Offline'
    );
    return $status_map{$status} || 'Unknown';
}

# Приклад для BDCOM
sub p_status {
    my ($self, $status) = @_;
    my %status_map = (
        1 => 'Online',
        2 => 'Offline', 
        3 => 'LOS'
    );
    return $status_map{$status} || 'Unknown';
}

Приклад мінімальної структури

Мінімально необхідна структура для роботи ядра:

my $minimal_data = {
    llid_name => {
        '1001' => '1/1/1',
        '1002' => '1/1/2'
    },
    onu_list => {
        'VENDOR12345678' => {
            LLID         => '1001',
            NAME         => '1/1/1',
            ONU_SN       => 'VENDOR12345678',
            ONU_STATUS   => 'Online',
            ONU_RX_POWER => '-25.5',
            ONU_TX_POWER => '3.2'
        }
    }
};