ПРОТОКОЛ ROOT-CR

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

РАЗБОР ПАКЕТА МИКРОКОМПЬЮТЕРОМ

/*Отражаем структуру на массив*/ 
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;
}