NRF_ERROR_SVC_HANDLER_MISSING PC at 0x00025D3D

Hi,

I'm using nRF52810 with SDK 17.02.

When I don't download bootloader my application worked normally. After I downloaded bootloader, there logging NRF_ERROR_SVC_HANDLER_MISSING.

Parents Reply Children
  • How are you downloading the bootloader?

    I download soft device and bootloader with J-flash, and update my application with DFU. 

    After update my application, this error will happen on UART interface in my application process.

    that your app is not emptying the UART RX buffer fast enough

    How could I empty the UART RX buffer? I need to empty the "data_array" when the "data_index" larger than RX_BUFF_SIZE?

  • The bootloader should not have any affect on how the application runs. Do you always get this error with the bootloader present, and never when it is not?

    Taylor said:
    How could I empty the UART RX buffer? I need to empty the "data_array" when the "data_index" larger than RX_BUFF_SIZE?

    It's when you are calling app_uart_get() from the callback. So the error basically indicating that the uart callback is not being processed frequently enough. Maybe it is being blocked by some other interrupt.

  • The bootloader should not have any affect on how the application runs. Do you always get this error with the bootloader present, and never when it is not?

    YES! When I used UART to read AT command of LTE modem with the bootloader present, this error will happen.

    Here is the log without log:(my application will repeat AT command)

    Here is the log with bootloader:

  • Hi,

    What about the buttonless DFU service, do you initialize it even when the bootloader is not present?

    And another thing, could you try to comment the APP_ERROR_HANDLER() call at line ~119 to ignore com. errors,  then check then check if the event gets triggered multiple times or just once.

  • And another thing, could you try to comment the APP_ERROR_HANDLER() call at line ~119 to ignore com. errors,  then check then check if the event gets triggered multiple times or just once.

    Strangely! Just when I send  "MQTT_QMTOPEN", it will cause this error.

    #include "usr_ec600cn.h"
    #include "app_timer.h"
    #include "nrf_log.h"
    #include <stdlib.h>
    #include <stdio.h>
    #include "nrf_log_ctrl.h"
    #include "usr_spi_lora.h"
    #include "sta_app.h"
    #include "usr_cJson.h"
    
    #define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
    #define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
    
    #define EC600_AT_INTERVAL         APP_TIMER_TICKS(3000)                             /**< AT interval (ticks). **/
    APP_TIMER_DEF(m_uwbat_timer_id);
    ATSTATUS m_ec600at = {
    												0,  //reppeat times
    												AT_ACK_NULL,  //ACK_STATUS
    												0,  //CHECK_STATUS
    											 {0}, //id
    											 {0}, //ICCID
    											 {0}, //sta data
    											 {0}, //tag data
    											 0,   //ָ���ʶ��
    											 0,   //ָ���
    											 0,   //�����
    											 0,   //��Ŵ��
    										 };	
    #define EC_AT       "AT\r\n"
    #define EC_CPIN     "AT+CPIN?\r\n"
    #define EC_CSQ      "AT+CSQ\r\n"    //��ѯ�ź�����
    #define EC_SETCREG  "AT+CREG=1\r\n" //���������ʽ
    #define EC_CREG     "AT+CREG?\r\n"  //��ѯ����ע��
    #define EC_CGATT    "AT+CGATT?\r\n" //��ѯ���總��״̬
    #define EC_CEREG    "AT+CEREG?\r\n" //��ѯ����״̬
    										 
    #define EC_ERROR    "AT+CMEE=1\r\n" //�򿪴������
    #define EC_ATI      "ATI\r\n"       //��ѯ�汾��Ϣ
    										 
    #define SIM_CHECK_ICCID   "AT+QCCID=?\r\n" //SIM��ICCID
    #define SIM_READ_ICCID    "AT+QCCID\r\n"   //��ȡSIM��ICCID
    
    //�����  1064899192823
    #define EC_MESSAGE_CMGF "AT+CMGF=1\r\n"       //�ı���ʽ
    #define EC_MESSAGE_CSCS "AT+CSCS=\"GSM\"\r\n" //GSM����
    #define EC_MESSAGE_CMGS "AT+CMGS=\"1064899192823\"\r\n" //���պ���
    										 
    #define EC_CHECK_NET    "AT+QENG=\"servingcell\"\r\n"                //��ѯGSM����
    										 
    //#define EC_RI_QCFG      "AT+QCFG=\"risignaltype\",\"physical\"\r\n"  //����RING����
    //#define EC_RING_QCG			"AT+QCFG=\"risignaltype\"\r\n"               //��ѯRING����
    #define EC_URC_RING     "AT+QCFG=\"urc/ri/ring\"\r\n"
    //#define EC_URC_OTHER    "AT+QCFG=\"urc/ri/other\"\r\n"
    
    #define EC600N_SLEEP    "AT+QSCLK=1\r\n"                             //��������
    
    #define EC_URC_SET			"AT+QURCCFG=\"urcport\",\"usbat\"\r\n"
    #define EC_URC_CHECK    "AT+QURCCFG=\"urcport\"\r\n"
    
    //MQTT ��SSL
    #define MQTT_QMTCFG       "AT+QMTCFG=\"recv/mode\",0,0,1\r\n"                       //MQTT���ݽ��մ򿪳���
    #define MQTT_QMTOPEN      "AT+QMTOPEN=0,\"120.76.159.132\",17883\r\n"
    #define MQTT_QMTOPEN_C    "AT+QMTOPEN?\r\n"
    //#define MQTT_QMTCONN      "AT+QMTCONN=0,\"aabbcc\",\"elec_tag:elec_tag\",\"elec_tag@2022#.\"\r\n"
    #define MQTT_QMTCONN_C    "AT+QMTCONN?\r\n"
    //#define MQTT_QMTSUB       "AT+QMTSUB=0,1,\"elec_tag.in/013489F1\",0\r\n"            //��������
    //#define MQTT_QMTPUBEX_STA "AT+QMTPUBEX=0,0,0,0,\"elec_tag.out/013489F1\",47\r\n"    //������վ����
    //#define MQTT_QMTPUBEX_TAG "AT+QMTPUBEX=0,0,0,0,\"elec_tag.out/013489F1\",39\r\n"    //����·Ԫ����
    
    char mqtt_qmtopen[37] = "AT+QMTOPEN=0,\"120.76.159.132\",17883\r\n";
    char mqtt_qmtconn[80]={0};
    char mqtt_qmtsub[80]={0};
    char mqtt_qmtpubex_sta[80]={0};
    char mqtt_qmtpubex_tag[80]={0};
    
    uint8_t data_array[255];
    uint8_t data_index = 0;
    
    //AT+CMGF=1 --OK
    //AT+CSCS="GSM" -- OK
    //AT+CMGS="13347203907" -- '<' -- xx xx xx xx+1A -- OK
    /**@brief Function for UWB AT command timeout
     * @details 3s
     */
    static void m_modem_timeout_handler(void * p_context)
    {
    		UNUSED_PARAMETER(p_context);
    		m_ec600at.repeat++;
    		NRF_LOG_INFO("TIME OUT %d",m_ec600at.repeat);
    		NRF_LOG_FLUSH();
    		if(m_ec600at.ack != AT_ACK_SUCCESS)
    		{
    				if(m_ec600at.repeat>=AT_REPEAT_TIME)   //30��ʱ
    				{
    						NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    						NRF_LOG_FLUSH();
    						memset(data_array, 0, sizeof data_array);
    						data_index = 0;
    						m_ec600at.repeat = 0;
    						m_ec600at.ack = AT_ACK_ERROR;	
    				}
    				else m_ec600at.ack = AT_ACK_TIMEOUT;
    		}else m_ec600at.repeat = 0;
    }
    
    /**@brief   Function for handling app_uart events.
     *
     * @details This function will receive a single character from the app_uart module and append it to
     *          a string. The string will be be sent over BLE when the last character received was a
     *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
     */
    /**@snippet [Handling the data received over UART] */
    void uart_event_handle(app_uart_evt_t * p_event)
    {
        uint32_t   err_code;
        switch (p_event->evt_type)
        {
            case APP_UART_DATA_READY:
                UNUSED_VARIABLE(app_uart_get(&data_array[data_index]));
                data_index++;
    						if(data_index>255)data_index=0;
                break;
    
            case APP_UART_COMMUNICATION_ERROR:
    //            APP_ERROR_HANDLER(p_event->data.error_communication);
    						NRF_LOG_INFO("UART ERROR");
                break;
    
            case APP_UART_FIFO_ERROR:
                APP_ERROR_HANDLER(p_event->data.error_code);
                break;
    
            default:
                break;
        }
    }
    /**@snippet [Handling the data received over UART] */
    
    
    /**@brief  Function for initializing the UART module.
     */
    /**@snippet [UART Initialization] */
    void m_uart_init(void)
    {
        uint32_t                     err_code;
        app_uart_comm_params_t const comm_params =
        {
            .rx_pin_no    = RX_PIN,
            .tx_pin_no    = TX_PIN,
            .rts_pin_no   = NULL,
            .cts_pin_no   = NULL,
            .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
            .use_parity   = false,
    #if defined (UART_PRESENT)
            .baud_rate    = NRF_UARTE_BAUDRATE_115200
    #else
            .baud_rate    = NRF_UARTE_BAUDRATE_115200
    #endif
        };
    
        APP_UART_FIFO_INIT(&comm_params,
                           UART_RX_BUF_SIZE,
                           UART_TX_BUF_SIZE,
                           uart_event_handle,
                           APP_IRQ_PRIORITY_LOWEST,
                           err_code);
        APP_ERROR_CHECK(err_code);
    		err_code = app_timer_create(&m_uwbat_timer_id,
    													APP_TIMER_MODE_SINGLE_SHOT,
    													m_modem_timeout_handler);
        APP_ERROR_CHECK(err_code);
    		
    }
    /**@snippet [UART Initialization] */
    
    /**@brief Function for close uart
     */
    void m_uart_close(void)
    {
        uint32_t err_code;
        err_code = app_uart_close();
        APP_ERROR_CHECK(err_code);
    }
    /**@brief Function for uart send
     */
    void m_uart_send(uint8_t *data, uint8_t length)
    {
        uint32_t err_code;
        for(int i=0;i<length;i++)
        {
            err_code = app_uart_put(data[i]);
            APP_ERROR_CHECK(err_code);
        }
    }
    
    /**@brief Function for uwb config
     */
    static void m_ec600_config(char *atcmd ,uint8_t length,AT_ACK uwbtype)
    {
    		uint8_t log_buff[80]={0};
        ret_code_t err_code;
    		if(m_ec600at.ack!=AT_ACK_ERROR) //��ATָ�����
    		{
    				m_ec600at.ack = AT_ACK_WAIT;
    				err_code = app_timer_start(m_uwbat_timer_id, EC600_AT_INTERVAL, NULL);
    				APP_ERROR_CHECK(err_code);
    				m_uart_send((uint8_t *)atcmd,length);
    				while((m_ec600at.ack != AT_ACK_ERROR)&&(m_ec600at.ack != AT_ACK_SUCCESS))
    				{
    						if(m_ec600at.ack == AT_ACK_TIMEOUT)
    						{
    								memset(data_array, 0, sizeof data_array);
    								data_index = 0;
    								m_ec600at.ack = AT_ACK_WAIT;
    								m_uart_send((uint8_t *)atcmd,length);
    								err_code = app_timer_start(m_uwbat_timer_id, EC600_AT_INTERVAL, NULL);
    								APP_ERROR_CHECK(err_code);
    						}
    						switch(uwbtype)
    						{
    								case AT_OK:
    									if(strstr((char *)data_array,"OK"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    											
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}
    									break;
    								case AT_OK_CHECK:
    									if(strstr((char *)data_array,"OK"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    											
    									}else if(strstr((char *)data_array,"ERROR:"))
    									{
    											if((data_array[data_index-2] == '\r')&&(data_array[data_index-1] == '\n'))
    											{
    													NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    													NRF_LOG_FLUSH();
    													memset(data_array, 0, sizeof data_array);
    													data_index = 0;
    											}
    									}
    									break;
    								case AT_OK_READ:
    									if(strstr((char *)data_array,"OK"))
    									{
    											if(sscanf((char *)data_array, "%*[^:]: %[^\r\n]",(char *)m_ec600at.sim_iccid) == 1)
    											{
    													for(int i=0;i<20;i++)
    													{
    															m_eerom_write(AT24CXX_BYTE_ICCID,&m_ec600at.sim_iccid[i],1);
    													}
    											}
    											else
    											{
    													for(int i=0;i<20;i++) 
    													{
    															m_ec600at.sim_iccid[i] = 0;
    															m_eerom_write(AT24CXX_BYTE_ICCID,&m_ec600at.sim_iccid[i],1);
    													}
    											}
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}
    									break;
    								case AT_BLANK:
    									if(strstr((char *)data_array,"\r\n"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    											
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}
    									break;
    								case AT_CPIN:
    									if(strstr((char *)data_array,"READY\r\n\r\nOK"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;									
    									}
    									break;
    								case AT_CSQ:
    									if(strstr((char *)data_array,"\r\n\r\nOK"))
    									{
    											for(int i=0;i<data_index;i++)
    											{
    													if(data_array[i]==',')
    													{
    															if( ((data_array[i-2]=='1')&&(data_array[i-1]>'8'))||((data_array[i-2]=='2')||(data_array[i-2]=='3')) )
    															{
    																	m_ec600at.ack = AT_ACK_SUCCESS;							
    															}else
    															{
    																	NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    																	NRF_LOG_FLUSH();
    																	memset(data_array, 0, sizeof data_array);
    																	data_index = 0;	
    															}
    													}
    											}
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;									
    									}
    									break;
    								case AT_SETCREG:
    									if(strstr((char *)data_array,"\r\nOK"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}
    									break;
    								case AT_CREG:
    									if(strstr((char *)data_array,"+CREG: 1,1\r\n\r\nOK"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"+CREG: 0,1\r\n\r\nOK"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}
    									break;
    								case AT_CGATT:
    									if(strstr((char *)data_array,"+CGATT: 1\r\n\r\nOK"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if((strstr((char *)data_array,"+CGATT: 0\r\n\r\nOK"))||(strstr((char *)data_array,"ERROR")))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}
    									break;
    /************************************************HTTP************************************************/
    /****************************************************************************************************/
    								case AT_CONNECT:
    									if(strstr((char *)data_array,"CONNECT"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}
    									break;
    								case AT_DATA:
    									if(strstr((char *)data_array,"+QHTTPPOST: 0,200"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}
    									break;
    								case AT_HTTPREAD:
    									if((strstr((char *)data_array,"+QHTTPREAD: 0")) && (strstr((char *)data_array,"\"msg\":\"ok\"")))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											if(data_index/80==0)
    											{
    													NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    													NRF_LOG_FLUSH();
    													memset(data_array, 0, sizeof data_array);
    													data_index = 0;
    											}else if((data_index/80)==1)
    											{
    													NRF_LOG_HEXDUMP_INFO(data_array,80);
    													NRF_LOG_FLUSH();
    													data_index = data_index%80;
    													NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    													NRF_LOG_FLUSH();
    											}
    											
    									}
    									break;
    /************************************************MQTT************************************************/
    /****************************************************************************************************/
    								case AT_QMTOPEN:
    									if(strstr((char *)data_array,"+QMTOPEN: 0,0"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}									
    									break;
    								case AT_QMTCONN:
    									if(strstr((char *)data_array,"+QMTCONN: 0,0,0"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}									
    									break;
    								case AT_QMTCONN_C:
    									if(strstr((char *)data_array,"+QMTCONN: 0,3") && strstr((char *)data_array,"OK"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}									
    									break;
    								case AT_QMTSUB:
    									if(strstr((char *)data_array,"+QMTSUB: 0,1,0,0"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}									
    									break;
    								case AT_QMTPUBEX:
    									if(strstr((char *)data_array,">"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}									
    									break;
    								case AT_QMTPUBEXDATA:
    									if(strstr((char *)data_array,"+QMTPUBEX: 0,0,0") && strstr((char *)data_array,"OK"))
    									{
    											m_ec600at.ack = AT_ACK_SUCCESS;
    									}else if(strstr((char *)data_array,"ERROR"))
    									{
    											NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    											NRF_LOG_FLUSH();
    											memset(data_array, 0, sizeof data_array);
    											data_index = 0;
    									}									
    									break;
    								default:
    									break;
    						}
    //******************************************************************************8						
    						if(m_ec600at.ack == AT_ACK_SUCCESS)
    						{
    								err_code = app_timer_stop(m_uwbat_timer_id);
    								APP_ERROR_CHECK(err_code);
    								if((data_index>0)&&(data_index<=80))
    								{
    										NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    										NRF_LOG_FLUSH();
    								}else if((data_index>80)&&(data_index<=160))
    								{
    										NRF_LOG_HEXDUMP_INFO(data_array,80);
    										NRF_LOG_FLUSH();
    										for(int i=0;i<80;i++)log_buff[i] = data_array[81+i];
    										NRF_LOG_HEXDUMP_INFO(log_buff,data_index-80);
    										NRF_LOG_FLUSH();
    								}
    								memset(data_array, 0, sizeof data_array);
    								data_index = 0;
    								m_ec600at.check_status++;
    								m_ec600at.repeat = 0; //�ظ�����
    						}
    				}
    		}
    }
    /**@brief Function for ec600 init
     */
    
    void m_ec600n_init(void)
    {
    		ret_code_t err_code;
    		m_ec600n_open();//����
    		nrf_delay_ms(500);
    		m_ec600_config(EC_AT,strlen(EC_AT),AT_OK);                       //AT check
    		m_ec600_config(EC_ERROR,strlen(EC_ERROR),AT_OK);                 //AT EEROR
    		m_ec600_config(EC_URC_SET,strlen(EC_URC_SET),AT_OK_CHECK);       //SET URC PORT 
    		m_ec600_config(SIM_CHECK_ICCID,strlen(SIM_CHECK_ICCID),AT_OK);   //SIM ICCID check
    		m_ec600_config(SIM_READ_ICCID,strlen(SIM_READ_ICCID),AT_OK_READ);//SIM ICCID read
    		m_eerom_read(AT24CXX_BYTE_WORKMODE, &m_tag_type.mode, 1);
    		if(m_ec600at.check_status == 5)
    		{
    				if(m_tag_type.mode == TAG_FACTORY)
    				{
    						m_tag_type.check[TAG_EC600N] = TAG_CHECK_SUCCESS;
    						NRF_LOG_INFO("EC600CN FACTORY INIT SUCCESS.");
    						m_ec600n_close();
    				}else if(m_tag_type.mode == TAG_NORMAL)
    				{
    						m_ec600_config(EC_CPIN,strlen(EC_CPIN),AT_CPIN);            //CPIN check
    						m_ec600_config(EC_CSQ,strlen(EC_CSQ),AT_CSQ);               //CSQ check
    						m_ec600_config(EC_SETCREG,strlen(EC_SETCREG),AT_SETCREG);   //SET CREG
    						m_ec600_config(EC_CREG,strlen(EC_CREG),AT_CREG);						//CREG check
    						m_ec600_config(EC_CGATT,strlen(EC_CGATT),AT_CGATT);         //CGATT check
    						m_ec600_config(EC_CEREG,strlen(EC_CEREG),AT_OK);            //CEREG check
    						m_ec600_config(EC_CHECK_NET,strlen(EC_CHECK_NET),AT_OK);    //NET CHECK
    						//����MQTT����
    						m_mqtt_string_config();
    						m_ec600_config(MQTT_QMTCFG,strlen(MQTT_QMTCFG),AT_OK);        //����MQTT�����շ�ģʽ
    						m_ec600_config(mqtt_qmtopen,37,AT_QMTOPEN); //�ͻ��˴�����
    						m_ec600_config(mqtt_qmtconn,strlen(mqtt_qmtconn),AT_QMTCONN); //�ͻ�����������
    						m_ec600_config(MQTT_QMTOPEN_C,strlen(MQTT_QMTOPEN_C),AT_OK);  //�ͻ��˲�ѯ����״̬
    						m_ec600_config(mqtt_qmtsub,strlen(mqtt_qmtsub),AT_QMTSUB);    //����TOPIC
    						m_ec600n_sleep(); //��������
    						if(m_ec600at.check_status == 18)
    						{
    								m_tag_type.check[TAG_EC600N] = TAG_CHECK_SUCCESS;
    								NRF_LOG_INFO("EC600CN NORMAL INIT SUCCESS.");
    						}else
    						{
    								m_tag_type.check[TAG_EC600N] = TAG_CHECK_ERROR;
    								NRF_LOG_WARNING("EC600CN INIT SLEEP ERROR.[ERROR: %d]",m_ec600at.check_status);
    						}
    				}
    		}else
    		{
    				m_tag_type.check[TAG_EC600N] = TAG_CHECK_ERROR;
    				NRF_LOG_WARNING("EC600CN INIT ERROR.[ERROR: %d]",m_ec600at.check_status);
    		}
    		if(m_tag_type.check[TAG_EC600N] == TAG_CHECK_ERROR)//�ػ�
    		{
    				m_ec600n_close();
    		}
    		memset(data_array, 0, sizeof data_array);
    		data_index = 0;
    		m_ec600at.ack = AT_ACK_WAIT;
    		m_ec600at.check_status = 0;
    }
    
    /**@brief Function for update sta data
     */
    void m_device_data_config(uint8_t device_type,uint8_t tag_number)
    {
    		int32_t sta_temp;
    		sd_temp_get(&sta_temp);
    		sta_temp = sta_temp*0.24;
    		if(device_type == DEVICE_TYPE_STA)
    		{
    				m_ec600at.device_sta_data[0] = '1';                                              //�豸����
    				m_ec600at.device_sta_data[1] = m_ascci_hex((m_ec600at.id_number[4]>>4));         //�豸ID1
    				m_ec600at.device_sta_data[2] = m_ascci_hex((m_ec600at.id_number[4] & 0x0F));     //�豸ID1
    				m_ec600at.device_sta_data[3] = m_ascci_hex((m_ec600at.id_number[5]>>4));         //�豸ID2
    				m_ec600at.device_sta_data[4] = m_ascci_hex((m_ec600at.id_number[5] & 0x0F));     //�豸ID2
    				m_ec600at.device_sta_data[5] = m_ascci_hex((m_ec600at.id_number[6]>>4));         //�豸ID3
    				m_ec600at.device_sta_data[6] = m_ascci_hex((m_ec600at.id_number[6] & 0x0F));     //�豸ID3
    				m_ec600at.device_sta_data[7] = m_ascci_hex((m_ec600at.id_number[7]>>4));         //�豸ID4
    				m_ec600at.device_sta_data[8] = m_ascci_hex((m_ec600at.id_number[7] & 0x0F));    //�豸ID5
    				if(tag_status_value[0][5] == 0x02)//��ײģʽ
    				{
    						tag_status_value[0][5] = 0x00;
    						m_ec600at.device_sta_data[9] = m_ascci_hex(0x02); 			                     //��ײģʽ
    				}else
    				{
    						m_ec600at.device_sta_data[9] = m_ascci_hex((m_tag_type.mode & 0x0F)); 			 //����ģʽ
    				}
    				m_ec600at.device_sta_data[10] = m_ascci_hex((m_tag_type.battery>>12)); 				   //��ص�ѹ
    				m_ec600at.device_sta_data[11] = m_ascci_hex((m_tag_type.battery>>8) & 0x0F); 	   //��ص�ѹ
    				m_ec600at.device_sta_data[12] = m_ascci_hex((m_tag_type.battery>>4) & 0x0F); 	   //��ص�ѹ
    				m_ec600at.device_sta_data[13] = m_ascci_hex((m_tag_type.battery & 0x0F));        //��ص�ѹ
    				m_ec600at.device_sta_data[14] = m_ascci_hex((sta_temp>>12)& 0x0F);    					 //�¶�
    				m_ec600at.device_sta_data[15] = m_ascci_hex((sta_temp>>8)& 0x0F);   						 //�¶�
    				m_ec600at.device_sta_data[16] = m_ascci_hex((sta_temp>>4)& 0x0F);    					   //�¶�
    				m_ec600at.device_sta_data[17] = m_ascci_hex(sta_temp& 0x0F);    							   //�¶�
    				m_ec600at.device_sta_data[18] = m_ascci_hex((m_tag_type.check[TAG_EEROM])   & 0x0F); //flash״̬
    				m_ec600at.device_sta_data[19] = m_ascci_hex((m_tag_type.check[TAG_GSENSOR]) & 0x0F); //gsensor״̬
    				m_ec600at.device_sta_data[20] = m_ascci_hex((m_tag_type.check[TAG_EC600N])  & 0x0F); //modem״̬
    				m_ec600at.device_sta_data[21] = m_ascci_hex((m_tag_type.check[TAG_LORA])    & 0x0F); //lora״̬
    				m_ec600at.device_sta_data[22] = m_ascci_hex(TAG_HW_VERSION>>4);    			//Ӳ���汾
    				m_ec600at.device_sta_data[23] = m_ascci_hex(TAG_HW_VERSION & 0x0F);    	//Ӳ���汾
    				m_ec600at.device_sta_data[24] = m_ascci_hex(TAG_FW_VERSION>>4);    			//����汾
    				m_ec600at.device_sta_data[25] = m_ascci_hex(TAG_FW_VERSION & 0x0F);     //����汾
    				m_ec600at.device_sta_data[26] = m_ascci_hex(m_tag_type.tag_config[5] & 0x0F);  //����ǿ��
    				
    				for(int i=0;i<20;i++)
    				m_ec600at.device_sta_data[27+i] = m_ec600at.sim_iccid[i];      //ICCID
    		}else if(device_type == DEVICE_TYPE_TAG)
    		{
    				m_ec600at.device_tag_data[0] = '2';                                                   //�豸����
    				m_ec600at.device_tag_data[1] = m_ascci_hex(tag_status_value[tag_number][1]>>4);       //�豸ID1
    				m_ec600at.device_tag_data[2] = m_ascci_hex(tag_status_value[tag_number][1] & 0x0F);   //�豸ID1
    				m_ec600at.device_tag_data[3] = m_ascci_hex(tag_status_value[tag_number][2]>>4);       //�豸ID2
    				m_ec600at.device_tag_data[4] = m_ascci_hex(tag_status_value[tag_number][2] & 0x0F);   //�豸ID2
    				m_ec600at.device_tag_data[5] = m_ascci_hex(tag_status_value[tag_number][3]>>4);       //�豸ID3
    				m_ec600at.device_tag_data[6] = m_ascci_hex(tag_status_value[tag_number][3] & 0x0F);   //�豸ID3
    				m_ec600at.device_tag_data[7] = m_ascci_hex(tag_status_value[tag_number][4]>>4);       //�豸ID4
    				m_ec600at.device_tag_data[8] = m_ascci_hex(tag_status_value[tag_number][4] & 0x0F);  //�豸ID4
    				m_ec600at.device_tag_data[9] = m_ascci_hex(tag_status_value[tag_number][5] & 0x0F); 	//����ģʽ
    				m_ec600at.device_tag_data[10] = m_ascci_hex(tag_status_value[tag_number][6]>>4); 			//��ص�ѹ
    				m_ec600at.device_tag_data[11] = m_ascci_hex(tag_status_value[tag_number][6]& 0x0F); 	//��ص�ѹ
    				m_ec600at.device_tag_data[12] = m_ascci_hex(tag_status_value[tag_number][7]>>4); 	    //��ص�ѹ
    				m_ec600at.device_tag_data[13] = m_ascci_hex(tag_status_value[tag_number][7]& 0x0F);   //��ص�ѹ
    				m_ec600at.device_tag_data[14] = m_ascci_hex(tag_status_value[tag_number][8]>>4);   	  //�¶�
    				m_ec600at.device_tag_data[15] = m_ascci_hex(tag_status_value[tag_number][8]& 0x0F);   //�¶�
    				m_ec600at.device_tag_data[16] = m_ascci_hex(tag_status_value[tag_number][9]>>4);   		//�¶�
    				m_ec600at.device_tag_data[17] = m_ascci_hex(tag_status_value[tag_number][9]& 0x0F);   //�¶�
    				m_ec600at.device_tag_data[18] = m_ascci_hex(tag_status_value[tag_number][10] & 0x0F); //flash״̬
    				m_ec600at.device_tag_data[19] = m_ascci_hex(tag_status_value[tag_number][11] & 0x0F); //gsensor״̬
    				m_ec600at.device_tag_data[20] = m_ascci_hex(tag_status_value[tag_number][12] & 0x0F); //modem״̬
    				m_ec600at.device_tag_data[21] = m_ascci_hex(tag_status_value[tag_number][13] & 0x0F); //lora״̬
    				m_ec600at.device_tag_data[22] = m_ascci_hex(tag_status_value[tag_number][21]>>4);     //Ӳ���汾
    				m_ec600at.device_tag_data[23] = m_ascci_hex(tag_status_value[tag_number][21] & 0x0F); //Ӳ���汾
    				m_ec600at.device_tag_data[24] = m_ascci_hex(tag_status_value[tag_number][22]>>4);    	//����汾
    				m_ec600at.device_tag_data[25] = m_ascci_hex(tag_status_value[tag_number][22] & 0x0F); //����汾
    				m_ec600at.device_tag_data[26] = m_ascci_hex(tag_status_value[tag_number][23] & 0x0F); //����ǿ��
    				
    				m_ec600at.device_tag_data[27] = m_ascci_hex(tag_status_value[tag_number][14]>>4);     //�����豸ID1
    				m_ec600at.device_tag_data[28] = m_ascci_hex(tag_status_value[tag_number][14] & 0x0F); //�����豸ID1
    				m_ec600at.device_tag_data[29] = m_ascci_hex(tag_status_value[tag_number][15]>>4);     //�����豸ID2
    				m_ec600at.device_tag_data[30] = m_ascci_hex(tag_status_value[tag_number][15] & 0x0F); //�����豸ID2
    				m_ec600at.device_tag_data[31] = m_ascci_hex(tag_status_value[tag_number][16]>>4);     //�����豸ID3
    				m_ec600at.device_tag_data[32] = m_ascci_hex(tag_status_value[tag_number][16] & 0x0F); //�����豸ID3
    				m_ec600at.device_tag_data[33] = m_ascci_hex(tag_status_value[tag_number][17]>>4);     //�����豸ID4
    				m_ec600at.device_tag_data[34] = m_ascci_hex(tag_status_value[tag_number][17] & 0x0F); //�����豸ID4
    				m_ec600at.device_tag_data[35] = m_ascci_hex(tag_status_value[tag_number][18]>>4);     //������
    				m_ec600at.device_tag_data[36] = m_ascci_hex(tag_status_value[tag_number][18] & 0x0F); //������
    				m_ec600at.device_tag_data[37] = m_ascci_hex(tag_status_value[tag_number][19] & 0x0F); //������
    				m_ec600at.device_tag_data[38] = m_ascci_hex(tag_status_value[tag_number][20] & 0x0F); //�����
    		}
    }
    /**@brief Function for ec600 MQTT PUBEX/SUB
     */
    void m_ec600n_mqtt_pubex(uint8_t pubstatus)
    {
    		uint8_t mqtt_number_count = 0;
    		if(m_tag_type.check[TAG_EC600N] == TAG_CHECK_ERROR)
    		{
    				m_ec600n_open();//����
    		}else
    		{
    				m_ec600n_wake();//����ģ��
    		}
    		
    		m_ec600_config(EC_AT,strlen(EC_AT),AT_OK);                        //AT check 
    		m_ec600_config(EC_ATI,strlen(EC_ATI),AT_OK);                      //VERSION CHECK
    		m_ec600_config(SIM_CHECK_ICCID,strlen(SIM_CHECK_ICCID),AT_OK);    //SIM ICCID check
    		m_ec600_config(SIM_READ_ICCID,strlen(SIM_READ_ICCID),AT_OK_READ); //SIM ICCID read
    		m_ec600_config(EC_URC_SET,strlen(EC_URC_SET),AT_OK);        //SET URC PORT
    		m_ec600_config(EC_CPIN,strlen(EC_CPIN),AT_CPIN);            //CPIN check
    		m_ec600_config(EC_CSQ,strlen(EC_CSQ),AT_CSQ);               //CSQ check
        m_ec600_config(EC_SETCREG,strlen(EC_SETCREG),AT_SETCREG);   //SET CREG
    		m_ec600_config(EC_CREG,strlen(EC_CREG),AT_CREG);						//CREG check
    		m_ec600_config(EC_CGATT,strlen(EC_CGATT),AT_CGATT);         //CGATT check
    		m_ec600_config(EC_CEREG,strlen(EC_CEREG),AT_OK);            //CEREG check
    		
    		m_mqtt_string_config(); //����MQTT�ַ���ָ��
    		if(m_ec600n_mqtt_check()==0)
    		{
    		//MQTT CONFIG
    				m_ec600_config(MQTT_QMTCFG,strlen(MQTT_QMTCFG),AT_OK);              //MQTT���ݸ�ʽ
    				m_ec600_config(MQTT_QMTOPEN,strlen(MQTT_QMTOPEN),AT_QMTOPEN);       //MQTT������
    				m_ec600_config(mqtt_qmtconn,strlen(mqtt_qmtconn),AT_QMTCONN);       //MQTT��������
    				m_ec600_config(MQTT_QMTOPEN_C,strlen(MQTT_QMTOPEN_C),AT_OK);        //MQTT�鿴������
    				m_ec600_config(MQTT_QMTCONN_C,strlen(MQTT_QMTCONN_C),AT_QMTCONN_C); //MQTT����״̬
    		}
    		//MQTT STA PUBEX
    		m_ec600_config(mqtt_qmtpubex_sta,strlen(mqtt_qmtpubex_sta),AT_QMTPUBEX); //����STA TOPIC
    		m_device_data_config(DEVICE_TYPE_STA,0);
    		if(pubstatus == MODEM_PUBSTATUS_BACK)//��ִ
    		{
    				m_ec600at.device_sta_data[9] = m_ascci_hex(0x03);
    				NRF_LOG_INFO("mqtt data back...");
    				NRF_LOG_FLUSH();
    				m_ec600_config((char *)m_ec600at.device_sta_data,47,AT_QMTPUBEXDATA);    //Data
    		}
    		else                                 //����
    		{
    				m_ec600_config((char *)m_ec600at.device_sta_data,47,AT_QMTPUBEXDATA);    //Data
    				//MQTT TAG PUBEX
    				for(int i=1;i<201;i++)
    				{
    						if(tag_status_value[i][24] == LORA_VALUE_UPDATE)
    						{
    								mqtt_number_count++;
    								nrf_delay_ms(10);
    								m_ec600_config(mqtt_qmtpubex_tag,strlen(mqtt_qmtpubex_tag),AT_QMTPUBEX); //����TAG TOPIC
    								m_device_data_config(DEVICE_TYPE_TAG,i);
    								m_ec600_config((char *)m_ec600at.device_tag_data,47,AT_QMTPUBEXDATA);    //Data
    								tag_status_value[i][24] = LORA_VALUE_DONE;
    						}
    				}
    		}
    		m_ec600n_sleep(); //��������
    		if((m_ec600at.check_status == (3+2*mqtt_number_count)) || (m_ec600at.check_status == (8+2*mqtt_number_count)))
    		{
    				m_tag_type.check[TAG_EC600N] = TAG_CHECK_SUCCESS;
    				NRF_LOG_INFO("EC600CN MQTT PUBEX SUCCESS.");
    		}else
    		{
    				m_tag_type.check[TAG_EC600N] = TAG_CHECK_ERROR;
    				NRF_LOG_WARNING("EC600CN MQTT PUBEX ERROR.[ERROR: %d]",m_ec600at.check_status);
    		}
    		memset(data_array, 0, sizeof data_array);
    		data_index = 0;
    		m_ec600at.ack = AT_ACK_WAIT;
    		m_ec600at.check_status = 0;
    		if(m_tag_type.check[TAG_EC600N] == TAG_CHECK_ERROR)
    		{
    				m_ec600n_close();//�ػ�
    		}
    }
    //��ȡ������������
    void m_ec600n_mqtt_sub(void)
    {
    		uint8_t mqtt_sub[20] = {0};
    		char mqtt_id[10] = {0};
    		if(strstr((char *)data_array,"+QMTRECV: 0,0,"))
    		{
    			nrf_delay_ms(100);
    			NRF_LOG_HEXDUMP_INFO(data_array,data_index);
    			if((data_array[data_index-2] == '\r') && (data_array[data_index-1] == '\n'))
    			{
    					for(int i=0;i<16;i++) mqtt_sub[15-i] = data_array[data_index-4-i];
    					mqtt_sub[16] = data_array[data_index-23]; //���ݳ���
    					mqtt_sub[17] = data_array[data_index-22]; //���ݳ���
    					NRF_LOG_INFO("SUB DATA: %s",mqtt_sub);
    					if((mqtt_sub[16] == '1') && (mqtt_sub[17] == '6'))
    					{
    							sprintf(mqtt_id,"%02x%02x%02x%02x",m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7]);
    							if(strstr((char *)mqtt_sub,(char *)mqtt_id))
    							{
    									m_ec600at.mqtt_cmd = (m_ascci_to_hex(mqtt_sub[8])<<4) + m_ascci_to_hex(mqtt_sub[9]);      //ָ���ʶ��
    									m_ec600at.mqtt_status = (m_ascci_to_hex(mqtt_sub[10])<<4) + m_ascci_to_hex(mqtt_sub[11]); //ָ���
    									m_ec600at.mqtt_low = (m_ascci_to_hex(mqtt_sub[12])<<4) + m_ascci_to_hex(mqtt_sub[13]);    //�Ͷ˱��
    									m_ec600at.mqtt_high = (m_ascci_to_hex(mqtt_sub[14])<<4) + m_ascci_to_hex(mqtt_sub[15]);   //�߶˱��
    									switch(m_ec600at.mqtt_cmd)
    									{
    										case 0x04:
    												NRF_LOG_INFO("MQTT SUB INTRER SET GESENSOR MODE...");
    												m_ec600at.mqtt_cmd = LORA_GSENSOR_SET_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x05:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH ALL MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_ALL_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x06:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH UP MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_UP_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x07:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH UP IN MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_UP_IN_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x08:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH UP OUT MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_UP_OUT_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x09:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH DOWN MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_DOWN_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x0A:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH DOWN IN MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_DOWN_IN_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x0B:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH DOWN OUT MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_DOWN_OUT_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x0C:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH NUMBER SINGLE MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_NUMBER_SINGLE_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										case 0x0F:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH NUMBER RANGE MODE...");
    												m_ec600at.mqtt_cmd = LORA_FLASH_NUMBER_RANGE_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    //***************************************************************************************										
    										case 0x0D:   
    												NRF_LOG_INFO("MQTT SUB INTRER UPDATE MODE...");
    												m_tag_type.event_status = TAG_UPDATE_EVENT;
    											break;
    										case 0x0E:
    												NRF_LOG_INFO("MQTT SUB INTRER FLASH STA MODE...");
    												m_ec600at.mqtt_cmd = LORA_CONTROL_STA_MODE;
    												m_tag_type.event_status = TAG_CONTROL_EVENT;
    											break;
    										default:
    												NRF_LOG_INFO("MQTT SUB ERROR DATA");
    												m_tag_type.event_status = TAG_NO_EVENT;
    											break;
    									}
    							}else
    							{
    									NRF_LOG_WARNING("MQTT SUB WRONG STA ID...");
    							}
    					}else
    					{
    							NRF_LOG_WARNING("MQTT SUB UNUSEFUL DATA...");
    					}
    			}
    			memset(data_array, 0, sizeof data_array);
    			data_index = 0;
    		}
    		NRF_LOG_FLUSH();
    }
    /**@brief Function for hex to ascci
     * @Details 
     */
    uint8_t m_ascci_hex(uint8_t str)
    {
    		if((str<=9)&&(str>=0))
    		{
    				return str+0x30;
    		}else if((str<=15)&&(str>=10))
    		{
    				return str+0x37;
    		}
    }
    uint8_t m_ascci_to_hex(uint8_t str)
    {
    		if((str<='9')&&(str>='0'))
    		{
    				return str-0x30;
    		}else if((str<='f')&&(str>='a'))
    		{
    				return str-0x57;
    		}
    }
    /**@brief Function for open/close/sleep/wake modem 
     * @Details 
     */
    void m_ec600n_open(void)
    {
    		ret_code_t err_code;
    		EC600N_DTR_LOW();  //����DTR
    		MODEM_ON();
    		nrf_delay_ms(2000);
    		EC600CN_PWK_HIGH();
    		nrf_delay_ms(2000);
    		EC600CN_PWK_LOW();
    		nrf_delay_ms(2000);
    		EC600CN_PWK_HIGH();
    		nrf_delay_ms(2000);
    }
    void m_ec600n_close(void)
    {
    		EC600N_DTR_HIGH();  //����DTR
    		EC600CN_PWK_HIGH();
    		nrf_delay_ms(1000);
    		EC600CN_PWK_LOW();
    		nrf_delay_ms(1000);
    		EC600CN_PWK_HIGH();
    		nrf_delay_ms(800);
    		MODEM_OFF();
    		nrf_delay_ms(1000);
    		memset(data_array, 0, sizeof data_array);
    		data_index = 0;
    		m_ec600at.ack = AT_ACK_WAIT;
    		m_ec600at.check_status = 0;
    }
    void m_ec600n_sleep(void)
    {
    		m_ec600_config(EC600N_SLEEP,strlen(EC600N_SLEEP),AT_OK);//SLEEP MODE
    		nrf_gpio_pin_set(EC600CN_DTR_PIN);
    		nrf_delay_ms(200);
    }
    void m_ec600n_wake(void)
    {
    		ret_code_t err_code;
    		nrf_gpio_pin_clear(EC600CN_DTR_PIN);
    		nrf_delay_ms(200);
    }
    uint8_t m_ec600n_mqtt_check(void)
    {
    		uint8_t status=0;
    		m_ec600_config(MQTT_QMTCONN_C,strlen(MQTT_QMTCONN_C),AT_QMTCONN_C);
    		if(m_ec600at.ack!=AT_ACK_ERROR)
    		{
    				status = 1;
    		}else
    		{
    				status = 0;
    		}
    		memset(data_array, 0, sizeof data_array);
    		data_index = 0;
    		m_ec600at.ack = AT_ACK_WAIT;
    		m_ec600at.check_status = 0;
    		return status;
    }
    void m_mqtt_string_config(void)
    {
    		sprintf(mqtt_qmtconn,"%s%02x%02x%02x%02x%s%c%c","AT+QMTCONN=0,\"",
    																										m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7],
    																										"\",\"elec_tag:elec_tag\",\"elec_tag@2022#.\"",
    																										'\r','\n');
    		sprintf(mqtt_qmtsub,"%s%02x%02x%02x%02x%s%c%c","AT+QMTSUB=0,1,\"elec_tag.in/",
    																										m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7],
    																										"\",0",
    																										'\r','\n');
    		sprintf(mqtt_qmtpubex_sta,"%s%02x%02x%02x%02x%s%c%c","AT+QMTPUBEX=0,0,0,0,\"elec_tag.out/",
    																										m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7],
    																										"\",47",
    																										'\r','\n');
    		sprintf(mqtt_qmtpubex_tag,"%s%02x%02x%02x%02x%s%c%c","AT+QMTPUBEX=0,0,0,0,\"elec_tag.out/",
    																										m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7],
    																										"\",39",
    																										'\r','\n');
    }
    	

Related