Просмотр исходного кода

optimize shell for set/get,add more info,ABP tested

forest-rain 5 лет назад
Родитель
Сommit
6d1ea393cd

+ 96 - 53
lorawan-ed-stack/Aps/Basic/lorawan-ed-aps.c

@@ -71,7 +71,7 @@ static lorawan_ed_device_id_info_t lorawan_ed_device_id =
    .NwkKey = LORAWAN_APP_KEY,
 #endif
 
-#ifdef LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP
+#if ( defined LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP ) || (defined LORAWAN_ED_STACK_USING_ACTIVATION_TYPE_ABP)
    .DevAddr = LORAWAN_DEVICE_ADDRESS,
    .AppSKey = LORAWAN_APP_S_KEY,
    .NwkSEncKey = LORAWAN_NWK_S_ENC_KEY,
@@ -442,7 +442,7 @@ static void MlmeIndication( MlmeIndication_t *MlmeIndication )
             }
             else
             {
-                LORAWAN_ED_DEBUG_LOG(LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "BEACON NOT RECEIVED\n\r");
+                LORAWAN_ED_DEBUG_LOG(LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "BEACON NOT RECEIVED\r\n");
             }
             break;
         }
@@ -492,7 +492,7 @@ uint8_t lorawan_ed_set_joineui(uint8_t *joineui)
 
     mibReq.Type = MIB_DEV_EUI;
     mibReq.Param.DevEui = joineui;
-    status = LoRaMacMibGetRequestConfirm( &mibReq );
+    status = LoRaMacMibSetRequestConfirm( &mibReq );
 
     if(status == LORAMAC_STATUS_OK )
     {
@@ -539,6 +539,35 @@ uint8_t* lorawan_ed_get_appkey(void)
 }
 
 
+
+/**
+ *  lorawan set devaddr
+ */
+uint8_t lorawan_ed_set_devaddr(uint8_t *devaddr)
+{
+    MibRequestConfirm_t mibReq;
+    LoRaMacStatus_t status;
+
+    lorawan_ed_device_id.DevAddr = devaddr[0] << 24 | devaddr[1] << 16 | devaddr[2] << 8 | devaddr[3];
+    mibReq.Type = MIB_DEV_ADDR;
+    mibReq.Param.DevAddr = lorawan_ed_device_id.DevAddr;
+    status = LoRaMacMibSetRequestConfirm( &mibReq );
+
+    if(status == LORAMAC_STATUS_OK )
+    {
+        return RT_EOK;
+    }
+    return RT_ERROR;
+}
+
+/**
+ *  lorawan get devaddr
+ */
+uint32_t lorawan_ed_get_devaddr(void)
+{
+    return lorawan_ed_device_id.DevAddr;
+}
+
 /**
  *  lorawan set appskey
  */
@@ -866,7 +895,7 @@ void lorawan_ed_stack_init(lorawan_ed_app_callback_t *callbacks)
     }
 #endif /* LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_OTAA */
 
-#ifdef LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP
+#if ( defined LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP ) || (defined LORAWAN_ED_STACK_USING_ACTIVATION_TYPE_ABP)
     if ( lorawan_ed_init_params.ActivationType == LORAWAN_ED_ACTIVATION_TYPE_ABP )
     {
 #ifdef LORAWAN_ED_STACK_MAC_PARAMETER_DEVADDR
@@ -913,8 +942,8 @@ void lorawan_ed_stack_init(lorawan_ed_app_callback_t *callbacks)
 #endif /* LORAWAN_ED_STACK_USING_LORAWAN_SPECIFICATION_V1_1_X */
 
         LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "Activation Type: ABP");
-        //LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,  "-DevEui= %02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n\r", HEX8(devEui));
-        LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "-DevAdd:  %08X\n\r", lorawan_ed_device_id.DevAddr);
+        //LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,  "-DevEui= %02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\r\n", HEX8(devEui));
+        LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "-DevAddr: %08X", lorawan_ed_device_id.DevAddr);
         LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "-AppSKey: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", HEX16(lorawan_ed_device_id.AppSKey));
         LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "-NwkSEncKey: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", HEX16(lorawan_ed_device_id.NwkSEncKey));
 #if LORAWAN_ED_STACK_USING_LORAWAN_SPECIFICATION_V1_1_X
@@ -930,6 +959,10 @@ void lorawan_ed_stack_init(lorawan_ed_app_callback_t *callbacks)
         mibReq.Param.DevAddr = lorawan_ed_device_id.DevAddr;
         LoRaMacMibSetRequestConfirm( &mibReq );
 
+        mibReq.Type = MIB_S_NWK_S_INT_KEY;
+        mibReq.Param.SNwkSIntKey = lorawan_ed_device_id.NwkSEncKey;
+        LoRaMacMibSetRequestConfirm( &mibReq );
+
         mibReq.Type = MIB_NWK_S_ENC_KEY;
         mibReq.Param.NwkSEncKey = lorawan_ed_device_id.NwkSEncKey;
         LoRaMacMibSetRequestConfirm( &mibReq );
@@ -992,6 +1025,7 @@ void lorawan_ed_stack_init(lorawan_ed_app_callback_t *callbacks)
     mibReq.Param.AdrEnable = lorawan_ed_init_params.AdrEnable;
     LoRaMacMibSetRequestConfirm( &mibReq );
     LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "ADR:              %s", mibReq.Param.AdrEnable?"Enable":"Disable"); 
+    LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "Datarate:         DR_%d", lorawan_ed_init_params.TxDatarate);
 
 #if defined( REGION_EU868 ) || defined( REGION_RU864 ) || defined( REGION_CN779 ) || defined( REGION_EU433 )
     LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
@@ -1008,7 +1042,7 @@ void lorawan_ed_stack_init(lorawan_ed_app_callback_t *callbacks)
     /*set Mac statein Idle*/
     LoRaMacStart( );
 
-#ifdef LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP
+#if ( defined LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP ) || (defined LORAWAN_ED_STACK_USING_ACTIVATION_TYPE_ABP)
     if ( lorawan_ed_init_params.ActivationType == LORAWAN_ED_ACTIVATION_TYPE_ABP )
     {
         lorawan_ed_app_callback->lorawan_ed_joined();
@@ -1020,65 +1054,74 @@ LoRaMacStatus_t lorawan_ed_start_join_network( void )
 {
     LoRaMacStatus_t status = LORAMAC_STATUS_OK;
 #ifdef LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_OTAA
-    static uint32_t join_request_trials_max_base = 0;
-    static uint32_t join_request_start_timestamp = 0;
-    static int8_t join_request_datarata = -1;
-    
-    MlmeReq_t mlmeReq;
-
-    /* first time using the user define datarate */
-    if(join_request_datarata == -1)
+    if ( lorawan_ed_init_params.ActivationType == LORAWAN_ED_ACTIVATION_TYPE_OTAA )
     {
-        join_request_datarata = lorawan_ed_init_params.TxDatarate;
-    }
+        static uint32_t join_request_trials_max_base = 0;
+        static uint32_t join_request_start_timestamp = 0;
+        static int8_t join_request_datarata = -1;
 
-    GetPhyParams_t getPhy;
-    PhyParam_t phyParam;
+        MlmeReq_t mlmeReq;
 
-    join_request_trials++;
-    if( ( join_request_trials - 1) % 2 )
-    {
-        /* every twice lower tx datarate */
-        getPhy.Attribute = PHY_NEXT_LOWER_TX_DR;
-        getPhy.Datarate = join_request_datarata;
-        phyParam = RegionGetPhyParam( LORAMAC_REGION_CN470S, &getPhy );
-        join_request_datarata = phyParam.Value;
-    }
+        /* first time using the user define datarate */
+        if(join_request_datarata == -1)
+        {
+            join_request_datarata = lorawan_ed_init_params.TxDatarate;
+        }
 
-    mlmeReq.Type = MLME_JOIN;
-    mlmeReq.Req.Join.Datarate = join_request_datarata;
-#ifdef LORAWAN_ED_STACK_CETIFICATE_TEST_ENABLE
-    JoinParameters = mlmeReq.Req.Join;
-#endif
+        GetPhyParams_t getPhy;
+        PhyParam_t phyParam;
 
-    if( join_request_start_timestamp == 0 )
-    {
-        join_request_start_timestamp = TimerGetCurrentTime();
-    }
+        join_request_trials++;
+        if( ( join_request_trials - 1) % 2 )
+        {
+            /* every twice lower tx datarate */
+            getPhy.Attribute = PHY_NEXT_LOWER_TX_DR;
+            getPhy.Datarate = join_request_datarata;
+            phyParam = RegionGetPhyParam( LORAMAC_REGION_CN470S, &getPhy );
+            join_request_datarata = phyParam.Value;
+        }
     
-    if( join_request_trials <= ( join_request_trials_max_base + join_request_trials_max ) )
-    {
-        LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"###### ===== Join-Request @ (%d / %d) with DR=%d ==== ######", join_request_trials, (join_request_trials_max_base + join_request_trials_max), mlmeReq.Req.Join.Datarate);
-        status = LoRaMacMlmeRequest( &mlmeReq );
-        LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"###### ===== Join-Request: %s ==== ######",loramac_status_strings[status] );
-        if( status == LORAMAC_STATUS_OK )
+        mlmeReq.Type = MLME_JOIN;
+        mlmeReq.Req.Join.Datarate = join_request_datarata;
+    #ifdef LORAWAN_ED_STACK_CETIFICATE_TEST_ENABLE
+        JoinParameters = mlmeReq.Req.Join;
+    #endif
+    
+        if( join_request_start_timestamp == 0 )
         {
-            LORAWAN_ED_DEBUG_LOG(LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"###### ===== Joining ==== ######" );
+            join_request_start_timestamp = TimerGetCurrentTime();
         }
-        else
+
+        if( join_request_trials <= ( join_request_trials_max_base + join_request_trials_max ) )
         {
-            if( status == LORAMAC_STATUS_DUTYCYCLE_RESTRICTED )
+            LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"###### ===== Join-Request @ (%d / %d) with DR=%d ==== ######", join_request_trials, (join_request_trials_max_base + join_request_trials_max), mlmeReq.Req.Join.Datarate);
+            status = LoRaMacMlmeRequest( &mlmeReq );
+            LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"###### ===== Join-Request: %s ==== ######",loramac_status_strings[status] );
+            if( status == LORAMAC_STATUS_OK )
             {
-                LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "Next Tx in  : %lu [ms]\n", mlmeReq.ReqReturn.DutyCycleWaitTime );
+                LORAWAN_ED_DEBUG_LOG(LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"###### ===== Joining ==== ######" );
             }
+            else
+            {
+                if( status == LORAMAC_STATUS_DUTYCYCLE_RESTRICTED )
+                {
+                    LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL, "Next Tx in  : %lu [ms]\n", mlmeReq.ReqReturn.DutyCycleWaitTime );
+                }
+            }
+        }
+        else
+        {
+            LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"###### ===== Join Failed(%d),Cost time:%d sec, Please Check DEVEUI-JOINEUI-APPKEY... ==== ######\n",(join_request_trials - 1),( TimerGetCurrentTime() - join_request_start_timestamp )/1000);
+            join_request_trials_max_base = join_request_trials - 1;
         }
     }
-    else
+#endif
+
+#if ( defined LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP ) || (defined LORAWAN_ED_STACK_USING_ACTIVATION_TYPE_ABP)
+    if ( lorawan_ed_init_params.ActivationType == LORAWAN_ED_ACTIVATION_TYPE_ABP )
     {
-        LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"###### ===== Join Failed(%d),Cost time:%d sec, Please Check DEVEUI-JOINEUI-APPKEY... ==== ######\n",(join_request_trials - 1),( TimerGetCurrentTime() - join_request_start_timestamp )/1000);
-        join_request_trials_max_base = join_request_trials - 1;
+        lorawan_ed_app_callback->lorawan_ed_joined();
     }
-
 #endif
     return status;
 }
@@ -1263,7 +1306,7 @@ lorawan_ed_error_status_t lorawan_ed_request_device_class( DeviceClass_t newClas
                 Errorstatus = lorawan_ed_beacon_req( );
 #else
                 LORAWAN_ED_DEBUG_LOG(LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,
-                        "warning: LORAWAN_ED_STACK_USING_DEVICE_TYPE_CLASS_B has not been defined at compilation\n\r");
+                        "warning: LORAWAN_ED_STACK_USING_DEVICE_TYPE_CLASS_B has not been defined at compilation\r\n");
 #endif /* LORAWAN_ED_STACK_USING_DEVICE_TYPE_CLASS_B */
                 break;
             }
@@ -1373,7 +1416,7 @@ static void beacon_Info_trace(MlmeIndication_t *mlmeIndication)
         snr = ( mlmeIndication->BeaconInfo.Snr & 0xFF ) >> 2;
     }  
     
-    LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"\r\n#= BEACON %lu =#, GW desc %d, rssi %d, snr %ld\r\n\r\n", \
+    LORAWAN_ED_DEBUG_LOG( LORAWAN_ED_STACK_DEBUG_APS, DBG_LVL,"\r\n#= BEACON %lu =#, GW desc %d, rssi %d, snr %ld\r\n", \
                              mlmeIndication->BeaconInfo.Time, \
                              mlmeIndication->BeaconInfo.GwSpecific.InfoDesc, \
                              mlmeIndication->BeaconInfo.Rssi, \

+ 16 - 2
lorawan-ed-stack/Aps/Basic/lorawan-ed-aps.h

@@ -25,8 +25,8 @@
 /* Exported constants --------------------------------------------------------*/
 /* Exported types ------------------------------------------------------------*/
 
-#define HEX16(X)  X[0],X[1], X[2],X[3], X[4],X[5], X[6],X[7],X[8],X[9], X[10],X[11], X[12],X[13], X[14],X[15]
-#define HEX8(X)   X[0],X[1], X[2],X[3], X[4],X[5], X[6],X[7]
+#define HEX16(X)  X[0],X[1],X[2],X[3],X[4],X[5],X[6],X[7],X[8],X[9],X[10],X[11],X[12],X[13],X[14],X[15]
+#define HEX8(X)   X[0],X[1],X[2],X[3],X[4],X[5],X[6],X[7]
 
 /*!
  * Application Data structure
@@ -290,6 +290,20 @@ uint8_t lorawan_ed_set_appkey(uint8_t *appkey);
  */
 uint8_t* lorawan_ed_get_appkey(void);
 
+/**
+ * @brief set devaddr
+ * @param [IN] *devaddr
+ * @retval  result
+ */
+uint8_t lorawan_ed_set_devaddr(uint8_t *devaddr);
+
+/**
+ * @brief get devaddr
+ * @param [IN] none
+ * @retval  devaddr
+ */
+uint32_t lorawan_ed_get_devaddr(void);
+
 /**
  * @brief set appskey
  * @param [IN] *appkey

+ 100 - 77
samples/lorawan-ed-shell/lorawan-ed-test-shell.c

@@ -258,12 +258,12 @@ void lorawan_ed_app_thread_entry(void* parameter)
 /* Private functions ---------------------------------------------------------*/
 static void lorawan_ed_joined(void)
 {
-    lorawan_ed_request_device_class((DeviceClass_t)LORAWAN_ED_STACK_MAC_PARAMETER_DEVICE_TYPE);
+    lorawan_ed_request_device_class((DeviceClass_t)lorawan_ed_init_params.Class);
 }
 
 static void lorawan_ed_tx_confirm(McpsConfirm_t *mcpsConfirm)
 {
-    /* nothings */
+
 }
 
 static void lorawan_ed_receive_message(lorawan_ed_appdata_t *app_data)
@@ -423,7 +423,7 @@ static void lorawan_ed_receive_linkcheck(MlmeConfirm_t *mlmeConfirm)
         }
         else
         {
-            rt_kprintf("Request Server timed out: seqno=%d, time=%d ms\n", tx_seq_cnt, ( rx_timestamp - tx_timestamp ) );
+            rt_kprintf("Request Server timed out: seqno=%d, time=%d ms\r\n", tx_seq_cnt, ( rx_timestamp - tx_timestamp ) );
         }
     }
 }
@@ -470,13 +470,13 @@ static void on_tx_timer_event(void)
                    avg_ed_snr = snr_value_total / (int32_t)rx_correct_cnt;
                    avg_gw_demod_margin = gw_demod_margin_value_total / (int32_t)rx_correct_cnt;
                 }
-                rt_kprintf("\r\n====== LoRaWAN End-Device Ping statistics: ======\n");
-                rt_kprintf("-> Tx pakcets: sent = %d, tx_total = %d.%d KByte\n",tx_seq_cnt, tx_total_kbyte_integer, tx_total_kbyte_decimal);
-                rt_kprintf("-> Rx pakcets: received = %d, lost = %d, per = %d%, rx_total = %d.%d KByte\n",rx_correct_cnt, tx_seq_cnt - rx_correct_cnt, per,rx_total_kbyte_integer,rx_total_kbyte_decimal);
-                rt_kprintf("--> End-Device Rx rssi: max_rssi = %d, min_rssi = %d, avg_rssi = %d\n",rssi_value_max,rssi_value_min,avg_ed_rssi);
-                rt_kprintf("--> End-Device Rx snr : max_snr  = %d, min_snr  = %d, avg_snr  = %d\n",snr_value_max,snr_value_min,avg_ed_snr);
-                rt_kprintf("--> Gateway RX DemodMargin : max_margin = %d, min_margin = %d, avg_margin = %d\n",gw_demod_margin_value_max,gw_demod_margin_value_min,avg_gw_demod_margin);
-                rt_kprintf("--> Gateway RX Numbers : %d\n",gw_received_nb);
+                rt_kprintf("\r\n====== LoRaWAN End-Device Ping statistics: ======\r\n");
+                rt_kprintf("-> Tx pakcets: sent = %d, tx_total = %d.%d KByte\r\n",tx_seq_cnt, tx_total_kbyte_integer, tx_total_kbyte_decimal);
+                rt_kprintf("-> Rx pakcets: received = %d, lost = %d, per = %d%, rx_total = %d.%d KByte\r\n",rx_correct_cnt, tx_seq_cnt - rx_correct_cnt, per,rx_total_kbyte_integer,rx_total_kbyte_decimal);
+                rt_kprintf("--> End-Device Rx rssi: max_rssi = %d, min_rssi = %d, avg_rssi = %d\r\n",rssi_value_max,rssi_value_min,avg_ed_rssi);
+                rt_kprintf("--> End-Device Rx snr : max_snr  = %d, min_snr  = %d, avg_snr  = %d\r\n",snr_value_max,snr_value_min,avg_ed_snr);
+                rt_kprintf("--> Gateway RX DemodMargin : max_margin = %d, min_margin = %d, avg_margin = %d\r\n",gw_demod_margin_value_max,gw_demod_margin_value_min,avg_gw_demod_margin);
+                rt_kprintf("--> Gateway RX Numbers : %d\r\n",gw_received_nb);
                 rt_kprintf("====== LoRaWAN End-Device Ping Test Finished ======\r\n");
             }
         }
@@ -595,7 +595,7 @@ int lorawan_test_shell_init(void)
         }
         else
         {
-            rt_kprintf("lorwan_ed_test_shell_thread creat fail!\n");
+            rt_kprintf("lorwan_ed_test_shell_thread creat fail!\r\n");
         }
     }
     return 0;
@@ -619,35 +619,41 @@ typedef enum
     CMD_LORAWAN_ED_STACK_JOIN_INDEX,    // LoRaWAN End-device Join
     CMD_LORAWAN_ED_STACK_PING_INDEX,    // LoRaWAN End-device ping test
     CMD_LORAWAN_ED_STACK_TX_INDEX,      // LoRaWAN End-device TX data
+    CMD_LORAWAN_ED_STACK_SAVE_INDEX,    // LoRaWAN End-device save
+    CMD_LORAWAN_ED_STACK_FACTORY_INDEX, // LoRaWAN End-device factory
 }lorawan_shell_index_t;
 
 const char* lorawan_help_info[] = 
 {
-    [CMD_LORAWAN_ED_STACK_DEVEUI_INDEX]      = "lorawan deveui                              - DevEui(8 Bytes)",
-    [CMD_LORAWAN_ED_STACK_JOINEUI_INDEX]     = "lorawan joineui                             - JoinEui(8 Bytes)",
-    [CMD_LORAWAN_ED_STACK_APPKEY_INDEX]      = "lorawan appkey                              - AppKey(16 Bytes)",
-    [CMD_LORAWAN_ED_STACK_DEVADDR_INDEX]     = "lorawan devaddr                             - DevAddr(4 Bytes)",
-    [CMD_LORAWAN_ED_STACK_APPSKEY_INDEX]     = "lorawan appskey                             - AppSKey(16 Bytes)",
-    [CMD_LORAWAN_ED_STACK_NWKSENCKEY_INDEX]  = "lorawan nwkskey                             - NwkSEncKey(16 Bytes)",
-    [CMD_LORAWAN_ED_STACK_CLASS_INDEX]       = "lorawan class                               - Class Type: A,B,C",
-    [CMD_LORAWAN_ED_STACK_CONFIRM_INDEX]     = "lorawan confirm                             - Data Message Type: Unconfirm,Confirm",
-    [CMD_LORAWAN_ED_STACK_ACTIVATION_INDEX]  = "lorawan activation                          - Activation Type: OTAA,ABP",
-    [CMD_LORAWAN_ED_STACK_ADR_INDEX]         = "lorawan adr                                 - ADR enable",
-    [CMD_LORAWAN_ED_STACK_JOIN_INDEX]        = "lorawan join <nbtrials> <interval>          - join network",
-    [CMD_LORAWAN_ED_STACK_PING_INDEX]        = "lorawan ping <nbtrials> <interval>          - ping network",
-    [CMD_LORAWAN_ED_STACK_TX_INDEX]          = "lorawan tx <mode> <cfm> <port> <len> <data> - tx data",
+    [CMD_LORAWAN_ED_STACK_DEVEUI_INDEX]      = "lorawan deveui <hex0..7>                    - set/get DevEui(8 Bytes)",
+    [CMD_LORAWAN_ED_STACK_JOINEUI_INDEX]     = "lorawan joineui<hex0..7>                    - set/get JoinEui(8 Bytes)",
+    [CMD_LORAWAN_ED_STACK_APPKEY_INDEX]      = "lorawan appkey <hex0..15>                   - set/get AppKey(16 Bytes)",
+    [CMD_LORAWAN_ED_STACK_DEVADDR_INDEX]     = "lorawan devaddr <hex0..3>                   - set/get DevAddr(4 Bytes)",
+    [CMD_LORAWAN_ED_STACK_APPSKEY_INDEX]     = "lorawan appskey <hex0..15>                  - set/get AppSKey(16 Bytes)",
+    [CMD_LORAWAN_ED_STACK_NWKSENCKEY_INDEX]  = "lorawan nwkskey <hex0..15>                  - set/get NwkSEncKey(16 Bytes)",
+    [CMD_LORAWAN_ED_STACK_CLASS_INDEX]       = "lorawan class <0/1/2>                       - set/get Class Type: A,B,C",
+    [CMD_LORAWAN_ED_STACK_CONFIRM_INDEX]     = "lorawan confirm <0/1>                       - set/get Data Message Type: Unconfirm,Confirm",
+    [CMD_LORAWAN_ED_STACK_ACTIVATION_INDEX]  = "lorawan activation <0/1>                    - set/get Activation Type: OTAA,ABP",
+    [CMD_LORAWAN_ED_STACK_ADR_INDEX]         = "lorawan adr <0/1>                           - set/get ADR: disable,enable",
+    [CMD_LORAWAN_ED_STACK_JOIN_INDEX]        = "lorawan join <nbtrial> <interval>           - join network:nbtrial-max join num",
+    [CMD_LORAWAN_ED_STACK_PING_INDEX]        = "lorawan ping <nbtrial> <interval>           - ping network:nbtrial-max ping num",
+    [CMD_LORAWAN_ED_STACK_TX_INDEX]          = "lorawan tx <mode> <cfm> <port> <len> <data> - tx data: mode:0-stop,1-once,2~1500-cnt,>1500-period,cfm:0/1",
+#ifdef PKG_USING_EASYFLASH
+    [CMD_LORAWAN_ED_STACK_SAVE_INDEX]        = "lorawan save <cfg/dev>                      - save config or device info",
+    [CMD_LORAWAN_ED_STACK_FACTORY_INDEX]     = "lorawan factory                             - recover to factory setup",
+#endif
 };
 
 static void lorawan_shell_usage(void)
 {
     size_t i = 0;
     /* parameter error */
-    rt_kprintf("Usage:\n");
+    rt_kprintf("Usage:\r\n");
     for (i = 0; i < sizeof(lorawan_help_info) / sizeof(char*); i++) 
     {
-        rt_kprintf("%s\n", lorawan_help_info[i]);
+        rt_kprintf("%s\r\n", lorawan_help_info[i]);
     }
-    rt_kprintf("\n");
+    rt_kprintf("\r\n");
 }
 
 /* LoRaWAN End-Device shell function */
@@ -674,18 +680,20 @@ static int lorawan(int argc, char *argv[])
                     deveui[i] = get_hex_byte(&argv[2]);
                 }
 
+                rt_kprintf("DevEUI=%02X%02X%02X%02X%02X%02X%02X%02X", HEX8(deveui));
+
                 if( lorawan_ed_set_deveui(deveui) == RT_EOK )
                 {
-                    rt_kprintf("DevEUI=%02X%02X%02X%02X%02X%02X%02X%02X Set OK\r\n", HEX8(deveui));
+                    rt_kprintf(" Set OK\r\n");
                 }
                 else
                 {
-                    rt_kprintf("DevEUI=%02X%02X%02X%02X%02X%02X%02X%02X Set Failed\r\n", HEX8(deveui));
+                    rt_kprintf(" Set Failed\r\n");
                 }
             }
             else
             {
-                rt_kprintf("DevEUI=%02X%02X%02X%02X%02X%02X%02X%02X\n\r", HEX8(lorawan_ed_get_deveui()));
+                rt_kprintf("DevEUI=%02X%02X%02X%02X%02X%02X%02X%02X\r\n", HEX8(lorawan_ed_get_deveui()));
             }
         }
         else if (!rt_strcmp("joineui", cmd))
@@ -697,18 +705,21 @@ static int lorawan(int argc, char *argv[])
                 {
                     joineui[i] = get_hex_byte(&argv[2]);
                 }
+
+                rt_kprintf("JoinEUI=%02X%02X%02X%02X%02X%02X%02X%02X", HEX8(joineui));
+
                 if( lorawan_ed_set_joineui(joineui) == RT_EOK )
                 {
-                    rt_kprintf("JoinEUI=%02X%02X%02X%02X%02X%02X%02X%02X Set OK\r\n", HEX8(joineui));
+                    rt_kprintf(" Set OK\r\n", HEX8(joineui));
                 }
                 else
                 {
-                    rt_kprintf("JoinEUI=%02X%02X%02X%02X%02X%02X%02X%02X Set Failed\r\n", HEX8(joineui));
+                    rt_kprintf(" Set Failed\r\n", HEX8(joineui));
                 }
             }
             else
             {
-                rt_kprintf("JoinEUI=%02X%02X%02X%02X%02X%02X%02X%02X\n\r", HEX8(lorawan_ed_get_joineui()));
+                rt_kprintf("JoinEUI=%02X%02X%02X%02X%02X%02X%02X%02X\r\n", HEX8(lorawan_ed_get_joineui()));
             }
         }
         else if (!rt_strcmp("appkey", cmd))
@@ -721,68 +732,81 @@ static int lorawan(int argc, char *argv[])
                 {
                     appkey[i] = get_hex_byte(&argv[2]);
                 }
+                rt_kprintf("AppKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", HEX16(appkey));
+
                 if( lorawan_ed_set_appkey(appkey) == RT_EOK )
                 {
-                    rt_kprintf("AppKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X Set OK\r\n", HEX16(appkey));
+                    rt_kprintf(" Set OK\r\n");
                 }
                 else
                 {
-                    rt_kprintf("AppKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X Set Failed\r\n", HEX16(appkey));
+                    rt_kprintf(" Set Failed\r\n");
                 }
             }
             else
             {
-                rt_kprintf("AppKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n\r", HEX16(lorawan_ed_get_appkey()));
+                rt_kprintf("AppKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n", HEX16(lorawan_ed_get_appkey()));
             }
         }
         else if (!rt_strcmp("devaddr", cmd))
         {
-            mibReq.Type = MIB_DEV_ADDR;
-
             if( argc > 2 )
             {
-                uint8_t devaddr[4] = { 0 };
+#if ( defined LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP ) || (defined LORAWAN_ED_STACK_USING_ACTIVATION_TYPE_ABP)
+               uint8_t devaddr[4] = { 0 };
 
                for(uint8_t i = 0;i < 4; i++)
                {
                    devaddr[i] = get_hex_byte(&argv[2]);
                }
 
-                mibReq.Type = MIB_DEV_ADDR;
-                mibReq.Param.DevAddr = devaddr[0] << 24 | devaddr[1] << 16 | devaddr[2] << 8 | devaddr[3];
-                LoRaMacMibGetRequestConfirm( &mibReq );
-                rt_kprintf("DevAddr=%04X\n\r", mibReq.Param.DevAddr);
+               rt_kprintf("DevAddr=%08X", devaddr[0] << 24 | devaddr[1] << 16 | devaddr[2] << 8 | devaddr[3]);
+
+               if (lorawan_ed_set_devaddr(devaddr) == RT_EOK)
+               {
+                   rt_kprintf(" Set OK\r\n");
+               }
+               else
+               {
+                   rt_kprintf(" Set Fail\r\n");
+               }
+#else
+                rt_kprintf("Error,Enable ABP function Please.\r\n");
+#endif
             }
             else
             {
-                LoRaMacMibGetRequestConfirm( &mibReq );
-                rt_kprintf("DevAddr=%04X\n\r", mibReq.Param.DevAddr);
+                uint32_t devaddr = lorawan_ed_get_devaddr();
+                rt_kprintf("DevAddr=%08X\r\n", devaddr);
             }
         }
         else if (!rt_strcmp("appskey", cmd))
         {
             if (argc > 2)
             {
+#if ( defined LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP ) || (defined LORAWAN_ED_STACK_USING_ACTIVATION_TYPE_ABP)
                 uint8_t appskey[16] = { 0 };
 
                 for (uint8_t i = 0; i < 16; i++)
                 {
                     appskey[i] = get_hex_byte(&argv[2]);
                 }
+                rt_kprintf("AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",HEX16(appskey));
                 if (lorawan_ed_set_appskey(appskey) == RT_EOK)
                 {
-                    rt_kprintf("AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X Set OK\r\n",
-                            HEX16(appskey));
+                    rt_kprintf(" Set OK\r\n");
                 }
                 else
                 {
-                    rt_kprintf("AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X Set Failed\r\n",
-                            HEX16(appskey));
+                    rt_kprintf(" Set Failed\r\n");
                 }
+#else
+                rt_kprintf("Error,Enable ABP function Please.\r\n");
+#endif
             }
             else
             {
-                rt_kprintf("AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n\r",
+                rt_kprintf("AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n",
                         HEX16(lorawan_ed_get_appskey()));
             }
         }
@@ -790,28 +814,29 @@ static int lorawan(int argc, char *argv[])
         {
             if (argc > 2)
             {
+#if ( defined LORAWAN_ED_STACK_MAC_PARAMETER_ACTIVATION_TYPE_ABP ) || (defined LORAWAN_ED_STACK_USING_ACTIVATION_TYPE_ABP)
                 uint8_t nwkskey[16] = { 0 };
 
                 for (uint8_t i = 0; i < 16; i++)
                 {
                     nwkskey[i] = get_hex_byte(&argv[2]);
                 }
+                rt_kprintf("AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",HEX16(nwkskey));
                 if (lorawan_ed_set_nwkskey(nwkskey) == RT_EOK)
                 {
-                    rt_kprintf(
-                            "AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X Set OK\r\n",
-                            HEX16(nwkskey));
+                    rt_kprintf(" Set OK\r\n");
                 }
                 else
                 {
-                    rt_kprintf(
-                            "AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X Set Failed\r\n",
-                            HEX16(nwkskey));
+                    rt_kprintf(" Set Failed\r\n");
                 }
+#else
+                rt_kprintf("Error,Enable ABP function Please.\r\n");
+#endif
             }
             else
             {
-                rt_kprintf("AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n\r",
+                rt_kprintf("AppSKey=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n",
                         HEX16(lorawan_ed_get_nwkskey()));
             }
         }
@@ -837,9 +862,8 @@ static int lorawan(int argc, char *argv[])
             else
             {
                 LoRaMacMibGetRequestConfirm(&mibReq);
-                rt_kprintf("Class Type: %c, %c\n\r", "ABC"[lorawan_ed_init_params.Class],
-                        "ABC"[(mibReq.Param.Class & 0x03)]);
             }
+            rt_kprintf("Class Type: %c, %c\r\n", "ABC"[lorawan_ed_init_params.Class],"ABC"[(mibReq.Param.Class & 0x03)]);
         }
         else if (!rt_strcmp("nbtrials", cmd))
         {
@@ -862,8 +886,8 @@ static int lorawan(int argc, char *argv[])
             else
             {
                 LoRaMacMibGetRequestConfirm( &mibReq );
-                rt_kprintf("nbtrials: %d\n\r", mibReq.Param.ChannelsNbTrans);
             }
+            rt_kprintf("nbtrials: %d\r\n", mibReq.Param.ChannelsNbTrans);
         }
         else if (!rt_strcmp("confirm", cmd))
         {
@@ -871,10 +895,8 @@ static int lorawan(int argc, char *argv[])
             {
                 lorawan_ed_init_params.DataMessageType = atoi(argv[2]);
             }
-            else
-            {
-                rt_kprintf("Data Message Type: %s\n\r", lorawan_ed_init_params.DataMessageType?"Confirm":"UnConfirm");
-            }
+
+            rt_kprintf("Data Message Type: %s\r\n", lorawan_ed_init_params.DataMessageType?"Confirm":"UnConfirm");
         }
         else if (!rt_strcmp("activation", cmd))
         {
@@ -882,10 +904,8 @@ static int lorawan(int argc, char *argv[])
             {
                 lorawan_ed_init_params.ActivationType = atoi(argv[2]);
             }
-            else
-            {
-                rt_kprintf("Activation Type: %s\n\r", lorawan_ed_init_params.ActivationType?"ABP":"OTAA");
-            }
+
+            rt_kprintf("Activation Type: %s\r\n", lorawan_ed_init_params.ActivationType?"ABP":"OTAA");
         }
         else if (!rt_strcmp("adr", cmd))
         {
@@ -893,10 +913,8 @@ static int lorawan(int argc, char *argv[])
             {
                 lorawan_ed_init_params.AdrEnable = atoi(argv[2]);
             }
-            else
-            {
-                rt_kprintf("ADR: %s\n\r", lorawan_ed_init_params.AdrEnable?"Enable":"Disable");
-            }
+
+            rt_kprintf("ADR: %s\r\n", lorawan_ed_init_params.AdrEnable?"Enable":"Disable");
         }
         /* JOIN */
        else if (!rt_strcmp(cmd, "join"))
@@ -920,7 +938,7 @@ static int lorawan(int argc, char *argv[])
                     /* min join period */
                     if (period < 8)
                     {
-                        rt_kprintf("Join Period Error!\n");
+                        rt_kprintf("Join Period Error!\r\n");
                     }
                     else
                     {
@@ -939,6 +957,8 @@ static int lorawan(int argc, char *argv[])
                 app_tx_period = 0;
 
                 TimerStop(&TxTimer);
+
+                rt_kprintf("Stop Join\r\n");
             }
         }
         else if (!rt_strcmp(cmd, "ping")) /* Ping test */
@@ -965,7 +985,7 @@ static int lorawan(int argc, char *argv[])
 
             if ( lorawan_ed_join_status() == LORAWAN_ED_NOT_JOIN_NETWORK )
             {
-                rt_kprintf("==== Please Join Network first ====\n");
+                rt_kprintf("==== Please Join Network first ====\r\n");
 
                 return 1;
             }
@@ -1050,7 +1070,7 @@ static int lorawan(int argc, char *argv[])
                     }
                     else
                     {
-                        rt_kprintf("==== Please Join Network first ====\n");
+                        rt_kprintf("==== Please Join Network first ====\r\n");
                     }
                 }
                 else
@@ -1079,7 +1099,7 @@ static int lorawan(int argc, char *argv[])
                 TimerStop(&TxTimer);
                 app_tx_period = 0;
 
-                rt_kprintf("Stop Periodic Report\n");
+                rt_kprintf("Stop Periodic Tx\r\n");
             }
         }
 #ifdef PKG_USING_EASYFLASH
@@ -1089,10 +1109,12 @@ static int lorawan(int argc, char *argv[])
             if (!rt_strcmp(argv[2], "dev"))
             {
                 lorawan_ed_save_dev_info();
+                rt_kprintf("save dev done\r\n");
             }
-            else if (!rt_strcmp(argv[2], "cfg"))
+            else // if (!rt_strcmp(argv[2], "cfg"))
             {
                 lorawan_ed_save_cfg();
+                rt_kprintf("save cfg done\r\n");
             }
         }
         else if(!rt_strcmp(cmd, "factory"))
@@ -1100,6 +1122,7 @@ static int lorawan(int argc, char *argv[])
             /* clear cfg parameters */
             lorawan_ed_init_params = lorawan_ed_init_params_default;
             lorawan_ed_save_cfg();
+            rt_kprintf("save cfg done\r\n");
         }
 #endif /* PKG_USING_EASYFLASH */
         else