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

    

pizzamaker

Новичок
  • Публикаций

    2
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Посетители профиля

251 просмотр профиля
  1. Непонятки 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) {       ...   }   ... // и т.д. } В целом работает, но почти всегда одно и то же сообщение приходит несколько раз(пример на картинке), что вынуждает делать доп.проверки. Как быть? 2) Документация гласит, что родитель будет удерживать сообщение, предназначенное спящему ребенку, в течение EMBER_INDIRECT_TRANSMISSION_TIMEOUT мс, после чего сбросит его. У некоторых датчиков время LONG POLLING намного превышает это время. И что теперь, чтобы такой датчик получил emberLeaveRequest(...), надо его руками будить чтоли? Как правильно это делать? Неужели слать Alarm Message на кластер EMBER_UNICAST_ALARM_CLUSTER?
  2. NetBurner уже не закрытая контора, качайте их среду на рутракере https://rutracker.org/forum/viewtopic.php?t=5353140, покупайте модули и будет вам счастье