| Hi folks, I'm working on improving the AT driver again, the project which brought me to kannels 11 years ago (time goes fast) The attached patch does add a new status information to the status page which includes things like IMSI, Card ID, MSISDN (if available) etc. This is very useful if you use USB adapters which change their naming based on where they are plugged or when they are plugged or when you dont know which port name matches which physical port. So instead of seeing a line on http://localhost:1234t/status port14[port14] AT2[port14] (online 1s, rcvd: sms 0 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), sent: sms 0 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), failed 0, queued 0 msgs) You will see something liek this: port14[port14] AT2[port14] (online 24s, rcvd: sms 0 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), sent: sms 0 (0.00,0.00,0.00) / dlr 0 (0.00,0.00,0.00), failed 0, queued 0 msgs) CurrentOperator: 22802 Signal: 17 CardNumber: 89410212614001299889 Device: /dev/cu.usbserial-001412FAC Before committing this it to SVN, I would like to have a few guys test this with other modem types (in my case I used Wavecom's) to see if its properly working there too. |
Index: gw/smscconn_p.h
===================================================================
--- gw/smscconn_p.h (revision 4979)
+++ gw/smscconn_p.h (working copy)
@@ -244,6 +244,7 @@
void *data; /* SMSC specific stuff */
+ Octstr *smsc_specific_status;
};
/*
Index: gw/smscconn.c
===================================================================
--- gw/smscconn.c (revision 4979)
+++ gw/smscconn.c (working copy)
@@ -175,6 +175,7 @@
conn->sent_dlr = counter_create();
conn->failed = counter_create();
conn->flow_mutex = mutex_create();
+ conn->smsc_specific_status = octstr_imm("");
conn->outgoing_sms_load = load_create();
/* add 60,300,-1 entries */
Index: gw/bb_smscconn.c
===================================================================
--- gw/bb_smscconn.c (revision 4979)
+++ gw/bb_smscconn.c (working copy)
@@ -93,6 +93,9 @@
#include "smscconn_p.h" /* to access counters */
#include "smsc/smpp_pdu.h" /* access smpp_pdu_init/smpp_pdu_shutdown */
+#ifndef O_DESTROY
+#define O_DESTROY(a) { if(a) octstr_destroy(a); a = NULL; }
+#endif
/* passed from bearerbox core */
@@ -1129,7 +1132,7 @@
float outgoing_sms_load_0, outgoing_sms_load_1, outgoing_sms_load_2;
float incoming_dlr_load_0, incoming_dlr_load_1, incoming_dlr_load_2;
float outgoing_dlr_load_0, outgoing_dlr_load_1, outgoing_dlr_load_2;
-
+
if ((lb = bb_status_linebreak(status_type)) == NULL)
return octstr_create("Un-supported format");
@@ -1151,6 +1154,7 @@
gw_rwlock_rdlock(&smsc_list_lock);
for (i = 0; i < gwlist_len(smsc_list); i++) {
+
incoming_sms_load_0 = incoming_sms_load_1 = incoming_sms_load_2 = 0.0;
outgoing_sms_load_0 = outgoing_sms_load_1 = outgoing_sms_load_2 = 0.0;
incoming_dlr_load_0 = incoming_dlr_load_1 = incoming_dlr_load_2 = 0.0;
@@ -1168,8 +1172,14 @@
conn_id = conn ? smscconn_id(conn) : octstr_imm("unknown");
conn_id = conn_id ? conn_id : octstr_imm("unknown");
conn_admin_id = conn ? smscconn_admin_id(conn) : octstr_imm("unknown");
- conn_admin_id = conn_admin_id ? conn_admin_id : octstr_imm("unknown");
+ conn_admin_id = conn_admin_id ? conn_admin_id : octstr_imm("unknown");
conn_name = conn ? smscconn_name(conn) : octstr_imm("unknown");
+ Octstr *conn_smsc_specific = NULL;
+ if(conn) {
+ if (conn->smsc_specific_status) {
+ conn_smsc_specific =
octstr_duplicate(conn->smsc_specific_status);
+ }
+ }
if (status_type == BBSTATUS_HTML) {
octstr_append_cstr(tmp, " <b>");
@@ -1243,17 +1253,19 @@
"\t\t\t<inbound>%.2f,%.2f,%.2f</inbound>\n"
"\t\t\t<outbound>%.2f,%.2f,%.2f</outbound>\n"
"\t\t</dlr>\n"
+ "\t\t<smsc-specific>%s</smsc-specific>\n"
"\t</smsc>\n", tmp3,
info.failed, info.queued, info.received, info.sent,
incoming_sms_load_0, incoming_sms_load_1, incoming_sms_load_2,
outgoing_sms_load_0, outgoing_sms_load_1, outgoing_sms_load_2,
info.received_dlr, info.sent_dlr,
incoming_dlr_load_0, incoming_dlr_load_1, incoming_dlr_load_2,
- outgoing_dlr_load_0, outgoing_dlr_load_1, outgoing_dlr_load_2);
+ outgoing_dlr_load_0, outgoing_dlr_load_1, outgoing_dlr_load_2,
+ (conn_smsc_specific ? octstr_get_cstr(conn_smsc_specific):
""));
else
octstr_format_append(tmp, " (%s, rcvd: sms %ld (%.2f,%.2f,%.2f) /
dlr %ld (%.2f,%.2f,%.2f), "
"sent: sms %ld (%.2f,%.2f,%.2f) / dlr %ld (%.2f,%.2f,%.2f),
failed %ld, "
- "queued %ld msgs)%s",
+ "queued %ld msgs) %s",
tmp3,
info.received,
incoming_sms_load_0, incoming_sms_load_1, incoming_sms_load_2,
@@ -1266,11 +1278,13 @@
info.failed,
info.queued,
lb);
+ if(octstr_len(conn_smsc_specific)>0) {
+
octstr_format_append(tmp," %s%s",
+ octstr_get_cstr(conn_smsc_specific),lb);
+ }
+ O_DESTROY(conn_smsc_specific);
}
-
-
-
gw_rwlock_unlock(&smsc_list_lock);
if (para)
Index: gw/smsc/smsc_at.h
===================================================================
--- gw/smsc/smsc_at.h (revision 4979)
+++ gw/smsc/smsc_at.h (working copy)
@@ -152,6 +152,13 @@
int is_serial; /* false if device is rawtcp */
int use_telnet; /* use telnet escape sequences */
Load *load;
+ int rssi;
+ int ber;
+ int registration_status;
+ Octstr *current_operator;
+ Octstr *cardnumber;
+ Octstr *imsi;
+ Octstr *msisdn;
} PrivAT2data;
Index: gw/smsc/smsc_at.c
===================================================================
--- gw/smsc/smsc_at.c (revision 4979)
+++ gw/smsc/smsc_at.c (working copy)
@@ -99,6 +99,7 @@
static Octstr *gsm2number(Octstr *pdu);
static unsigned char nibble2hex(unsigned char b);
+static void at2_update_status(PrivAT2data *privdata);
static void at2_scan_for_telnet_escapes(PrivAT2data *privdata)
{
@@ -361,7 +362,7 @@
end_time = time(NULL) + timeout;
if (privdata->lines != NULL)
- octstr_destroy(privdata->lines);
+ O_DESTROY(privdata->lines);
privdata->lines = octstr_create("");
while (time(&cur_time) <= end_time) {
line = at2_read_line(privdata, gt_flag, timeout);
@@ -669,6 +670,20 @@
}
}
}
+
+ /* we enable some additional info if available. If this fails, no biggie */
+ at2_flush_buffer(privdata);
+
+ at2_write_line(privdata, "AT+CIMI");
+ O_DESTROY( privdata->imsi);
+ privdata->imsi = at2_wait_line(privdata, 5, 0);
+ at2_wait_modem_command(privdata, 5, 0, NULL);
+ at2_flush_buffer(privdata);
+
+ ret = at2_send_modem_command(privdata, "AT+CREG=1", 5, 0);
+ ret = at2_send_modem_command(privdata, "AT+CCID?", 5, 0);
+ ret = at2_send_modem_command(privdata, "AT+CNUM", 5, 0);
+
/*
* Set the GSM SMS message center address if supplied
*/
@@ -764,6 +779,7 @@
Octstr *pdu = NULL;
Octstr *smsc_number = NULL;
int ret;
+ int register_check_count = 0;
time_t end_time;
time_t cur_time;
Msg *msg;
@@ -775,7 +791,7 @@
end_time = time(NULL) + timeout;
if (privdata->lines != NULL)
- octstr_destroy(privdata->lines);
+ O_DESTROY(privdata->lines);
privdata->lines = octstr_create("");
smsc_number = octstr_create("");
@@ -825,7 +841,49 @@
ret = 1;
goto end;
}
- if (octstr_search(line, octstr_imm("+CMTI:"), 0) != -1 ||
+ if (octstr_search(line, octstr_imm("+CCID:"), 0) != -1)
{
+ /* we received an indication of the card identification number
*/
+ char card_number[256] = "";
+ if (sscanf(octstr_get_cstr(line), "+CCID: \"%s\"",
&card_number) == 1) {
+ O_DESTROY(privdata->cardnumber);
+ privdata->cardnumber = octstr_create(card_number);
+ }
+ continue;
+ }
+ if (octstr_search(line, octstr_imm("+CSQ:"), 0) != -1) {
+ /* we received an indication of signal strength */
+ int rssi = -1;
+ int ber = -1;
+ const char *cline = octstr_get_cstr(line);
+ sscanf(cline, "+CSQ: %d,%d", &rssi,&ber);
+ if(rssi >= 0)
+ privdata->rssi = rssi;
+ if(ber >= 0)
+ privdata->ber = ber;
+ at2_update_status(privdata);
+ continue;
+ }
+ if (octstr_search(line, octstr_imm("+CNUM"), 0) != -1) {
+ const char *cline = octstr_get_cstr(line);
+ char dummy[256];
+ char number[256];
+ sscanf(cline, "+CNUM: %s,%s,%s",dummy,number,dummy);
+ O_DESTROY(privdata->msisdn);
+ privdata->msisdn = octstr_create(number);
+ at2_update_status(privdata);
+ }
+ if (octstr_search(line, octstr_imm("+COPS:"), 0) != -1) {
+ /* we received an indication of operator info */
+ int selection_type = -1;
+ int operator_name_format = -1;
+ char operator_code[256];
+ sscanf(octstr_get_cstr(line), "+COPS: %d,%d,%s",
&selection_type,&operator_name_format,&operator_code[0]);
+ O_DESTROY(privdata->current_operator);
+ privdata->current_operator = octstr_create(operator_code);
+ at2_update_status(privdata);
+ continue;
+ }
+ if (octstr_search(line, octstr_imm("+CMTI:"), 0) != -1
||
octstr_search(line, octstr_imm("+CDSI:"), 0) != -1) {
/*
* we received an incoming message indication
@@ -929,7 +987,6 @@
return ret;
}
-
static int at2_read_delete_message(PrivAT2data* privdata, int message_number)
{
char cmd[20];
@@ -1400,6 +1457,9 @@
reconnecting = 1;
goto reconnect;
}
+
+ at2_send_modem_command(privdata,"AT+CSQ", 5, 0);
+ at2_send_modem_command(privdata,"AT+COPS?", 5, 0);
idle_timeout = time(NULL);
}
@@ -1426,7 +1486,7 @@
at2_destroy_modem(privdata->modem);
octstr_destroy(privdata->device);
octstr_destroy(privdata->ilb);
- octstr_destroy(privdata->lines);
+ O_DESTROY(privdata->lines);
octstr_destroy(privdata->pin);
octstr_destroy(privdata->validityperiod);
octstr_destroy(privdata->my_number);
@@ -1526,7 +1586,12 @@
privdata->pending_incoming_messages = gwlist_create();
privdata->configfile = cfg_get_configfile(cfg);
-
+ privdata->rssi = -1;
+ privdata->ber = -1;
+ privdata->current_operator = NULL;
+ privdata->imsi=NULL;
+ privdata->cardnumber=NULL;
+ privdata->msisdn=NULL;
privdata->device = cfg_get(cfg, octstr_imm("device"));
if (privdata->device == NULL) {
error(0, "AT2[-]: 'device' missing in at2 configuration.");
@@ -2846,7 +2911,7 @@
modem->keepalive_cmd = cfg_get(grp, octstr_imm("keepalive-cmd"));
if (modem->keepalive_cmd == NULL)
modem->keepalive_cmd = octstr_create("AT");
-
+
modem->message_storage = cfg_get(grp, octstr_imm("message-storage"));
if (cfg_get_integer(&modem->message_start, grp,
octstr_imm("message-start")))
modem->message_start = 1;
@@ -3431,3 +3496,20 @@
}
}
+void at2_update_status(PrivAT2data *privdata)
+{
+ Octstr *old = privdata->conn->smsc_specific_status;
+ privdata->conn->smsc_specific_status = octstr_format("CurrentOperator:
%s",(privdata->current_operator ?
octstr_get_cstr(privdata->current_operator):""));
+ if(privdata->rssi>=0)
+ octstr_format_append(privdata->conn->smsc_specific_status,"
Signal: %d",privdata->rssi);
+ if(octstr_len(privdata->imsi)>0)
+ octstr_format_append(privdata->conn->smsc_specific_status,"
IMSI: %s",octstr_get_cstr(privdata->imsi));
+ if(octstr_len(privdata->cardnumber)>0)
+ octstr_format_append(privdata->conn->smsc_specific_status,"
CardNumber: %s",octstr_get_cstr(privdata->cardnumber));
+ octstr_format_append(privdata->conn->smsc_specific_status," Device:
%s",octstr_get_cstr(privdata->device));
+ if(privdata->msisdn)
+ octstr_format_append(privdata->conn->smsc_specific_status,"
MSISDN: %s",octstr_get_cstr(privdata->msisdn));
+
+ if(old)
+ octstr_destroy(old);
+}
sh-3.2#
Also in my setup delivery reports don't work but i have not figured out why yet. Looks like the modems never give them back to me. Anybody seen this working in his setup? Andreas Fink |
