2015-09-24 2 views
2

Мой первый вопрос здесь;) Я застрял в попытке установить значение на устройстве с протоколом SNMP с помощью библиотеки SNMP ++ (http://www.agentpp.com/doc/snmp++3.x/index.html). Когда я проверяю значение с визуальным браузером MIB, он отображается как непрозрачный (на устройстве это, по сути, поплавок).SNMP: Невозможно создать/установить переменную, неправильное кодирование

Таким образом, текущее значение переменной равно 1.0 (которое представлено как Octed String как 9F 78 04 3F 80 00 00, не знаю, почему первые 4 гекса-пары являются такими, но 3F 80 00 00 точно 1.0 в floatish). Я модифицировал SNMPSET консольных пример немного, так что теперь, когда я хочу, чтобы установить значение, я делаю следующим образом:

(внутри determine_vb (...) функция)

case sNMP_SYNTAX_OPAQUE: 
{ 
    string str; 
    cout << "Opaque\n"; 
    cout << "Please enter new value: "; 
    cin >> str; 
    // float value_float = atof(str.c_str()); 
    const char * value_char = str.c_str(); 
    vb.set_value(value_char); 
    return true; 
} 

(здесь у вас есть полный .cpp файл) http://pastebin.com/8sLTyP8D

к сожалению, данные настройки для VB таким образом, кажется, не работает, так как установка параметров дает мне следующее сообщение об ошибке:

Set Status = SNMP: Cannot create/set variable, Wrong Encoding

Кто-нибудь из вас знает, как правильно закодировать float для SNMP-запроса, поэтому он будет принят?

С уважением! Filip

ответ

0

Для тех, кто ищет ответ, я наконец нашел решение и потребовал конверсии, строку для плавания и наоборот:

static const unsigned char * convertFloatToSnmpOpaqueFloat(float valueToBeConverted) { 

    // Reinterpret floating point value as 4-byte array of unsigned chars 
    const char * reinterpretedFloat = reinterpret_cast<const char *> (&valueToBeConverted); 

    // This prefix is used by SNMP to determine that we are using floating-point number. 
    // Check ASN1 standard for details. 9F78 = FLOATTYPE, 04 = length 
    std::string stringToBeReturned = ""; 
    stringToBeReturned += '\x9F'; 
    stringToBeReturned += '\x78'; 
    stringToBeReturned += '\x04'; 
    // We have to reverse the order of bytes to get it right 
    for (int i = sizeof (float) - 1; i >= 0; --i) { 
    //for (int i = 0; i < sizeof (float); ++i) { 
     stringToBeReturned = stringToBeReturned + reinterpretedFloat[i]; 
    } 
    const unsigned char * uCharToBeReturned = (const unsigned char *) stringToBeReturned.c_str(); 
    return (const unsigned char *) stringToBeReturned.c_str(); 
} 

static float convertSnmpOpaqueFloatToFloat(const std::string & valueToBeConverted) { 
    float floatToBeReturned; 
    unsigned char * reinterpretedFloat = reinterpret_cast<unsigned char *> (&floatToBeReturned); 
    int one, two, three, four; 
    std::sscanf(valueToBeConverted.c_str(), "%*X %*X %*X %X %X %X %X", &one, &two, &three, &four); 
    reinterpretedFloat[0] = four; 
    reinterpretedFloat[1] = three; 
    reinterpretedFloat[2] = two; 
    reinterpretedFloat[3] = one; 
    return floatToBeReturned; 
} 
0

SNMP не имеет типа данных с плавающей точкой, поэтому он обернут в непрозрачную кодировку (в качестве альтернативы он мог бы использовать целочисленный тип с DISPLAY-HINT для десятичного сдвига). Как он закодирован внутри того, что Opaque будет специфичным для определения OBJECT-TYPE. Это необходимо для понимания того, как значение float 1.0 кодируется как 9F 78 04 3F 80 00 00.

Смежные вопросы