case about ncs v1.9.1 fun modem_info_string_get

Hi,

How do I get MODEM_INFO_ICCID correctly

Failed to get MODEM_INFO_ICCID using the modem_info_string_get function

Thank you for all your assistance.
Kind regards,
Peter.Min

Parents
  • Hello,

    I have not used this function before, but looking at how it is used in e.g. modem_info_string_get(), and looking at the declaration of the function in modem_info.h, it says:

    /** @brief Request the current modem status of any predefined
     *         information value as a string.
     *
     * If the data parameter returned by the modem is originally a
     * short, it is still returned as a string.
     *
     * @param info The requested information type.
     * @param buf  The buffer to store the null-terminated string.
     * @param buf_size The size of the buffer.
     *
     * @return Length of received data if the operation was successful.
     *         Otherwise, a (negative) error code is returned.
     */
    int modem_info_string_get(enum modem_info info, char *buf,
    			  const size_t buf_size);

    So the input parameter buf_size should be the length of the buffer,  which in your case should be 128. (or you can just use sizeof(buf))

    Also, you should check the return value of modem_info_string_get:

    * @return Length of received data if the operation was successful.
     *         Otherwise, a (negative) error code is returned.
    So if this returns a negative number, then the modem info was not successfully fetched. If it returns a positive number, then that should be the length of the string that was copied successfully.
    So try something like:
    int ret = modem_info_string_get(type , buf, sizeof(buf));
    		if (ret < 0) {
    			LOG_ERR("Link data not obtained: %d %d", type, ret);
    		}
    		else {
    		    LOG_INF("Link data obtained. Length: %d", ret);
    		    LOG_INF("%s", buf);
    		}
    Best regards,
    Edvin
  • H Edvin,

    The correct operation is as follows. I've got it.

    /*
     * Copyright (c) 2012-2014 Wind River Systems, Inc.
     *
     * SPDX-License-Identifier: Apache-2.0
     */
    
    #include <zephyr.h>
    #include <sys/printk.h>
    #include "logging/log.h"
    LOG_MODULE_REGISTER(main, CONFIG_LOG_DEFAULT_LEVEL);
    
    //Peter add start 测试log打印开始
    void log_test(void)
    {
    	printk("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 0
    	LOG_ERR("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 1
    	LOG_WRN("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 2
    	LOG_INF("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 3
    	LOG_DBG("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 4
    }
    
    //Peter add end
    
    //Peter add start 测试使用at指令
    #include <nrf_modem_at.h>
    void nrf_modem_at_cmd_test(void)
    {
    	int err_code;
    	char imei_buf[20 + sizeof("OK\r\n")];
    	err_code = nrf_modem_at_cmd(imei_buf, sizeof(imei_buf), "AT+CGSN");
    	if (err_code) 
    	{
    		LOG_ERR("Not able to retrieve device IMEI from modem");
    		return err_code;
    	}
    	else
    	{
    		printk("IMEI = %s\r\n", imei_buf);
    	}
    }
    
    //Peter add end
    
    
    //Peter add start 测试lte初始化并附着到网络
    // # Lte config
    // CONFIG_NEWLIB_LIBC=y
    // CONFIG_LTE_LINK_CONTROL=y
    // CONFIG_LTE_NETWORK_MODE_NBIOT=y
    //Semaphore used to block the main thread until the link controller has established an LTE connection.
    #include <modem/lte_lc.h>
    K_SEM_DEFINE(lte_connected, 0, 1);
    
    static void lte_handler(const struct lte_lc_evt *const evt)
    {
         switch (evt->type) {
         case LTE_LC_EVT_NW_REG_STATUS:
                 if ((evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_HOME) &&
                 (evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_ROAMING)) {
                         break;
                 }
    
                 printk("Connected to: %s network\n",
                 evt->nw_reg_status == LTE_LC_NW_REG_REGISTERED_HOME ? "home" : "roaming");
    
                 k_sem_give(&lte_connected);
                 break;
         case LTE_LC_EVT_PSM_UPDATE:
         case LTE_LC_EVT_EDRX_UPDATE:
         case LTE_LC_EVT_RRC_UPDATE:
         case LTE_LC_EVT_CELL_UPDATE:
         case LTE_LC_EVT_LTE_MODE_UPDATE:
         case LTE_LC_EVT_TAU_PRE_WARNING:
         case LTE_LC_EVT_NEIGHBOR_CELL_MEAS:
         case LTE_LC_EVT_MODEM_SLEEP_EXIT_PRE_WARNING:
         case LTE_LC_EVT_MODEM_SLEEP_EXIT:
         case LTE_LC_EVT_MODEM_SLEEP_ENTER:
                 /* Callback events carrying LTE link data */
                 break;
         default:
                 break;
         }
    }
    
    void lte_init_test(void)
    {
        int err_code;
    
    	//初始化LTE
    	err_code = lte_lc_init();
    	if(err_code)
    	{
    		LOG_WRN("lte_lc_init error = %d\r\n", err_code);
    	}
    
    	//设置LTE支持PSM模式
    	err_code = lte_lc_psm_req(true);
    	if (err_code) 
    	{
    		LOG_WRN("lte_lc_psm_req, error: %d\n", err_code);
    		return;
    	}
    
    	//设置LTE支持EDRX模式
    	err_code = lte_lc_edrx_req(true);
    	if (err_code) 
    	{
    		LOG_WRN("lte_lc_edrx_req, error: %d\n", err_code);
    		return;
    	}
    
    	//附着到网络,异步模式
    	err_code = lte_lc_connect_async(lte_handler);
    	if(err_code)
    	{
    		LOG_WRN("lte_lc_connect error = %d\r\n", err_code);
    	}
    
    	//等待附着到网络OK
    	k_sem_take(&lte_connected, K_FOREVER);
    
    	//获取注册到网络后的信息
    	struct lte_lc_conn_eval_params params = {0};
    	err_code = lte_lc_conn_eval_params_get(&params);
    	if (err_code) 
    	{
    		LOG_WRN("lte_lc_conn_eval_params_get, error: %d\n", err_code);
    		return;
    	}
    
    	LOG_INF("lte_lc_conn_eval_params.rrc_state = %d\r\n",params.rrc_state);
    	LOG_INF("lte_lc_conn_eval_params.energy_estimate = %d\r\n",params.energy_estimate);
    	LOG_INF("lte_lc_conn_eval_params.tau_trig = %d\r\n",params.tau_trig);
    	LOG_INF("lte_lc_conn_eval_params.ce_level = %d\r\n",params.ce_level);
    	LOG_INF("lte_lc_conn_eval_params.earfcn = %d\r\n",params.earfcn);
    	LOG_INF("lte_lc_conn_eval_params.dl_pathloss = %d\r\n",params.dl_pathloss);
    	LOG_INF("lte_lc_conn_eval_params.rsrp = %d\r\n",params.rsrp);
    	LOG_INF("lte_lc_conn_eval_params.rsrq = %d\r\n",params.rsrq);
    	LOG_INF("lte_lc_conn_eval_params.tx_rep = %d\r\n",params.tx_rep);
    	LOG_INF("lte_lc_conn_eval_params.rx_rep = %d\r\n",params.rx_rep);
    	LOG_INF("lte_lc_conn_eval_params.phy_cid = %d\r\n",params.phy_cid);
    	LOG_INF("lte_lc_conn_eval_params.band = %d\r\n",params.band);
    	LOG_INF("lte_lc_conn_eval_params.band = %d\r\n",params.band);
    	LOG_INF("lte_lc_conn_eval_params.snr = %d\r\n",params.snr);
    	LOG_INF("lte_lc_conn_eval_params.tx_power = %d\r\n",params.tx_power);
    	LOG_INF("lte_lc_conn_eval_params.mcc = %d\r\n",params.mcc);
    	LOG_INF("lte_lc_conn_eval_params.mnc = %d\r\n",params.mnc);
    	LOG_INF("lte_lc_conn_eval_params.cell_id = %d\r\n",params.cell_id);
    }
    //Peter add end
    
    
    //Peter add start 测试获取modem信息
    // # Modem library
    // # CONFIG_MODEM_INFO=y
    // //获取modem信息
    #include <modem/modem_info.h>
    void get_modem_info_test(void)
    {
    	int err_code;
    
    	err_code = modem_info_init();
    	if(err_code)
    	{
    		LOG_ERR("modem_info_init error = %d\r\n", err_code);
    	}
    
    	char iccid_buf[32];
    	err_code = modem_info_string_get(MODEM_INFO_ICCID , iccid_buf, sizeof(iccid_buf));
    	if( err_code < 0 )
    	{
    		LOG_ERR("modem_info_string_get error = %d\r\n", err_code);
    	}
    	else
    	{
    		printk( "MODEM_INFO_ICCID = %s\r\n", iccid_buf);
    	}
    }
    //Peter add end
    
    
    
    void main(void)
    {
    	log_test();
    	nrf_modem_at_cmd_test();
    	lte_init_test();
    	get_modem_info_test();
    	while(1)
    	{
    		k_sleep( Z_TIMEOUT_MS(3000) );
    	}
    }
    
    
    
    

    # Log config
    CONFIG_LOG=y
    CONFIG_CONSOLE=y
    CONFIG_RTT_CONSOLE=y
    CONFIG_UART_CONSOLE=y
    CONFIG_PRINTK=y
    CONFIG_LOG_PRINTK=y
    CONFIG_LOG_PRINTK_MAX_STRING_LENGTH=256
    CONFIG_BOOT_BANNER=n
    CONFIG_LOG_DEFAULT_LEVEL=4
    
    #CONFIG_LOG_IMMEDIATE=y
    #CONFIG_LOG_MODE_OVERFLOW=y
    #CONFIG_LOG_BUFFER_SIZE=4096
    #CONFIG_LOG_STRDUP_BUF_COUNT=64
    #CONFIG_LOG_STRDUP_MAX_STRING=64
    #CONFIG_LOG_BACKEND_SHOW_COLOR=y
    #CONFIG_LOG_BACKEND_RTT_MODE_DROP=y
    #CONFIG_LOG_BACKEND_UART_SYST_ENABLE=y
    #CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP=y
    #CONFIG_LOG_BACKEND_RTT_MESSAGE_SIZE=256
    #CONFIG_LOG_PROCESS_THREAD_STACK_SIZE=1024
    
    
    # Uart log config
    CONFIG_SERIAL=y
    CONFIG_LOG_BACKEND_UART=y
    
    # Rtt log config
    CONFIG_USE_SEGGER_RTT=y
    CONFIG_LOG_BACKEND_RTT=y
    
    # Modem log config
    CONFIG_NRF_MODEM_LIB_TRACE_ENABLED=y
    
    # Main config
    CONFIG_HEAP_MEM_POOL_SIZE=4096
    CONFIG_MAIN_STACK_SIZE=4096
    
    
    # AT Host library - Used to send AT commands directy from an UART terminal and to allow integration with nRF Connect for Desktop LTE Link monitor application.
    CONFIG_AT_HOST_LIBRARY=y
    
    
    
    # LTE config 
    CONFIG_NEWLIB_LIBC=y
    CONFIG_LTE_LINK_CONTROL=y
    CONFIG_LTE_NETWORK_MODE_NBIOT=y
    
    
    
    # LTE工作起来,才可以获取到信息
    # Modem library
    CONFIG_MODEM_INFO=y
    
    
    
    

    7536.hello_world.zip


    Thank you for all your assistance.
    Kind regards,
    Peter.Min

Reply
  • H Edvin,

    The correct operation is as follows. I've got it.

    /*
     * Copyright (c) 2012-2014 Wind River Systems, Inc.
     *
     * SPDX-License-Identifier: Apache-2.0
     */
    
    #include <zephyr.h>
    #include <sys/printk.h>
    #include "logging/log.h"
    LOG_MODULE_REGISTER(main, CONFIG_LOG_DEFAULT_LEVEL);
    
    //Peter add start 测试log打印开始
    void log_test(void)
    {
    	printk("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 0
    	LOG_ERR("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 1
    	LOG_WRN("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 2
    	LOG_INF("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 3
    	LOG_DBG("Hello World\r\n");  //CONFIG_LOG_DEFAULT_LEVEL = 4
    }
    
    //Peter add end
    
    //Peter add start 测试使用at指令
    #include <nrf_modem_at.h>
    void nrf_modem_at_cmd_test(void)
    {
    	int err_code;
    	char imei_buf[20 + sizeof("OK\r\n")];
    	err_code = nrf_modem_at_cmd(imei_buf, sizeof(imei_buf), "AT+CGSN");
    	if (err_code) 
    	{
    		LOG_ERR("Not able to retrieve device IMEI from modem");
    		return err_code;
    	}
    	else
    	{
    		printk("IMEI = %s\r\n", imei_buf);
    	}
    }
    
    //Peter add end
    
    
    //Peter add start 测试lte初始化并附着到网络
    // # Lte config
    // CONFIG_NEWLIB_LIBC=y
    // CONFIG_LTE_LINK_CONTROL=y
    // CONFIG_LTE_NETWORK_MODE_NBIOT=y
    //Semaphore used to block the main thread until the link controller has established an LTE connection.
    #include <modem/lte_lc.h>
    K_SEM_DEFINE(lte_connected, 0, 1);
    
    static void lte_handler(const struct lte_lc_evt *const evt)
    {
         switch (evt->type) {
         case LTE_LC_EVT_NW_REG_STATUS:
                 if ((evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_HOME) &&
                 (evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_ROAMING)) {
                         break;
                 }
    
                 printk("Connected to: %s network\n",
                 evt->nw_reg_status == LTE_LC_NW_REG_REGISTERED_HOME ? "home" : "roaming");
    
                 k_sem_give(&lte_connected);
                 break;
         case LTE_LC_EVT_PSM_UPDATE:
         case LTE_LC_EVT_EDRX_UPDATE:
         case LTE_LC_EVT_RRC_UPDATE:
         case LTE_LC_EVT_CELL_UPDATE:
         case LTE_LC_EVT_LTE_MODE_UPDATE:
         case LTE_LC_EVT_TAU_PRE_WARNING:
         case LTE_LC_EVT_NEIGHBOR_CELL_MEAS:
         case LTE_LC_EVT_MODEM_SLEEP_EXIT_PRE_WARNING:
         case LTE_LC_EVT_MODEM_SLEEP_EXIT:
         case LTE_LC_EVT_MODEM_SLEEP_ENTER:
                 /* Callback events carrying LTE link data */
                 break;
         default:
                 break;
         }
    }
    
    void lte_init_test(void)
    {
        int err_code;
    
    	//初始化LTE
    	err_code = lte_lc_init();
    	if(err_code)
    	{
    		LOG_WRN("lte_lc_init error = %d\r\n", err_code);
    	}
    
    	//设置LTE支持PSM模式
    	err_code = lte_lc_psm_req(true);
    	if (err_code) 
    	{
    		LOG_WRN("lte_lc_psm_req, error: %d\n", err_code);
    		return;
    	}
    
    	//设置LTE支持EDRX模式
    	err_code = lte_lc_edrx_req(true);
    	if (err_code) 
    	{
    		LOG_WRN("lte_lc_edrx_req, error: %d\n", err_code);
    		return;
    	}
    
    	//附着到网络,异步模式
    	err_code = lte_lc_connect_async(lte_handler);
    	if(err_code)
    	{
    		LOG_WRN("lte_lc_connect error = %d\r\n", err_code);
    	}
    
    	//等待附着到网络OK
    	k_sem_take(&lte_connected, K_FOREVER);
    
    	//获取注册到网络后的信息
    	struct lte_lc_conn_eval_params params = {0};
    	err_code = lte_lc_conn_eval_params_get(&params);
    	if (err_code) 
    	{
    		LOG_WRN("lte_lc_conn_eval_params_get, error: %d\n", err_code);
    		return;
    	}
    
    	LOG_INF("lte_lc_conn_eval_params.rrc_state = %d\r\n",params.rrc_state);
    	LOG_INF("lte_lc_conn_eval_params.energy_estimate = %d\r\n",params.energy_estimate);
    	LOG_INF("lte_lc_conn_eval_params.tau_trig = %d\r\n",params.tau_trig);
    	LOG_INF("lte_lc_conn_eval_params.ce_level = %d\r\n",params.ce_level);
    	LOG_INF("lte_lc_conn_eval_params.earfcn = %d\r\n",params.earfcn);
    	LOG_INF("lte_lc_conn_eval_params.dl_pathloss = %d\r\n",params.dl_pathloss);
    	LOG_INF("lte_lc_conn_eval_params.rsrp = %d\r\n",params.rsrp);
    	LOG_INF("lte_lc_conn_eval_params.rsrq = %d\r\n",params.rsrq);
    	LOG_INF("lte_lc_conn_eval_params.tx_rep = %d\r\n",params.tx_rep);
    	LOG_INF("lte_lc_conn_eval_params.rx_rep = %d\r\n",params.rx_rep);
    	LOG_INF("lte_lc_conn_eval_params.phy_cid = %d\r\n",params.phy_cid);
    	LOG_INF("lte_lc_conn_eval_params.band = %d\r\n",params.band);
    	LOG_INF("lte_lc_conn_eval_params.band = %d\r\n",params.band);
    	LOG_INF("lte_lc_conn_eval_params.snr = %d\r\n",params.snr);
    	LOG_INF("lte_lc_conn_eval_params.tx_power = %d\r\n",params.tx_power);
    	LOG_INF("lte_lc_conn_eval_params.mcc = %d\r\n",params.mcc);
    	LOG_INF("lte_lc_conn_eval_params.mnc = %d\r\n",params.mnc);
    	LOG_INF("lte_lc_conn_eval_params.cell_id = %d\r\n",params.cell_id);
    }
    //Peter add end
    
    
    //Peter add start 测试获取modem信息
    // # Modem library
    // # CONFIG_MODEM_INFO=y
    // //获取modem信息
    #include <modem/modem_info.h>
    void get_modem_info_test(void)
    {
    	int err_code;
    
    	err_code = modem_info_init();
    	if(err_code)
    	{
    		LOG_ERR("modem_info_init error = %d\r\n", err_code);
    	}
    
    	char iccid_buf[32];
    	err_code = modem_info_string_get(MODEM_INFO_ICCID , iccid_buf, sizeof(iccid_buf));
    	if( err_code < 0 )
    	{
    		LOG_ERR("modem_info_string_get error = %d\r\n", err_code);
    	}
    	else
    	{
    		printk( "MODEM_INFO_ICCID = %s\r\n", iccid_buf);
    	}
    }
    //Peter add end
    
    
    
    void main(void)
    {
    	log_test();
    	nrf_modem_at_cmd_test();
    	lte_init_test();
    	get_modem_info_test();
    	while(1)
    	{
    		k_sleep( Z_TIMEOUT_MS(3000) );
    	}
    }
    
    
    
    

    # Log config
    CONFIG_LOG=y
    CONFIG_CONSOLE=y
    CONFIG_RTT_CONSOLE=y
    CONFIG_UART_CONSOLE=y
    CONFIG_PRINTK=y
    CONFIG_LOG_PRINTK=y
    CONFIG_LOG_PRINTK_MAX_STRING_LENGTH=256
    CONFIG_BOOT_BANNER=n
    CONFIG_LOG_DEFAULT_LEVEL=4
    
    #CONFIG_LOG_IMMEDIATE=y
    #CONFIG_LOG_MODE_OVERFLOW=y
    #CONFIG_LOG_BUFFER_SIZE=4096
    #CONFIG_LOG_STRDUP_BUF_COUNT=64
    #CONFIG_LOG_STRDUP_MAX_STRING=64
    #CONFIG_LOG_BACKEND_SHOW_COLOR=y
    #CONFIG_LOG_BACKEND_RTT_MODE_DROP=y
    #CONFIG_LOG_BACKEND_UART_SYST_ENABLE=y
    #CONFIG_LOG_BACKEND_FORMAT_TIMESTAMP=y
    #CONFIG_LOG_BACKEND_RTT_MESSAGE_SIZE=256
    #CONFIG_LOG_PROCESS_THREAD_STACK_SIZE=1024
    
    
    # Uart log config
    CONFIG_SERIAL=y
    CONFIG_LOG_BACKEND_UART=y
    
    # Rtt log config
    CONFIG_USE_SEGGER_RTT=y
    CONFIG_LOG_BACKEND_RTT=y
    
    # Modem log config
    CONFIG_NRF_MODEM_LIB_TRACE_ENABLED=y
    
    # Main config
    CONFIG_HEAP_MEM_POOL_SIZE=4096
    CONFIG_MAIN_STACK_SIZE=4096
    
    
    # AT Host library - Used to send AT commands directy from an UART terminal and to allow integration with nRF Connect for Desktop LTE Link monitor application.
    CONFIG_AT_HOST_LIBRARY=y
    
    
    
    # LTE config 
    CONFIG_NEWLIB_LIBC=y
    CONFIG_LTE_LINK_CONTROL=y
    CONFIG_LTE_NETWORK_MODE_NBIOT=y
    
    
    
    # LTE工作起来,才可以获取到信息
    # Modem library
    CONFIG_MODEM_INFO=y
    
    
    
    

    7536.hello_world.zip


    Thank you for all your assistance.
    Kind regards,
    Peter.Min

Children
No Data
Related