Как на CW10 работать с SNMP ? (или вообще с сетью)

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
SuperMax
Посетитель
Сообщения: 47
Зарегистрирован: 25 Август 2015, 3:22
Поблагодарили: 2 раза

Как на CW10 работать с SNMP ? (или вообще с сетью)

Сообщение SuperMax »

Начал делать SNMP.SET и .... понял что ничего не понимаю в виндовом API (собственно я все на чистом СИ и под никсы)
подскажите а то я в запутался в этой типизации

вот начал делать процедуру:

Код: Выделить всё

! Descr  - описание OIDa
! Oid    - сама строка OIDa
! Res - указатель на очередь куда складывать результат
! NewValue - новое значение параметра
! данная очередь имеет тип  SNMPResultQueueType
GetSNMPClass.Set PROCEDURE(LONG DescrID, SHORT Cnv, STRING Descr, STRING Oid, *SNMPResultQueueType Res, STRING NewValue, STRING ASNtypeNewValue)
VarTmp           &RFC1157VarBind
LocIdx  LONG
LocStr  CSTRING(201)
  CODE
  IF SELF.session = 0 THEN RETURN.
  SELF.DescrID = clip(DescrId)
  SELF.requestType = SNMP_PDU_SET
  SELF.Result &= Res
  SELF.Oid   = clip(Oid)
  SELF.Cnv   = Cnv
  SELF.NameOID = clip(Descr)

  ! форматируем OID из строки в OID ASN-формата
  IF SnmpMgrStrToOid(SELF.Oid, SELF.reqObject) = 0
    !SaveLog('snmp','SnmpMgrStrToOid Error: Invalid oid: ' & oid)
    RETURN
  END

  ! выделение памяти под структуру запроса
  SELF.variableBindings.len = 1
  SELF.variableBindings.list = SnmpUtilMemAlloc(size(RFC1157VarBind))
  IF SELF.variableBindings.list = 0
    !SaveLog('snmp','Error: Error allocating oid')
    RETURN
  END
  
    ! готовим структуру для копирования в структуру запроса
  VarTmp &= SELF.variableBindings.list+0
  VarTmp.name = SELF.reqObject
  
вот тут надо вставить вставку данных которые мы хотим передать в SNMP SET-е

VarTmp имеет тип VariableBindings

Код: Выделить всё

VariableBindings           GROUP(RFC1157VarBindList).

RFC1157VarBindList              GROUP(SnmpVarBindList),TYPE.
RFC1157VarBind                  GROUP(SnmpVarBind),TYPE.
они соответственно представлены

Код: Выделить всё

SnmpVarBindList          GROUP,TYPE
list                       LONG !GROUP(SnmpVarBind).
len                        ULONG
                         END

SnmpVarBind              GROUP,TYPE
name                       GROUP(AsnObjectName).
value                      GROUP(AsnObjectSyntax).
                         END
                         
AsnObjectName            GROUP(AsnObjectIdentifier),TYPE.
AsnObjectSyntax          GROUP(AsnAny),TYPE.
                         
AsnObjectIdentifier      GROUP,TYPE
idLength                   LONG
ids                        LONG
                         END
                                              
                                              
AsnAny                   GROUP,TYPE
asnType                    BYTE
                           BYTE
                           BYTE
                           BYTE
asnValue                   LONG,DIM(3)
Anynumber                  AsnInteger32,OVER(asnValue)
Anyunsigned32              AsnUnsigned32,OVER(asnValue)
Anycounter64               GROUP(AsnCounter64),OVER(asnValue).
Anystring                  GROUP(AsnOctetString),OVER(asnValue).
Anybits                    GROUP(AsnBits),OVER(asnValue).
Anyobject                  GROUP(AsnObjectIdentifier),OVER(asnValue).
Anysequence                GROUP(AsnSequence),OVER(asnValue).
Anyaddress                 GROUP(AsnIPAddress),OVER(asnValue).
Anycounter                 AsnCounter32,OVER(asnValue)
Anygauge                   AsnGauge32,OVER(asnValue)
Anyticks                   AsnTimeticks,OVER(asnValue)
Anyarbitrary               GROUP(AsnOpaque),OVER(asnValue).
                         END
                                                                                               
и что-то я в этой типизации запутался
те надо указать ASN тип значения и само значение
вопрос - как ?

далее идет этот код - передача и получение результата

Код: Выделить всё

  IF SnmpUtilOidCpy(SELF.rootOid, VarTmp.name ) = 0
    !SaveLog('SNMP','SnmpUtilOidCpy Error ' & GetLastError())
    RETURN
  END

  ! обмен
  LOOP
    IF SnmpMgrRequest(SELF.session, SELF.requestType, SELF.variableBindings, SELF.errorStatus, SELF.errorIndex) = 0
      !SaveLog('snmp','SnmpMgrRequest Error ' & GetLastError())
      BREAK
    END
    if (SELF.errorStatus > 0)
      !SaveLog('snmp','errorStatus ' & SELF.errorStatus)
      !SaveLog('snmp','errorIndex ' & SELF.errorIndex)
      BREAK
    END
    VarTmp &= SELF.variableBindings.list+0
    if (SnmpUtilOidNCmp(VarTmp.name, SELF.rootOid, SELF.rootOid.idLength )) <> 0
      !SaveLog('snmp','SnmpUtilOidNCmp Break')
      BREAK
    END
    SELF.GetVariableBindings
    BREAK
  END
  SnmpUtilMemFree(SELF.variableBindings.list)
  SnmpUtilOidFree(SELF.rootOid)
  RETURN
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Как на CW10 работать с SNMP ? (или вообще с сетью)

Сообщение Дед Пахом »

Ну ты, барин, задачки задаёшь! Кто ж в этой галиматье разбираться станет? Упрости вопрос.
С уважением, ДП
SuperMax
Посетитель
Сообщения: 47
Зарегистрирован: 25 Август 2015, 3:22
Поблагодарили: 2 раза

Как на CW10 работать с SNMP ? (или вообще с сетью)

Сообщение SuperMax »

Дед Пахом писал(а):Ну ты, барин, задачки задаёшь! Кто ж в этой галиматье разбираться станет? Упрости вопрос.
итоговый вопрос:
надо указать ASN тип значения и само значение
вопрос - как ?

искал примеры SNMP SET на Сях - не нашел
vd-vuf
Бывалый
Сообщения: 61
Зарегистрирован: 12 Декабрь 2008, 12:09
Откуда: Верхний Уфалей
Контактная информация:

Как на CW10 работать с SNMP ? (или вообще с сетью)

Сообщение vd-vuf »

давно было где брал аналоги исходников хз., но судя по тому что у меня осталось под руками (код на VB), надыбал видимо где то здесь
http://en.pudn.com/search_db.asp?keyword=SNMP
SuperMax
Посетитель
Сообщения: 47
Зарегистрирован: 25 Август 2015, 3:22
Поблагодарили: 2 раза

Как на CW10 работать с SNMP ? (или вообще с сетью)

Сообщение SuperMax »

vd-vuf писал(а):давно было где брал аналоги исходников хз., но судя по тому что у меня осталось под руками (код на VB), надыбал видимо где то здесь
http://en.pudn.com/search_db.asp?keyword=SNMP
Понял, спасибо.
Зарегистрировался, буду искать.
SuperMax
Посетитель
Сообщения: 47
Зарегистрирован: 25 Август 2015, 3:22
Поблагодарили: 2 раза

Как на CW10 работать с SNMP ? (или вообще с сетью)

Сообщение SuperMax »

да, если кому интересно
таки задачу я решил (в прошлом году отложил, на днях вернулся и все оказалось куда проще)

доработанная библиотека с SNMP.SET
snmp_max.rar
(13.39 КБ) 115 скачиваний
GET я тоже доработал под свои нужды
ну и всяких комментариев походу написал пока разбирался

SET поддерживает 4 формата
'OCTETSTRING' !формат - строка HEX байт в строке - те "0E:AB:CD:12:12" итд
'SIMPLESTRING' !формат - простая строка
'IPADDRESS' !формат - строка вида "121.123.141.195"
'INTEGER' !формат - число в строке

в принципе глядя на код можно сделать и другие форматы

если интересно - накидаю еще примеров применения

ps: если что-то срочное то меня лучше будить на email supermax()maxiol.com
SuperMax
Посетитель
Сообщения: 47
Зарегистрирован: 25 Август 2015, 3:22
Поблагодарили: 2 раза

Как на CW10 работать с SNMP ? (или вообще с сетью)

Сообщение SuperMax »

пара процедур сканирования сети

сканирование одного адреса

Код: Выделить всё

ScanSNMP    PROCEDURE(STRING IP,STRING MoterThread) 
! процедура простого сканирования ip адреса

MIBsysDescr             STRING('.1.3.6.1.2.1.1.1.0')
MIBsysUpTime            STRING('.1.3.6.1.2.1.1.3.0')
MIBsysContact           STRING('.1.3.6.1.2.1.1.4.0')
MIBsysName              STRING('.1.3.6.1.2.1.1.5.0')
MIBsysLocation          STRING('.1.3.6.1.2.1.1.6.0')

MIBcommonname           STRING('.1.3.6.1.4.1.41464.1.1.0')
MIBcommoncode           STRING('.1.3.6.1.4.1.41464.1.2.0')
MIBMAC                  STRING('.1.3.6.1.4.1.41464.7.30.0')

i                       BYTE
MACSTR                  STRING(20)
MACDIM                  BYTE,DIM(20),OVER(MACSTR)



ResultQueue_sysDescr        &SNMPResultQueueType  
ResultQueue_sysName         &SNMPResultQueueType  
ResultQueue_commoncode      &SNMPResultQueueType  
ResultQueue_MAC             &SNMPResultQueueType  

FlagReply               BYTE        !флаг обнаружения модуля =0  нет =1 есть SNMP ответ  =2 есть ответ модуля MAXIOL



SNMP                    GetSNMPClass ! Объявляем класс


    CODE
         
        FlagReply=0
        
        IF ERRORCODE() !Если не хватает памяти
            MESSAGE('Error') !высветить сообщение
        END

        SNMP.Init(IP,community)  ! Инициализация класса, подаем ему IP адрес и Community
                                        
        ResultQueue_sysDescr   &= NEW(SNMPResultQueueType);
        ResultQueue_sysName    &= NEW(SNMPResultQueueType);
        ResultQueue_commoncode &= NEW(SNMPResultQueueType);
        ResultQueue_MAC        &= NEW(SNMPResultQueueType);
        
        SNMP.Get(1,1,'sysName' , MIBsysName ,ResultQueue_sysName);                       
        SNMP.Get(1,1,'sysName' , MIBsysName ,ResultQueue_sysName);                       
                
        IF NOT (ResultQueue_sysName.Value &= NULL)  ! есть ответ ? проверяем дальше            
            FlagReply=1
            SNMP.Get(1,1,'sysDescr', MIBsysDescr,ResultQueue_sysDescr);            
            SNMP.Get(1,1,'MAXIOL::common-code', MIBcommoncode, ResultQueue_commoncode );                   
            SNMP.Get(1,1,'MAXIOL::management-mac-adr', MIBMAC, ResultQueue_MAC );                                            
            IF NOT (ResultQueue_commoncode.Value &= NULL)  ! это наш модуль ? - записываем
                DEV2:IP=ip;                
                DEV2:KOD=ResultQueue_commoncode.Value;  ! код модуля однозначно его идентифицирует
                DEV2:DNSNAME=ResultQueue_sysName.Value;
                DEV2:TYPE_COMPL_SCAN=1;
                DEV2:DATE_SCAN=today();
                DEV2:TIME_SCAN=clock();    
                DEV2:COMMUNITY=community;    ! сохраняем COMMUNITY для дальнейшей работы с модулем
                DEV2:MAC=ResultQueue_MAC.Value;
                IF ACCESS:NET_SCAN_DEV2.TRYFETCH(DEV2:PK_NET_SCAN_IP) ! проверим - а нет ли такой записи ?
                    ACCESS:NET_SCAN_DEV2.INSERT();                    ! если нет то добавим!
                END    
                FlagReply=2
            END
        END
        
        DISPOSE(ResultQueue_sysDescr)
        DISPOSE(ResultQueue_sysName)           
        DISPOSE(ResultQueue_commoncode)           
        DISPOSE(ResultQueue_MAC)           
        
        SNMP.Kill ! прощаемся с классом               
        NOTIFY (1, MoterThread, FlagReply)  ! информируем об окончании сканирования
        
основная процедура которая вызывает в потоке процессы сканирования

Код: Выделить всё

ScanSNMPSystems       PROCEDURE  

MIBsysDescr     STRING('.1.3.6.1.2.1.1.1.0')
MIBsysUpTime    STRING('.1.3.6.1.2.1.1.3.0')
MIBsysContact   STRING('.1.3.6.1.2.1.1.4.0')
MIBsysName      STRING('.1.3.6.1.2.1.1.5.0')
MIBsysLocation          STRING('.1.3.6.1.2.1.1.6.0')
MIBcommonname       STRING('.1.3.6.1.4.1.41464.1.1.0')
MIBcommoncode       STRING('.1.3.6.1.4.1.41464.1.2.0')

ResultQueue_sysDescr        &SNMPResultQueueType  
ResultQueue_sysName         &SNMPResultQueueType  
ResultQueue_commoncode      &SNMPResultQueueType  

ip                          STRING(32)
st                          short
StartedProc                 long
NCode                       long
NParam                      long
SelfThread                  long
CountReply                  long
CountReplyModul             long
CountScanIP                 long

SNMP                    GetSNMPClass ! Объявляем класс

Window                      WINDOW('Finding MAXIOL modules'),AT(,,298,143),MODAL,GRAY,AUTO, |
                                FONT('Microsoft Sans Serif',8,,FONT:regular),TIMER(5),RESIZE
                                BUTTON('&OK'),AT(133,119,32,14),USE(?OkButton),DISABLE,LEFT
                                PROGRESS,AT(12,25,274,23),USE(CountScanIP),RANGE(0,256)
                                PROMPT('All scaned IP''s'),AT(58,58),USE(?PROMPT1:22)
                                ENTRY(@N3),AT(157,59,,10),USE(CountScanIP,, ?CountScanIP:2),SKIP,DISABLE,TRN, |
                                    CENTER
                                ENTRY(@N3),AT(157,97,25,10),USE(CountReplyModul,, ?CountReply:2),SKIP,DISABLE,TRN, |
                                    CENTER
                                PROMPT('Found MAXIOL modules'),AT(58,98),USE(?PROMPT1:2)
                                PROMPT('Found other SNMP devises'),AT(58,79),USE(?PROMPT1)
                                ENTRY(@N3),AT(157,78,25,10),USE(CountReply),SKIP,DISABLE,TRN,CENTER
                            END

  CODE
  OPEN(Window)
  DISPLAY   
  StartedProc=0
  CountReplyModul=0
  CountReply=0
  CountScanIP=0      
       
  SelfThread =THREAD()  ! запомним текущий процесс

  ACCEPT
    CASE EVENT()
    OF EVENT:OpenWindow        
       DISPLAY         
        
    OF ?OkButton            
        BREAK
        
    OF EVENT:Timer   
        IF ip_start_4<255        
            ip=ip_start_1&'.'&ip_start_2&'.'&ip_start_3&'.'&ip_start_4;
            st=start(ScanSNMP,25000,ip,SelfThread)  ! стартуем процессы  передавая ip и номер материнского процесса 
            if st=0 
                MESSAGE('Not start process',':')     
            END    
            ip_start_4=ip_start_4+1;
            StartedProc+=1
        END        
        DISPLAY 
        
    OF EVENT:Notify     ! есть сообщение ?
        IF NOTIFICATION (NCode,, NParam)   ! есть сообщение от процесса ?
            CountScanIP+=1
            StartedProc-=1            
            CASE NParam                
                OF 1
                    CountReply+=1
                OF 2
                    CountReplyModul+=1
            END 
            IF CountScanIP>253
                ENABLE(?OkButton)
            END
            DISPLAY 
        END        
        
    END
  END

    
    ip_start_4=1    ! установим первоначальное значение
    CLOSE(Window)
        
    DISPLAY   
        


соответственно сетка /24 сканится за 30 секунд
Ответить