Open thread : Rx is always ON after communication is completed (Doesnt goes to sleep) - power consumption is high.

Using windows 10 OS, and SES v5.40.

I am using nRF52833 device in my project along with nRF5_SDK_for_Thread_and Zigbee_v4.1.0_32ce5f8 SDK.

I am using openthread protocol for radio communication and i also know that we can use the below function to know the radio state and also joiner state

otJoinerGetState(ot_instance) - Joiner state and otPlatRadioGetState(ot_instance) - Radio state.

But if i try to print the radio state : Observations

a. Before joining - the radio state is 1(radio sleep) - power consumption is around 15uA - expected to be that power consumption.

b. During joining - the radio state toggles between 1,2,3 (sleep, Rx and Tx) - power consumption is around 20mA - Expected this power consumption during pairing.

c. After joining - the radio state is 2(Rx) once pairing is completed, and it doesnt goes to sleep anymore - power consumption is around 11mA - Expected to be 15uA once the device is in sleep.

Questions :

1. I tried to put the radio to sleep manually once pairing is completed - Facing issues with communicating again once pairing is done. Also found that there is no requirement of manually switching sleep and receive states from this discussion - https://github.com/openthread/openthread/issues/1495 - Please suggest right way to handle this.

2. Also found the link mode configuration settings - otLinkModeConfig mode;
                                                                                 memset(&mode, 0, sizeof(mode));
                                                                                 mode.mRxOnWhenIdle = false;   

        We are making mode.mRxOnWhenIdle true during initialisation and again false during cyclic wakeup - is there anything wrong with this configuration setting.

Note : All i want to do is putting back the radio state to 1 (sleep) once it completes communication to reduce power to 15uA.

Parents
  • Hi

    It would be great if you are able to upload a sniffer log with decoded packets. In the debug log, it's a bit hard to follow when only the states are being printed. Showing where the application goes in if() sets should be helpful as well.

    Best regards,

    Simon

  • Hi

    I tried to print the data to extract the master key, 

    #ifdef DEBUG
    ConsolePrint("Thread version : %s\n", (uint32_t)otGetVersionString());
    ConsolePrint("Network name : %s\n", (uint32_t)otThreadGetNetworkName(COMWIRELESS_ot_instance));
    ConsolePrint("Channel : %d\n", otLinkGetChannel(COMWIRELESS_ot_instance));
    ConsolePrint("PAN ID : 0x%04x\n", otLinkGetPanId(COMWIRELESS_ot_instance));
    #endif
    const otExtAddress *pExtAddress = otLinkGetExtendedAddress(COMWIRELESS_ot_instance);
    #ifdef DEBUG
    ConsolePrint("ExtendedAddress: ");
    for (uint8_t u8Counter = 0; u8Counter < OT_EXT_ADDRESS_SIZE; u8Counter++)
    {
    ConsolePrint("%02x ", pExtAddress->m8[u8Counter]);
    }
    ConsolePrint("\n");
    #endif
    const otMasterKey *pMasterKey = otThreadGetMasterKey(COMWIRELESS_ot_instance);
    #ifdef DEBUG
    ConsolePrint("MasterKey : ");
    for (uint8_t u8Counter = 0; u8Counter < OT_MASTER_KEY_SIZE; u8Counter++)
    {
    ConsolePrint("%02x ", pMasterKey->m8[u8Counter]);
    }
    ConsolePrint("\n");
    #endif

    And i get this as the master key.. and the same key i am using in wireshark to decode it.. 


    OT_DEVICE_ROLE_CHILD
    Thread version : OPENTHREAD/20191113-00534-gc6a258e3; NRF52833; Apr 5 2020 21:43:42
    Network name : RDS110R_Thread
    Channel : 12
    PAN ID : 0x6329
    ExtendedAddress: 72 15 1f 60 49 d0 69 be
    MasterKey : ea 88 12 96 01 83 2e bc 05 dc 06 b6 8f e3 94 20

    I guess you can add the same decryption key in your preferences -> IEEE 802.15.4 -> Decryption keys so that you can see the decoded data

Reply
  • Hi

    I tried to print the data to extract the master key, 

    #ifdef DEBUG
    ConsolePrint("Thread version : %s\n", (uint32_t)otGetVersionString());
    ConsolePrint("Network name : %s\n", (uint32_t)otThreadGetNetworkName(COMWIRELESS_ot_instance));
    ConsolePrint("Channel : %d\n", otLinkGetChannel(COMWIRELESS_ot_instance));
    ConsolePrint("PAN ID : 0x%04x\n", otLinkGetPanId(COMWIRELESS_ot_instance));
    #endif
    const otExtAddress *pExtAddress = otLinkGetExtendedAddress(COMWIRELESS_ot_instance);
    #ifdef DEBUG
    ConsolePrint("ExtendedAddress: ");
    for (uint8_t u8Counter = 0; u8Counter < OT_EXT_ADDRESS_SIZE; u8Counter++)
    {
    ConsolePrint("%02x ", pExtAddress->m8[u8Counter]);
    }
    ConsolePrint("\n");
    #endif
    const otMasterKey *pMasterKey = otThreadGetMasterKey(COMWIRELESS_ot_instance);
    #ifdef DEBUG
    ConsolePrint("MasterKey : ");
    for (uint8_t u8Counter = 0; u8Counter < OT_MASTER_KEY_SIZE; u8Counter++)
    {
    ConsolePrint("%02x ", pMasterKey->m8[u8Counter]);
    }
    ConsolePrint("\n");
    #endif

    And i get this as the master key.. and the same key i am using in wireshark to decode it.. 


    OT_DEVICE_ROLE_CHILD
    Thread version : OPENTHREAD/20191113-00534-gc6a258e3; NRF52833; Apr 5 2020 21:43:42
    Network name : RDS110R_Thread
    Channel : 12
    PAN ID : 0x6329
    ExtendedAddress: 72 15 1f 60 49 d0 69 be
    MasterKey : ea 88 12 96 01 83 2e bc 05 dc 06 b6 8f e3 94 20

    I guess you can add the same decryption key in your preferences -> IEEE 802.15.4 -> Decryption keys so that you can see the decoded data

Children
No Data
Related