Перейти к содержанию
    

Протокол SNMP в LwIP.

Пытаюсь разобраться с работой SNMP в стеке LwIP. Нужно реализовать агент и посылать трапы.

Есть ли у кого-нибудь опыт реализации агента в LwIP?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сайте LwIP есть собрание примеров в файле contrib-1.4.1.zip. Там есть пример написания своего private_mib. Так же в дистрибутиве LwIP в папке doc есть файл snmp_agent.txt там кратенько описано как начать работать с SNMP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сайте LwIP есть собрание примеров в файле contrib-1.4.1.zip. Там есть пример написания своего private_mib. Так же в дистрибутиве LwIP в папке doc есть файл snmp_agent.txt там кратенько описано как начать работать с SNMP.

Спасибо за отклик. Недавно смотрел реализацию private_mib в версии contrib-1.4.0, собственно, мало что понял. Сейчас гляну 1.4.1, может там есть изменения.

Я написал простенький MIB файл в txt и переконвертировал его с помощью python скрипта в с-файл. Скрипт специально написан для LwIP и рекомендован пользователями. В полученном исходнике необходимо написать реализацию функции lwip_privmib_init(). С этим возникли проблемы.

Прикрепил файлы текстового MIB и полученного исходника (исходник в txt, с - загрузить не могу).

TestMIB.txt

private_mib.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня этой функции нет, она не реализована, вернее закоментирована. Я так понял в ней реализовывается какой нибудь предврительный код перед работой с Вашими MIB.

Я си файл без утилиты питоновской создавал (вернее правил, содавал коллега :rolleyes: так что основа у меня была).

А что, с полученными файлами проект не компилируется? Что то не работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня этой функции нет, она не реализована, вернее закоментирована. Я так понял в ней реализовывается какой нибудь предврительный код перед работой с Вашими MIB.

Я си файл без утилиты питоновской создавал (вернее правил, содавал коллега :rolleyes: так что основа у меня была).

А что, с полученными файлами проект не компилируется? Что то не работает?

 

Проект компилируется, но непонятно как подцепить мой объект из private_mib ко внутренностям snmp.

 

А как у вас проходит инициализация и работа самого snmp? В коротком описании сказано что необходимо вызывать функцию snmp_inc_sysuptime() каждые 10ms. Разве этого достаточно?

 

Извиняюсь за возможно глупые вопросы, но я пытаюсь разобраться.

 

Вы можете привести свой private_mib хотя бы частично?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, функцию snmp_inc_sysuptime() нужно вызывать в приложении каждые 10 мс. Кроме того должны быть разрешены как минимум 2 UDP соединения это настройка MEMP_NUM_UDP_PCB. Ну и в настройках SNMP должно быть включено само SNMP и использование private _mib. Но судя по тому, что проект у Вас компилируется это все включено.

 

Моя функция для инициализации SNMP:

// подготовка к работе SNMP ---------------------------------------------------
void SnmpPrepareForWork(void)
{
 struct ip_addr xIpAddr;
 struct snmp_obj_id SnmpObjId;


 // установка sysName
 snmp_set_sysname((u8_t*)Sysname, (u8_t*)&Sysname_len);
 // установка sysDescr
 snmp_set_sysdesr((u8_t*)Sysdescr, (u8_t*)&Sysdescr_len);
 // установка sysContact
 snmp_set_syscontact((u8_t*)Syscontact, (u8_t*)&Syscontact_len);
 // установка sysLocation
 snmp_set_syslocation((u8_t*)Syslocation, (u8_t*)&Syslocation_len);

 // задаем SNMP_SYSOBJID
 SnmpObjId.len = 9;
 SnmpObjId.id[0] = 1;
 SnmpObjId.id[1] = 3;
 SnmpObjId.id[2] = 6;
 SnmpObjId.id[3] = 1;
 SnmpObjId.id[4] = 4;
 SnmpObjId.id[5] = 1;
 SnmpObjId.id[6] = ENTERPRISE_ID;
 SnmpObjId.id[7] = 2;
 SnmpObjId.id[8] = 4;
 snmp_set_sysobjid(&SnmpObjId);

 // включение трапов
 if ((gSNMP_IPaddr1[0] & gSNMP_IPaddr1[1] & gSNMP_IPaddr1[2] & gSNMP_IPaddr1[3]) != 0xFF &&
     (gSNMP_IPaddr1[0] | gSNMP_IPaddr1[1] | gSNMP_IPaddr1[2] | gSNMP_IPaddr1[3]) != 0)
 {
   IP4_ADDR(&xIpAddr, gSNMP_IPaddr1[0], gSNMP_IPaddr1[1], gSNMP_IPaddr1[2], gSNMP_IPaddr1[3]);
   snmp_trap_dst_enable(0, 1);
   snmp_trap_dst_ip_set(0, &xIpAddr);
 }
 else
 {
   snmp_trap_dst_enable(0, 0);
 }
 if ((gSNMP_IPaddr2[0] & gSNMP_IPaddr2[1] & gSNMP_IPaddr2[2] & gSNMP_IPaddr2[3]) != 0xFF &&
     (gSNMP_IPaddr2[0] | gSNMP_IPaddr2[1] | gSNMP_IPaddr2[2] | gSNMP_IPaddr2[3]) != 0)
 {
   IP4_ADDR(&xIpAddr, gSNMP_IPaddr2[0], gSNMP_IPaddr2[1], gSNMP_IPaddr2[2], gSNMP_IPaddr2[3]);
   snmp_trap_dst_enable(1, 1);
   snmp_trap_dst_ip_set(1, &xIpAddr);
 }
 else
 {
   snmp_trap_dst_enable(1, 0);
 }
 if ((gSNMP_IPaddr3[0] & gSNMP_IPaddr3[1] & gSNMP_IPaddr3[2] & gSNMP_IPaddr3[3]) != 0xFF &&
     (gSNMP_IPaddr3[0] | gSNMP_IPaddr3[1] | gSNMP_IPaddr3[2] | gSNMP_IPaddr3[3]) != 0)
 {
   IP4_ADDR(&xIpAddr, gSNMP_IPaddr3[0], gSNMP_IPaddr3[1], gSNMP_IPaddr3[2], gSNMP_IPaddr3[3]);
   snmp_trap_dst_enable(2, 1);
   snmp_trap_dst_ip_set(2, &xIpAddr);
 }
 else
 {
   snmp_trap_dst_enable(2, 0);
 }

 // отправка трапа холодного старта
 snmp_coldstart_trap();
}

 

Cвой private_mib я бы частично мог привести, но мне его надо будет почистить так чтобы не вырезать лишнего. Но он довольно большой и в нем разбираться будет труднее чем в файле из примера.

 

У Вас сам прибор то в сети пингуется? Соединение UDP устанавливает? Какой программой Вы проверяете чтение или запись переменных?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я установил программу iReasoning MIB Browser, там возможна загрузка своего MIB, отправка GET SET запросов и прием трапов.

Поэтому и хотел оттолкнуться от текстового MIB, чтобы он был универсальным. Но чувствую придется вручную писать реализацию private_mib.c.

Сейчас разберусь с вашей инициализацией SNMP. Большое спасибо!

 

До чтения и установки переменных я пока не дошел. Тот сишник, что сгенерил мне скрипт мало походит на сишник из примера.

А в примере пока толком не разобрался. UDP работает.

Если будет возможность - скиньте private_mib - буду очень признателен. На чистку можете не тратить время, постараюсь разобраться.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прикрепил свой private_mib

 

Большое Вас спасибо за помощь, помогли разобраться.

К счастью проект почти закончен, а часть с snmp там давно и успешно работает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...