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
  • 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');
    }
    	

  • And this only happens when the bootloader is present?

  • And this only happens when the bootloader is present?

    Yes. If I just download soft device, this application will work normally.

  • OK, thanks for confirming. I still don't see how the bootloader could be impacting this. Does the MQTT_QMTOPEN command cause the receiver to respond with more data than the other commands?

Related