????????每個短信都有一個TP-Protocol-Identifier字段,只要設(shè)置為0×40就相當(dāng)于告知接收手機(jī)忽略此短信,所以目標(biāo)手機(jī)會正常接收到這條短信,但是之后既不會提示也不會保存這條短信,只是簡單的丟棄掉。每個短信還有一個TP-Data-Coding-Scheme字段,如果把首字節(jié)設(shè)為0xC0,接收手機(jī)同樣會忽略此短信。
????????我們只要在發(fā)短信之前,把對應(yīng)的字段做好設(shè)置,發(fā)出的就是Silent SMS了。這兩個字段可以都設(shè)置,也可以只設(shè)置一個。偶爾會碰到運(yùn)營商過濾特殊格式短信的情況,這時候就需要具體試一下到底哪個有效。我自己到目前為止沒遇到過濾的情況。
????????主要數(shù)據(jù)結(jié)構(gòu)
????????為了按特定時序發(fā)送Silent SMS,我們需要一個定時器。設(shè)定好時間間隔,定時器就會被定時觸發(fā),然后調(diào)用發(fā)送函數(shù)去發(fā)送一條Silent SMS。
????????為了按特定時序發(fā)送Silent SMS,我們需要一個定時器。設(shè)定好時間間隔,定時器就會被定時觸發(fā),然后調(diào)用發(fā)送函數(shù)去發(fā)送一條Silent SMS。
struct osmo_timer_list tick_timer_smsping;
struct {
int pid;
int dcs;
} silent_sms;
主要源代碼?vty_interface.c
//新增控制臺命令:silent,用于設(shè)置TP-PID和TP-DCS
DEFUN(silent, silent_cmd, "silent TP-PID TP-DCS",
"Set SMS messages header\n"
"1 for 0x40, 0 for default\n"
"1 for 0xC0, 0 for default\n")
{
int pid;
int dcs;
if (argc >= 1) {
pid = atoi(argv[0]);
dcs = atoi(argv[1]);
if (pid) {
silent_sms.pid = 1;
} else {
silent_sms.pid = 0;
}
if (dcs) {
silent_sms.dcs = 1;
} else {
silent_sms.dcs = 0;
}
}
return CMD_SUCCESS;
}
發(fā)送部分的源代碼:if(smscnt == MAX_SMS_Count){//開始批量發(fā)送
tick_timer_smsping.cb = &sms_ping; //初始化定時器
tick_timer_smsping.data = &timer_step;
smscnt--;
ping_sms_sca = strdup(sms_sca);
ping_number = strdup(number);
ping_sms_txt = strdup(argv_concat(argv, argc, 2));
call_vty = vty;
sms_send(ms, sms_sca, number, argv_concat(argv, argc, 2));
vty_out(vty, "Slient SMS %d sent%s", smscnt, VTY_NEWLINE);
}
gsm411_sms.c
struct gsm_sms *sms_from_text(const char *receiver, int dcs, const char *text)
{
struct gsm_sms *sms = sms_alloc();
if (!sms)
return NULL;
strncpy(sms->text, text, sizeof(sms->text)-1);
sms->reply_path_req = 0;
sms->status_rep_req = 0;
sms->ud_hdr_ind = 0;
if (silent_sms.pid)
sms->protocol_id = 0x40; /* type 0 */
else
sms->protocol_id = 0; /* implicit */
if (silent_sms.dcs)
sms->data_coding_scheme = 0xC0;
else
sms->data_coding_scheme = dcs;
strncpy(sms->address, receiver, sizeof(sms->address)-1);
/* Generate user_data */
sms->user_data_len = gsm_7bit_encode(sms->user_data, sms->text);
return sms;
}
用來重復(fù)發(fā)送的源代碼:
void sms_ping(void *data)
{
struct osmocom_ms *ms;
ms = get_ms("1", call_vty);
vty_notify(ms, "ping sent");
if(smscnt == 0){
return 0;
}
sms_send(ms, ping_sms_sca, ping_number, ping_sms_txt);
smscnt--;
return 0;
}
static int gsm411_sms_report(struct osmocom_ms *ms, struct gsm_sms *sms,
uint8_t cause)
{
vty_notify(ms, NULL);
if (!cause){
vty_notify(ms, "SMS %d to %s successfull\n", smscnt, sms->address);
if(smscnt != 0)
osmo_timer_schedule(&tick_timer_smsping, 10, 0);//定時間隔10秒
}else
vty_notify(ms, "SMS to %s failed: %s\n", sms->address,
get_value_string(gsm411_rp_cause_strs, cause));
return 0;
}
使用mobile的命令行發(fā)送Silent SMS:
????????使用WireShark偵聽發(fā)送的短信,可以看到TP-PID和TP-DCS分別是0×40,0xC0,短信內(nèi)容為“testing 1 2 3”:
電子發(fā)燒友App




















評論