Skip to content

Commit 49c0e7f

Browse files
hmhalvorsenlemrey
authored andcommitted
lib: modem_info: Obtain ICCID data
The modem informer now obtains the ICCID parameter from the modem and adds it to the device JSON string. Signed-off-by: Henrik Malvik Halvorsen <[email protected]>
1 parent 38eb261 commit 49c0e7f

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

include/modem_info.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
*/
1717

1818
/** Largest expected parameter response size. */
19-
#define MODEM_INFO_MAX_RESPONSE_SIZE 32
19+
#define MODEM_INFO_MAX_RESPONSE_SIZE 64
2020

2121
/** Size of the JSON string. */
22-
#define MODEM_INFO_JSON_STRING_SIZE 128
22+
#define MODEM_INFO_JSON_STRING_SIZE 256
2323

2424
/** RSRP offset value. */
2525
#define MODEM_INFO_RSRP_OFFSET_VAL 141
@@ -39,6 +39,7 @@ enum modem_info {
3939
MODEM_INFO_BATTERY, /**< Battery voltage. */
4040
MODEM_INFO_TEMP, /**< Temperature level. */
4141
MODEM_INFO_FW_VERSION, /**< Modem firmware version. */
42+
MODEM_INFO_ICCID, /**< SIM ICCID */
4243
MODEM_INFO_COUNT, /**< Number of legal elements in the enum. */
4344
};
4445

lib/modem_info/modem_info.c

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ LOG_MODULE_REGISTER(modem_info);
3434
#define AT_CMD_VBAT "AT%XVBAT"
3535
#define AT_CMD_TEMP "AT%XTEMP"
3636
#define AT_CMD_FW_VERSION "AT+CGMR"
37+
#define AT_CMD_CRSM "AT+CRSM"
38+
#define AT_CMD_ICCID "AT+CRSM=176,12258,0,0,10"
3739
#define AT_CMD_SUCCESS_SIZE 5
38-
3940
#define RSRP_PARAM_INDEX 0
4041
#define RSRP_PARAM_COUNT 2
4142
#define RSRP_OFFSET_VAL 141
@@ -67,6 +68,9 @@ LOG_MODULE_REGISTER(modem_info);
6768
#define FW_PARAM_INDEX 0
6869
#define FW_PARAM_COUNT 1
6970

71+
#define ICCID_PARAM_INDEX 2
72+
#define ICCID_PARAM_COUNT 3
73+
7074
#define CMD_SIZE(x) (strlen(x) - 1)
7175

7276
static const char success[] = "OK";
@@ -148,6 +152,13 @@ static const struct modem_info_data fw_data = {
148152
.data_type = AT_PARAM_TYPE_STRING,
149153
};
150154

155+
static const struct modem_info_data iccid_data = {
156+
.cmd = AT_CMD_ICCID,
157+
.param_index = ICCID_PARAM_INDEX,
158+
.param_count = ICCID_PARAM_COUNT,
159+
.data_type = AT_PARAM_TYPE_STRING,
160+
};
161+
151162
static const struct modem_info_data *const modem_data[] = {
152163
[MODEM_INFO_RSRP] = &rsrp_data,
153164
[MODEM_INFO_BAND] = &band_data,
@@ -159,6 +170,7 @@ static const struct modem_info_data *const modem_data[] = {
159170
[MODEM_INFO_BATTERY] = &battery_data,
160171
[MODEM_INFO_TEMP] = &temp_data,
161172
[MODEM_INFO_FW_VERSION] = &fw_data,
173+
[MODEM_INFO_ICCID] = &iccid_data,
162174
};
163175

164176
static const char *const modem_data_name[] = {
@@ -172,6 +184,7 @@ static const char *const modem_data_name[] = {
172184
[MODEM_INFO_BATTERY] = "BATTERY",
173185
[MODEM_INFO_TEMP] = "TEMP",
174186
[MODEM_INFO_FW_VERSION] = "FW",
187+
[MODEM_INFO_ICCID] = "ICCID",
175188
};
176189

177190
static rsrp_cb_t modem_info_rsrp_cb;
@@ -220,6 +233,42 @@ static bool is_cesq_notification(char *buf, size_t len)
220233
return strstr(buf, AT_CMD_CESQ_RESP) ? true : false;
221234
}
222235

236+
static void flip_iccid_string(char *buf)
237+
{
238+
u8_t current_char;
239+
u8_t next_char;
240+
241+
for (size_t i = 0; i < strlen(buf); i = i + 2) {
242+
current_char = buf[i];
243+
next_char = buf[i + 1];
244+
245+
buf[i] = next_char;
246+
buf[i + 1] = current_char;
247+
}
248+
}
249+
250+
static int modem_info_parse_iccid(const struct modem_info_data *modem_data,
251+
char *buf)
252+
{
253+
int err;
254+
u32_t param_index;
255+
256+
err = at_parser_max_params_from_str(
257+
&buf[CMD_SIZE(AT_CMD_CRSM)], &m_param_list,
258+
modem_data->param_count);
259+
260+
if (err != 0) {
261+
return err;
262+
}
263+
264+
param_index = at_params_valid_count_get(&m_param_list);
265+
if (param_index != modem_data->param_count) {
266+
return -EAGAIN;
267+
}
268+
269+
return err;
270+
}
271+
223272
static int modem_info_parse(const struct modem_info_data *modem_data, char *buf)
224273
{
225274
int err;
@@ -328,7 +377,11 @@ int modem_info_string_get(enum modem_info info, char *buf)
328377
return err;
329378
}
330379

331-
err = modem_info_parse(modem_data[info], recv_buf);
380+
if (info == MODEM_INFO_ICCID) {
381+
err = modem_info_parse_iccid(modem_data[info], recv_buf);
382+
} else {
383+
err = modem_info_parse(modem_data[info], recv_buf);
384+
}
332385

333386
if (err) {
334387
return err;
@@ -351,6 +404,10 @@ int modem_info_string_get(enum modem_info info, char *buf)
351404
MODEM_INFO_MAX_RESPONSE_SIZE);
352405
}
353406

407+
if (info == MODEM_INFO_ICCID) {
408+
flip_iccid_string(buf);
409+
}
410+
354411
return len <= 0 ? -ENOTSUP : len;
355412
}
356413

lib/modem_info/modem_info_json.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ static const struct lte_info modem_info_fw = {
5050
.info = MODEM_INFO_FW_VERSION,
5151
};
5252

53+
static const struct lte_info modem_info_iccid = {
54+
.info = MODEM_INFO_ICCID,
55+
};
56+
5357
static const struct lte_info *const modem_information[] = {
5458
&modem_info_band,
5559
&modem_info_mode,
@@ -58,6 +62,7 @@ static const struct lte_info *const modem_information[] = {
5862
&modem_info_ip_address,
5963
&modem_info_uicc,
6064
&modem_info_battery,
65+
&modem_info_iccid,
6166
&modem_info_fw,
6267
};
6368

0 commit comments

Comments
 (0)