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
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
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:
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);
}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(<e_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(<e_connected, K_FOREVER);
//获取注册到网络后的信息
struct lte_lc_conn_eval_params params = {0};
err_code = lte_lc_conn_eval_params_get(¶ms);
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
Thank you for all your assistance.
Kind regards,
Peter.Min