NWK_OpenEndpoint() регистрирует обработчик принятых данных для Enpoint (число 0-15, 0 зарезервирован за стеком, 1-15 для приложений).
nwkRxSeriveDataInd() - это обработчик всех принятых кадров с dstEndpoint = 0 и все команды внутри стека отправляются так.
Как видно Ack - это тоже обычная команда.
nwkRxSeriveDataInd() - это обработчик всех принятых кадров с dstEndpoint = 0 и все команды внутри стека отправляются так.
Как видно Ack - это тоже обычная команда.
Спасибо большое! А то я голову ломал, не мог понять.
А в режиме широкополосной рассылки есть какие-то ограничения наподобии что первый пакет мы переслали, а другие пакеты с nwkSrc+nwkSeq отбрасываем?
Я смотрю что при приеме пакета void nwkRxTaskHandler(void)->nwkRxHandleReceivedFrame(frame)-> сначала идет функция
nwkRouteFrameReceived(frame) которая делает запись в таблицу маршрутизации в случае большего LQI, либо создает запись если ее нет, а дальше в
nwkRxHandleReceivedFrame(frame)-> идет функция nwkRxRejectDuplicate(header), но...эта функция работает только с nwkSeq, но ведь это значение инкрементируется только в случае когда координатор шлет другой пакет, промежуточные узлы на это значение не влияют.
Если это доступная для разглашения информация, то как работает алгоритм в nwkRxRejectDuplicate(header), в частности фрагмент кода
for (uint8_t i = 0; i < NWK_DUPLICATE_REJECTION_TABLE_SIZE; i++)
{
entry = &nwkRxDuplicateRejectionTable[i];
if (entry->ttl && header->nwkSrcAddr == entry->src)
{
uint8_t diff = (int8_t)entry->seq - header->nwkSeq;
if (diff < 8)
{
if (entry->mask & (1 << diff))
{
#ifdef NWK_ENABLE_ROUTING
if (nwkIb.addr == header->macDstAddr)
nwkRouteRemove(header->nwkDstAddr, header->nwkFcf.multicast);
#endif
return true;
}
entry->mask |= (1 << diff);
return false;
}
else
{
uint8_t shift = -(int8_t)diff;
entry->seq = header->nwkSeq;
entry->mask = (entry->mask << shift) | 1;
entry->ttl = DUPLICATE_REJECTION_TTL;
return false;
}
}
if (0 == entry->ttl)
freeEntry = entry;
}
if (NULL == freeEntry)
return true;
freeEntry->src = header->nwkSrcAddr;
freeEntry->seq = header->nwkSeq;
freeEntry->mask = 1;
freeEntry->ttl = DUPLICATE_REJECTION_TTL;
SYS_TimerStart(&nwkRxDuplicateRejectionTimer);
Я понял что сначала когда первый раз принимается пакет, то записи в таблице nwkRxDuplicateRejectionTable еще нет и мы ее делаем там(src,seq,mask,ttl), плюс запускаем таймер, который раз в 100мс декрементирует значение ttl в записи таблицы. Тоесть запись действительна фактически на протяжении 1000мс.
Когда координатор шлет следующие пакеты то пока их количество меньше 8-и(относительно номера пакета зафиксированного в записи в таблице), то мы в функции не трогаем каждый первый пакет (+1,+2...+7) и зарезаем все остальные их ретрансляции через этот узел.
А зачем мы вычисляем разницу именно между номерами пакетов посланных координатором uint8_t diff = (int8_t)entry->seq - header->nwkSeq; ? Или я неправильно понял как работает этот фрагмент кода?