diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen.h b/src/mod/endpoints/mod_gsmopen/gsmopen.h index f56866a587..6ba413e3b1 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen.h +++ b/src/mod/endpoints/mod_gsmopen/gsmopen.h @@ -449,6 +449,8 @@ struct private_object { int requesting_imei; char imsi[128]; int requesting_imsi; + char operator_name[128]; + int requesting_operator_name; 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 12b6903e94..7533e40a5b 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -358,6 +358,15 @@ int gsmopen_serial_config_AT(private_t *tech_pvt) if (res) { DEBUGA_GSMOPEN("AT+CSQ failed\n", GSMOPEN_P_LOG); } + + /* operator name */ + tech_pvt->requesting_operator_name = 1; + res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+COPS?"); + tech_pvt->requesting_operator_name = 0; + if (res) { + DEBUGA_GSMOPEN("AT+COPS? failed\n", GSMOPEN_P_LOG); + } + /* IMEI */ tech_pvt->requesting_imei = 1; res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+GSN"); @@ -1006,6 +1015,23 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us } + if ((strncmp(tech_pvt->line_array.result[i], "+COPS:", 6) == 0)) { + int mode, format, rat, err; + char oper[128] = ""; + mode = format = rat = err = 0; + + err = sscanf(&tech_pvt->line_array.result[i][6], "%d,%d,%*[\"]%[^\"]%*[\"],%d", &mode, &format, &oper, &rat); + if (err < 3) { + DEBUGA_GSMOPEN("|%s| is not formatted as: |+COPS: xx,yy,ssss,nn|\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]); + } else if (option_debug > 1) { + DEBUGA_GSMOPEN("|%s| +COPS: : Mode %d, Format %d, Operator %s, Rat %d\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i], mode, format, oper, rat); + } + + /* if we are requesting the operator name, copy it over */ + if (tech_pvt->requesting_operator_name) + strncpy(tech_pvt->operator_name, oper, sizeof(tech_pvt->operator_name)); + } + if ((strncmp(tech_pvt->line_array.result[i], "+CMGW:", 6) == 0)) { int err; diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp index a92303351a..73478826e7 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp @@ -2422,6 +2422,7 @@ SWITCH_STANDARD_API(gsmopen_dump_function) stream->write_function(stream, "got_signal = %s\n", value); snprintf(value, sizeof(value) - 1, "%d", tech_pvt->running); stream->write_function(stream, "running = %s\n", value); + 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); snprintf(value, sizeof(value) - 1, "%d", tech_pvt->controldev_dead); @@ -2480,6 +2481,7 @@ SWITCH_STANDARD_API(gsmopen_dump_function) stream->write_function(stream, "got_signal = %s\n", value); snprintf(value, sizeof(value) - 1, "%d", tech_pvt->running); stream->write_function(stream, "running = %s\n", value); + 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); snprintf(value, sizeof(value) - 1, "%d", tech_pvt->controldev_dead); @@ -2809,6 +2811,7 @@ int dump_event_full(private_t *tech_pvt, int is_alarm, int alarm_code, const cha switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "got_signal", value); 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, "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); snprintf(value, sizeof(value) - 1, "%d", tech_pvt->controldev_dead);