OOB短信概述
OOB(Out-Of-Bound)短信,相對於移動應用的實際業務通道而言,也稱爲帶外短信;OOB對於終端手機來講是不可見的,終端應用可以截取該OOB短信,從而達到服務端向客戶端推送數據的目的。
該OOB短信實際上是二進制短信(Android裏的Data_SMS),Android系統收到該短信後並不會入庫也不會發送系統廣播事件,所以通過繼承ContentObserver使用觀察者模式並不能截取該OOB短信。
在Android系統中,截取二進制短信是採用Receiver方式,並配置指定的監聽端口,收取該端口的二進制短信數據、解析以及後續業務處理。
SMPP發送端設置
該發送端在VVM中是指VVMGW中的短信發送模塊,在發送該OOB短信時,需要設置以下幾個字段replace_if_present_flag、esm_class、protocol_id、data_coding,此外還需要設置UDH,該UDH用於指定OOB短信需要發送到終端的哪個端口。具體參數設置參考如下:
submitsm.setReplaceIfPresentFlag((byte) 0x01);
submitsm.setEsmClass((byte) 0x40);
submitsm.setProtocolId((byte) 0x7d);
submitsm.setDataCoding((byte) 0x04);
// 設置消息內容,設置UDH字段
ByteBuffer buffer = new ByteBuffer();
buffer.appendByte((byte) 0x06);// UDHL
buffer.appendByte((byte) 0x05);// IEI
buffer.appendByte((byte) 0x04);// IEL
buffer.appendByte((byte) 0x15);// IED 5499,改爲同時兼容iPhone和Android
buffer.appendByte((byte) 0x7b);// IED
buffer.appendByte((byte) 0x15);// IED 5499,改爲同時兼容iPhone和Android
buffer.appendByte((byte) 0x7b);// IED
Android應用客戶端設置
在Android客戶端中如果需要截取二進制短信,需要在指定的端口上進行監聽(正常情況下,接收到的二進制短信不會存到短信庫中)。
即在AndroidManifest.xml中receiver中加入過濾器爲android.intent.action.DATA_SMS_RECEIVED,並且指定監聽端口等信息,如下:
<receiver android:name=".SMSReceiver">
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.DATA_SMS_RECEIVED"/>
<data android:host="localhost" android:port="16001" android:scheme="sms"/>
</intent-filter>
</receiver>
Blackberry應用客戶端設置
在Blackberry客戶端沒有相關的配置文件,只能通過程序來指定監聽端口(正常情況下,接收到的二進制短信不會存到短信庫中)。
private static class ListeningThread extends Thread {
private boolean _stop = false;
private DatagramConnection _dc;
public synchronized void stop() {
_stop = true;
try {
_dc.close(); // Close the connection so the thread returns.
} catch (IOException e) {
System.err.println(e.toString());
}
}
public void run() {
try {
_dc = (DatagramConnection)Connector.open("sms://:5499");
for(;;) {
if ( _stop ) {
return;
}
Datagram d = _dc.newDatagram(_dc.getMaximumLength());
_dc.receive(d);
String address = new
String(d.getAddress());
String msg = new String(d.getData());
System.out.println("Message received: " + msg);
System.out.println("From: " + address);
System.exit(0);
}
} catch (IOException e) {
System.err.println(e.toString());
}
}
}
注意:該端口需要與SMPP發送短信的UDH中兩個BYTE字節的IED字段(3E81,即16001)的值相同。