Стек BitCloud 1.12.0.
Устройства:
1 Координатор;
1 обычный роутер (Rout1);
1 Роутер с обратной связью (Rout2);
3 Конечных устройства.
Статическая адресация.
Потребовалось организовать двустороннюю связь ПК->координатор->роутер (Rout2)
и обратно. Наладить связь и передачу пакетов туда-сюда получилось.
Но возникли две ошибки.
Сеть работает, все хорошо, но если отключить одновременно все роутеры(2 шт.), а потом включить.
Координатор работает 20-40 сек и зависает, после переподключение координатора
роутеры подключаются нормально, а вот все конечные устройства находятся в ступоре (после зависания координатора), даже с оригинальной прошивкой (WSNDemo).
Думаю проблема в координаторе.
Код координатора:
Код
static uint8_t SIZE_DATA = 80;
BEGIN_PACK
typedef struct
{
uint8_t header[APS_ASDU_OFFSET];
uint8_t data[SIZE_DATA];
uint8_t footer[APS_AFFIX_LENGTH - APS_ASDU_OFFSET];
} PACK AppMessageBuffer_t;
PACK AppMessageBuffer_t appMessageBuffer;
Код
// Инициализация
case INITIAL_DEVICE_STATE:
switch (event)
{
case APP_PROCESS:
HAL_StopAppTimer(&deviceTimer);
deviceTimer.interval = APP_TIMER_SENDING_PERIOD;
deviceTimer.mode = TIMER_ONE_SHOT_MODE;
deviceTimer.callback = deviceTimerFired;
// Prefilling request parameters
messageParams.profileId = simpleDescriptor.AppProfileId;
messageParams.dstAddrMode = APS_SHORT_ADDRESS;
// Для теста адрес роутера установлен вручную
messageParams.dstAddress.shortAddress = 0x0012;
messageParams.dstEndpoint = 1;
messageParams.clusterId = CPU_TO_LE16(1);
messageParams.srcEndpoint = simpleDescriptor.endpoint;
//messageParams.srcEndpoint = WSNDEMO_ENDPOINT;
// Длина полезной нагрузки (Без смысла)
messageParams.asduLength = sizeof(appMessageBuffer.data);
// Полезная нагрузка
messageParams.asdu = (uint8_t*)(&appMessageBuffer.data[0]);
messageParams.txOptions.acknowledgedTransmission = 0;
#ifdef _APS_FRAGMENTATION_
messageParams.txOptions.fragmentationPermitted = 1;
#endif // _APS_FRAGMENTATION_
#ifdef _HIGH_SECURITY_
messageParams.txOptions.securityEnabledTransmission = 1;
#endif
messageParams.radius = 0x0;
messageParams.APS_DataConf = APS_DataConf;
appDeviceState = READING_SENSORS_STATE;
appPostSubTaskTask();
break;
default:
break;
}
Ошибка мне кажется здесь.
Координатор плюет данными без всяких проверок на наличее подключенных к нему устройств, а
также игнор appCoordinatorTaskHandler.
Код
// Данные пришедшие с компа обрабатываются здесь (1 раз в секунду)
void dataUSARTRecived (void *data, uint16_t dataLength)
{
// Тут парсер данных, отправка дальше после сбора пакета
.....
messageParams.asduLength = len;
// Отправка
APS_DataReq(&messageParams);
}