From 13a595a15e5b4c4529e6a4fcef7c599368577a2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Dragi=C4=87?= Date: Thu, 11 Sep 2014 23:14:09 +0200 Subject: [PATCH] mod_gsmopen: get device manufacturer, model and firmware version info. --- src/mod/endpoints/mod_gsmopen/gsmopen.h | 6 ++++ .../mod_gsmopen/gsmopen_protocol.cpp | 34 ++++++++++++++++++- src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp | 9 +++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen.h b/src/mod/endpoints/mod_gsmopen/gsmopen.h index 97731c676d..9b632f9654 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen.h +++ b/src/mod/endpoints/mod_gsmopen/gsmopen.h @@ -453,6 +453,12 @@ struct private_object { int requesting_operator_name; char subscriber_number[128]; int requesting_subscriber_number; + char device_mfg[128]; + int requesting_device_mfg; + char device_model[128]; + int requesting_device_model; + char device_firmware[128]; + int requesting_device_firmware; int network_creg_not_supported; char creg[128]; diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp index 5f0efb9121..0880c64854 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -330,17 +330,29 @@ int gsmopen_serial_config_AT(private_t *tech_pvt) } /* phone manufacturer */ + tech_pvt->requesting_device_mfg = 1; res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CGMI"); + tech_pvt->requesting_device_mfg = 0; if (res) { DEBUGA_GSMOPEN("AT+CGMI failed\n", GSMOPEN_P_LOG); } /* phone model */ + tech_pvt->requesting_device_model = 1; res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CGMM"); + tech_pvt->requesting_device_model = 0; if (res) { DEBUGA_GSMOPEN("AT+CGMM failed\n", GSMOPEN_P_LOG); } + /* phone firmware */ + tech_pvt->requesting_device_firmware = 1; + res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CGMR"); + tech_pvt->requesting_device_firmware = 0; + if (res) { + DEBUGA_GSMOPEN("AT+CGMR failed\n", GSMOPEN_P_LOG); + } + /* signal network registration with a +CREG unsolicited msg */ res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CREG=1"); if (res) { @@ -1682,13 +1694,33 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us } } - /* if we are requesting IMSI, put the line into the imei buffer if the line is not "OK" or "ERROR" */ + /* if we are requesting IMSI, put the line into the imsi buffer if the line is not "OK" or "ERROR" */ if (tech_pvt->requesting_imsi && at_ack == -1) { if (strlen(tech_pvt->line_array.result[i])) { /* we are reading the IMSI */ strncpy(tech_pvt->imsi, tech_pvt->line_array.result[i], sizeof(tech_pvt->imsi)); } } + /* if we are requesting device manufacturer, model or firmware version, + * put the line into the buffer if the line is not "OK" or "ERROR" */ + if (tech_pvt->requesting_device_mfg && at_ack == -1) { + if (strlen(tech_pvt->line_array.result[i])) { + strncpy(tech_pvt->device_mfg, tech_pvt->line_array.result[i], sizeof(tech_pvt->device_mfg)); + } + } + + if (tech_pvt->requesting_device_model && at_ack == -1) { + if (strlen(tech_pvt->line_array.result[i])) { + strncpy(tech_pvt->device_model, tech_pvt->line_array.result[i], sizeof(tech_pvt->device_model)); + } + } + + if (tech_pvt->requesting_device_firmware && at_ack == -1) { + if (strlen(tech_pvt->line_array.result[i])) { + strncpy(tech_pvt->device_firmware, tech_pvt->line_array.result[i], sizeof(tech_pvt->device_firmware)); + } + } + /* if we are reading an sms message from memory, put the line into the sms buffer if the line is not "OK" or "ERROR" */ if (tech_pvt->reading_sms_msg > 1 && at_ack == -1) { diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp index c9af03e3b1..4a8ed76c4f 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp @@ -2423,6 +2423,9 @@ SWITCH_STANDARD_API(gsmopen_dump_function) snprintf(value, sizeof(value) - 1, "%d", tech_pvt->running); stream->write_function(stream, "running = %s\n", value); stream->write_function(stream, "subscriber_number = %s\n", tech_pvt->subscriber_number); + stream->write_function(stream, "device_manufacturer = %s\n", tech_pvt->device_mfg); + stream->write_function(stream, "device_model = %s\n", tech_pvt->device_model); + stream->write_function(stream, "device_firmware = %s\n", tech_pvt->device_firmware); stream->write_function(stream, "operator = %s\n", tech_pvt->operator_name); stream->write_function(stream, "imei = %s\n", tech_pvt->imei); stream->write_function(stream, "imsi = %s\n", tech_pvt->imsi); @@ -2483,6 +2486,9 @@ SWITCH_STANDARD_API(gsmopen_dump_function) snprintf(value, sizeof(value) - 1, "%d", tech_pvt->running); stream->write_function(stream, "running = %s\n", value); stream->write_function(stream, "subscriber_number = %s\n", tech_pvt->subscriber_number); + stream->write_function(stream, "device_manufacturer = %s\n", tech_pvt->device_mfg); + stream->write_function(stream, "device_model = %s\n", tech_pvt->device_model); + stream->write_function(stream, "device_firmware = %s\n", tech_pvt->device_firmware); stream->write_function(stream, "operator = %s\n", tech_pvt->operator_name); stream->write_function(stream, "imei = %s\n", tech_pvt->imei); stream->write_function(stream, "imsi = %s\n", tech_pvt->imsi); @@ -2814,6 +2820,9 @@ int dump_event_full(private_t *tech_pvt, int is_alarm, int alarm_code, const cha snprintf(value, sizeof(value) - 1, "%d", tech_pvt->running); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "running", value); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "subscriber_number", tech_pvt->subscriber_number); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "device_manufacturer", tech_pvt->device_mfg); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "device_model", tech_pvt->device_model); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "device_firmware", tech_pvt->device_firmware); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "operator", tech_pvt->operator_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "imei", tech_pvt->imei); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "imsi", tech_pvt->imsi);