每个短信都有一个TP-Protocol-Identifier字段,只要设置为0×40就相当于告知接收手机忽略此短信,所以目标手机会正常接收到这条短信,但是之后既不会提示也不会保存这条短信,只是简单的丢弃掉。每个短信还有一个TP-Data-Coding-Scheme字段,如果把首字节设为0xC0,接收手机同样会忽略此短信。
我们只要在发短信之前,把对应的字段做好设置,发出的就是Silent SMS了。这两个字段可以都设置,也可以只设置一个。偶尔会碰到运营商过滤特殊格式短信的情况,这时候就需要具体试一下到底哪个有效。我自己到目前为止没遇到过滤的情况。
主要数据结构
为了按特定时序发送Silent SMS,我们需要一个定时器。设定好时间间隔,定时器就会被定时触发,然后调用发送函数去发送一条Silent SMS。
为了按特定时序发送Silent SMS,我们需要一个定时器。设定好时间间隔,定时器就会被定时触发,然后调用发送函数去发送一条Silent SMS。
struct osmo_timer_list tick_timer_smsping;
struct {
int pid;
int dcs;
} silent_sms;
主要源代码 vty_interface.c
//新增控制台命令:silent,用于设置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;
}
发送部分的源代码:if(smscnt == MAX_SMS_Count){//开始批量发送
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;
}
用来重复发送的源代码:
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的命令行发送Silent SMS:
使用WireShark侦听发送的短信,可以看到TP-PID和TP-DCS分别是0×40,0xC0,短信内容为“testing 1 2 3”:
评论