SMS で GPS トラッカーを管理する Android APK をコーディングしています。私のソフトウェアには、デバイスが SMS メッセージ経由で送信するすべてのアラームをデコードする特別な通知部分があります。問題は、一部の電話会社が SMS の長さに異なる制限を使用しているため、メッセージが切り捨てられてコードが失敗することです。私は 3 つの異なるローカル企業をテストしましたが、140 文字を使用する企業もあれば、70 文字を使用する企業もありました。私の質問...そのパラメータを取得する信頼できる方法はありますか? 私はすべての SDK ドキュメントを読みましたが、明らかな定数 MAX_USER_DATA_BYTES 以外にそのようなものは何も見つかりませんでした。
質問する
3448 次
1 に答える
2
これは非常に複雑な問題であり、標準とプロトコルのさまざまな部分をつなぎ合わせる必要があるため、私のようにこの問題を解決する必要がある人のために、見つけたすべての情報を投稿することにしました.
すべてのチェックは、SmsMessage 内で、またはSMS のBundle から配列getPdu()
に直接アクセスして、ビットとバイトに直接アクセスして、PDU データで直接実行する必要があります。PDU
onReceive()
BroadcastReceiver
まず、マルチパート SMS を検出するために 2 つのことを確認する必要があります。
IDH
、ビット 6の存在PDU_TYPE
- のマルチパート インジケータの存在、情報
IDH
の 2 番目のバイトUDH
マルチパート メッセージを検出した後、CSMS 識別子、パート数、およびパート インデックスをチェックして、同じマルチパートに属するメッセージを識別する必要があります。
/**
* EXAMPLE OF A PDU
*
* 07 length of SMSC info in bytes
* 91 type of address
* 551218317600 SMSC address (variable size)
* 04 PDU_TYPE to check for IDH embedded test bit 6 0=not UDH 1=has UDH
* 0B address length in nibbles, here is 11 nibbles so its 6 bytes
* 81 address type
* 1089920478F1 sender number (variable size)
* 00 TP-PID
* 08 TP-DCS
* 31105161225188 TP-SCTS timestamp
* 38 TP-UDL user data length
* [USER DATA STARTS HERE] When UDH info is embedded, starts in first
* bytes of user data
*
* EXAMPLE OF UDH for 8 bit CSMS reference (unique number, indicates
* parts belong to same message)
*
* 05 UDH length in bytes
* 00 For multipart 8 bits CSMS it is 00, for 16bits CSMS it is 08
* 03 length of header
* 48 CSMS reference number, this identify SMSs that belong
* to same multi-part
* 02 total parts of this sequence (in this case, 2 parts)
* 02 sequence number (in this case, 2 of 2)
*
*
* EXAMPLE OF UDH for 16 bit CSMS reference (unique number, indicates
* parts belong to same message)
*
* 06 UDH length in bytes
* 00 For multipart 8 bits CSMS it is 00, for 16bits CSMS it is 08
* 04 length of header
* 4823 16 bits CSMS reference number, this identify SMSs that belong
* to the same multi-part
* 02 total parts of this sequence (in this case, 2 parts)
* 01 sequence number (in this case, 1 of 2)
*
*/
// SOME HELPERS TO CHECK FOR MULTIPART INSIDE PDU
private final byte UDH_BITMASK = 0x60;
private final byte MULTIPART_8BITSEQ = 0x00;
private final byte MULTIPART_16BITSEQ = 0x08;
private final int TP_ADDLENGTH_LEN=1;
private final int TP_ADDTYPE_LEN=1;
private final int TP_PID_LEN=1;
private final int TP_DCS_LEN=1;
private final int TP_SCTS_LEN=7;
private final int TP_UDL_LEN=1;
/**
* Check if this PDU message is multi part
* @param pdu
* @return
*/
private boolean isMultiPart(byte[] pdu)
{
// get length of first part+1 SMSC index to PDU type
int idx= pdu[0]+TP_ADDLENGTH_LEN;
if((pdu[idx] & UDH_BITMASK) != 0) // has UDH ??
{
// 00=length of UDH 01=type
int udataidx = getUserDataIndex(pdu);
if( (pdu[udataidx+1] == MULTIPART_8BITSEQ)
|| (pdu[udataidx+1] == MULTIPART_16BITSEQ))
return true;
}
return false;
}
/**
* Return index for user data part. Used to retrieve UDH info
* @param pdu
* @return
*/
private int getUserDataIndex(byte[] pdu)
{
// get index to ADDRESS length
int idx=pdu[0]+ TP_ADDLENGTH_LEN + TP_ADDTYPE_LEN;
// get length in nibbles
int oalength = pdu[idx];
// convert to bytes with padding for odd values
int oalengthinbytes = (oalength + 1) / 2;
return(idx + TP_ADDLENGTH_LEN + TP_ADDTYPE_LEN + oalengthinbytes +
TP_PID_LEN + TP_DCS_LEN + TP_SCTS_LEN + TP_UDL_LEN);
}
于 2013-01-16T14:50:48.200 に答える