OOB簡訊概述
OOB(Out-Of-Bound)簡訊,相對於行動裝置 App的實際業務通道而言,也稱為帶外簡訊;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);// UDHLbuffer.appendByte((byte) 0x05);// IEIbuffer.appendByte((byte) 0x04);// IELbuffer.appendByte((byte) 0x15);// IED 5499,改為同時相容iPhone和Androidbuffer.appendByte((byte) 0x7b);// IEDbuffer.appendByte((byte) 0x15);// IED 5499,改為同時相容iPhone和Androidbuffer.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)的值相同。
SMSC監控台-OOB簡訊
SMSC監控台-正常簡訊
Android應用接收OOB簡訊