Протокол ROOT->CR

ROOT все приходящие пакеты выдает микрокомпьютеру по UART'у. Посылка состоит из адресса устройства в сети и самого пакета.

typedef struct {        
    uip_ip6addr_t addr;     /*Адрес модуля*/
    header_t header;        /*Header*/
    payload_t payload;      /*Payload, если он есть. Если в header.length > 0, то Payload есть. payload_t - здесь тип структуры котораы которую можно узнать из header.device_id и header.data_type*/
} pack root_to_cr_t;

Пример разбора

0xFD 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x12 0x4B 0x00 0x0C 0x46 0x8D 0x03  /*Адрес модуля от которого приняли пакет*/
0x01            /*Текущая версия протокола*/ 
0x7F            /*ID устройства*/
0x04            /*Тип пакета*/ 
0x88            /*RSSI*/ 
0x48            /*Температура*/ 
0x1A            /*Напряжение*/ 
0x62 0x01       /*Счетчик пакетов*/ 
0xA5 0x4A       /*CRC16*/ 
0x02            /*Размер payload'а*/
0x73 0xA6       /*Payload*/ 

Смотрим на ID устройства и тип пакета и видим что для payload'а структура:

/*Struct for PING*/
typedef struct {        
    u8_u16_t nonce;         /*Отправляем ROOT'у nonce. Если 3 раза не ответит, то перезагружаемся и переавторизируемся*/
} pack ping_t;

Разбор пакета микрокомпьютером

/*Отражаем структуру на массив*/ 
header_up_t *header_up_pack = (header_up_t*)&data[HEADER_OFFSET];

/*Проверяем версию протокола*/ 
if(header_up_pack->protocol_version == UDBP_PROTOCOL_VERSION)
{       
    /*Проверяем ID модуля*/ 
    /*UNWDS-6LOWPAN_SYSTEM*/
    if(header_up_pack->device_id == UNWDS_6LOWPAN_SYSTEM_MODULE_ID)
    {
        if(header_up_pack->data_type == JOIN_STAGE_1)
        {
            /*Обработчик 1 стадии авторизации*/         
            join_stage_1_handler((uip_ip6addr_t*)sender_addr, data, datalen);

            return;
        }

        else if(header_up_pack->data_type == JOIN_STAGE_3)
        {
            /*Обработчик 3 стадии авторизации*/
            join_stage_3_handler((uip_ip6addr_t*)sender_addr, data, datalen);

            return;
        }

        else if(header_up_pack->data_type == PING)
        {
            /*Ping*/
            ping_handler((uip_ip6addr_t*)sender_addr, (ping_t*)&data[PAYLOAD_OFFSET]);

            return;
        }

        else if(header_up_pack->data_type == ACK)
        {
            /*ACK*/
            ack_handler((uip_ip6addr_t*)sender_addr, (ack_t*)&data[PAYLOAD_OFFSET]);

            return;
        }

        else if(header_up_pack->data_type == NACK)
        {
            /*NACK*/
            nack_handler((uip_ip6addr_t*)sender_addr, (nack_t*)&data[PAYLOAD_OFFSET]);

            return;
        }

        else
        {   
            /*Вывод сообщения об неизвестной команде*/
            printf("[");
            uip_debug_ipaddr_print((uip_ip6addr_t*)sender_addr);
            printf("] Unknown command for system!\n");

            return;
        }
    }

    /*UMDK-4BTN*/
    if(header_up_pack->device_id == UNWDS_4BTN_MODULE_ID)
    {
        if(header_up_pack->data_type == BUTTON_STATUS)
        {
            /*Обработчик пакета с статусом нажатой кнопки*/
            button_status_handler((uip_ip6addr_t*)sender_addr, (button_status_t*)&data[PAYLOAD_OFFSET]);

            return;
        }

        else
        {   
            /*Вывод сообщения об неизвестной команде*/
            printf("[");
            uip_debug_ipaddr_print((uip_ip6addr_t*)sender_addr);
            printf("] Unknown command for UMDK-4BTN!\n");

            return;
        }
    }

    /*UMDK-LIT*/
    else if(header_up_pack->device_id == UNWDS_LIT_MODULE_ID)
    {
        if(header_up_pack->data_type == LIT_MEASURE_STATUS)
        {
            /*Обработчик пакета замера освещенности*/
            lit_measure_status_handler((uip_ip6addr_t*)sender_addr, (lit_measure_status_t*)&data[PAYLOAD_OFFSET]);

            return;
        }

        else
        {   
            /*Вывод сообщения об неизвестной команде*/
            printf("[");
            uip_debug_ipaddr_print((uip_ip6addr_t*)sender_addr);
            printf("] Unknown command for UMDK-LIT!\n");

            return;
        }
    }

    else
    {   
        /*Вывод сообщения о неизвестном модуле*/
        printf("[");
        uip_debug_ipaddr_print((uip_ip6addr_t*)sender_addr);
        printf("] Unknown module!\n");

        return;
    }
}

else 
{
    /*Вывод сообщения о неизвестном протоколе*/
    printf("[");
    uip_debug_ipaddr_print((uip_ip6addr_t*)sender_addr);
    printf("] Unknown protocol version!\n");

    return;
}