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

    

Непонятки zigbee стека EmberZNet

Участвую в проекте по разработке системы "умный дом". Используется стек EmberZNet 5.7.1. Имеется кастомная плата с линуксом, где работает самописная программа EZSP, взаимодействующая с модулем ETRX357 в конфигурации Host+NCP. EZSP сконфигурирована через AppBuilder в Simplicity Studio и собрана на линуксе. Плата выступает в роли координатора zigbee-сети.

 

Когда датчики pjoin-ятся в сеть и их родитель – это координатор, то запись/чтение атрибутов, отправка запросов Simple Descriptor, Power Descriptor, Node Descriptor и др. шлются без ошибок, т.е. со статусом 0x00. Когда датчики pjoin-ятся через роутер (например, умную розетку), то описанные запросы выдают в консоль ошибку 0x66 (не доставлено).

 

1) Как в EmberZNet правильно слать запросы детям роутера?

 

Я попробовал следующим образом:

void emberAfTrustCenterJoinCallback(EmberNodeId newNodeId,
                                    EmberEUI64 newNodeEui64,
                                    EmberNodeId parentOfNewNode,
                                    EmberDeviceUpdate status,
                                    EmberJoinDecision decision)
{
    ...

    if (decision == EMBER_USE_PRECONFIGURED_KEY || decision == EMBER_SEND_KEY_IN_THE_CLEAR) {
        ...
        if(parentOfNewNode == 0x0000 ) {
            emberSendZigDevRequestTarget(newNodeId, POWER_DESCRIPTOR_REQUEST, EMBER_AF_DEFAULT_APS_OPTIONS);
            emberSendZigDevRequestTarget(newNodeId, ACTIVE_ENDPOINTS_REQUEST, EMBER_AF_DEFAULT_APS_OPTIONS);
            ...
        } else {
            // здесь шлю запросы ребенку роутера через emAfCliServiceDiscoveryCallback
            emberAfFindIeeeAddress(newNodeId, emAfCliServiceDiscoveryCallback);
            emberAfFindClustersByDeviceAndEndpoint(newNodeId, 1, emAfCliServiceDiscoveryCallback);
            emberAfFindActiveEndpoints(newNodeId, emAfCliServiceDiscoveryCallback);
            ...
        }
    }

    ...
}


bool emberAfPreZDOMessageReceivedCallback(EmberNodeId sender,
                                          EmberApsFrame* apsFrame,
                                          uint8_t* message,
                                          uint16_t length)
{
    ...

  if (apsFrame->clusterId == ACTIVE_ENDPOINTS_RESPONSE) {
    printf ("\tEndpoint count: %x\n", message[4]);
    // send request to EP1 for getting full info about device
    emberSimpleDescriptorRequest(sender, 1, EMBER_AF_DEFAULT_APS_OPTIONS);
  }
  if (apsFrame->clusterId == POWER_DESCRIPTOR_RESPONSE) {
    ...
  }
  if (apsFrame->clusterId == IEEE_ADDRESS_RESPONSE) {
      ...
  }

  ... // и т.д.
}

В целом работает, но почти всегда одно и то же сообщение приходит несколько раз(пример на картинке), что вынуждает делать доп.проверки. Как быть?

 

2017-10-11_02-22-11.png

 

2) Документация гласит, что родитель будет удерживать сообщение, предназначенное спящему ребенку, в течение EMBER_INDIRECT_TRANSMISSION_TIMEOUT мс, после чего сбросит его. У некоторых датчиков время LONG POLLING намного превышает это время. И что теперь, чтобы такой датчик получил emberLeaveRequest(...), надо его руками будить чтоли? Как правильно это делать? Неужели слать Alarm Message на кластер EMBER_UNICAST_ALARM_CLUSTER?

 

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


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

Я не спец по стеку Ember, но знаю о ZigBee.

1. Почему не отправить напрямую по короткому адресу и дать стеку все сделать как нужно? Или эти запросы и не работают?

2. Никак. Если ED спит, то он спит и удалено его не разбудить. По спецификации родитель вообще должен хранить данные только 8 с небольшим секунд. Это известный тупняк в ZigBee и единственный вариант - это увеличивать EMBER_INDIRECT_TRANSMISSION_TIMEOUT.

 

Конкретно Leave, в зависимости от способа отправки (NWK Leave vs ZDO Leave) может быть обработан самим родителем, так что ребенок просто обломится при первом-же включении.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация