]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
mod_gsmopen: add AT+COPS support to get operator name.
authorDušan Dragić <dragic.dusan@gmail.com>
Thu, 11 Sep 2014 20:33:28 +0000 (22:33 +0200)
committerDušan Dragić <dragic.dusan@gmail.com>
Thu, 11 Sep 2014 20:33:28 +0000 (22:33 +0200)
For now expose the info in gsmopen_dump and events.

src/mod/endpoints/mod_gsmopen/gsmopen.h
src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp
src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp

index f56866a587a95c6075042ccb361a1b8e3c2a14d5..6ba413e3b1cc987244a465ec5459f06a385f472a 100644 (file)
@@ -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];
 
index 12b6903e94e5e8737a8a78e342177b68bf2b6c7c..7533e40a5ba4f7ef635af933002bd9577233d178 100644 (file)
@@ -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;
 
index a92303351a79ff5075073aca716298564fec22f6..73478826e7f049f2113f5dea1fbd29a90ea8d7c6 100644 (file)
@@ -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);