подскажите а то я в запутался в этой типизации
вот начал делать процедуру:
Код: Выделить всё
! 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
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