2015-06-26 7 views
2

Я выполнил отчет ZCL, чтобы реализовать функцию, которая может принимать данные, отправленные с датчика.Функция обратного вызова модуля zigbee несовместима с спецификацией ZCL

В SDk, она определяется следующим образом:

void ZbZclReportFunc{ 
    struct ZbZclClusterT * clusterPtr, 
    zbApsdeDataInt * dataIndPtr, 
    uint16_t attributeId, 
    const uint8_t * data 
} 

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

В спецификации ZCL кластер измерения температуры определяет «16-разрядное целое число« Измеренное значение ».

я распечатать данные, используя следующий формат:

printf("Degree: 0x%04x", *data); 

Как я ожидал, данные, приведенные в «0x002b» в качестве примера.

Отбрасывая его на 16-битное целое число, это не помогает.

printf("Degree: 0x%04x", (int16_t)*data); 

Любая идея?

Благодаря

ответ

2

Zigbee пакет данных мало Endian. Кроме того, единицы измерения MeasuredValue являются «сотыми градусами Цельсия». Поэтому, если ваше измеренное значение температуры было 26 градусов Цельсия, ваш буфер данных выглядел бы так: 28 0A. Для того, чтобы преобразовать в цельсию вы будете использовать:

double temperature = (double)((int16_t)(data[1] << 8) | (int16_t)data[0])/100.0;

+0

Спасибо. Использует ли влажность так же, как и для преобразования? – Sam