CMPP3.0短信接口開發


背景: 原來接觸的短信接口一般都是提供WebService協議或者http請求。前段時間緊急長線的過程中,一個同事負責的CMPP3.0協議聯調不通,拿過來看了下,

總結了幾個關鍵點:

 

1、CMPP主要是通過往服務器發送socket請求。發送請求前要建立連接,其中包括長連接和短連接,長連接需要用定時任務做心跳來保持。

2、短信廠家要提供幾個關鍵參數:如

#網關IP地址
ismgIp=1.1.1.1
#訪問短信網關需要的密碼
sharedSecret=222222
#由短信網關分配的SPID等同於登錄賬號
spId=928***
#短信網關端口,根據使用的CMPP協議不同而不同,如cmpp3.0長鏈接的端口為8666
ismgPort=7***
#由短信網關分配的SPCODE,即用戶接受到的短信顯示的主叫號碼,短號碼段spChannel
spCode=1065****
#企業代碼
serviceId=****
#SOCKET超時鏈接時間,可根據需求自由修改,建議6000,單位為毫秒
timeOut=60000
#SOCKET鏈接失敗重試次數,及短信發送失敗重新發送的次數
connectCount=3

3、開發代碼網上都可以下載到,但是其中有幾個點需要注意,由於是通過socket發送信息,短信內容的判斷,

submit.setTotalLength(12+8+1+1+1+1+10+1+32+1+1+1+1+6+2+6+17+17+21+1+32+1+1+ getWordCount(msg) +20);對中文內容要*2

public static int getWordCount(String s)
{

s = s.replaceAll("[^\\x00-\\xff]", "**");
int length = s.length();
return length;
}

4、短信每個屬性長度需要與服務器一致

public byte[] toByteArry(){
ByteArrayOutputStream bous=new ByteArrayOutputStream();
DataOutputStream dous=new DataOutputStream(bous);
try {
dous.writeInt(this.getTotalLength());
dous.writeInt(this.getCommandId());
dous.writeInt(this.getSequenceId());

dous.writeLong(this.msgId);//Msg_Id 信息標識,由SP接入的短信網關本身產生,本處填空
dous.writeByte(this.pkTotal);//Pk_total 相同Msg_Id的信息總條數
dous.writeByte(this.pkNumber);//Pk_number 相同Msg_Id的信息序號,從1開始
dous.writeByte(this.registeredDelivery);//Registered_Delivery 是否要求返回狀態確認報告
dous.writeByte(this.msgLevel);//Msg_level 信息級別
MsgUtils.writeString(dous,this.serviceId,10);//Service_Id 業務標識,是數字、字母和符號的組合。
dous.writeByte(this.feeUserType);//Fee_UserType 計費用戶類型字段 0:對目的終端MSISDN計費;1:對源終端MSISDN計費;2:對SP計費;3:表示本字段無效,對誰計費參見Fee_terminal_Id字段。
MsgUtils.writeString(dous,this.feeTerminalId,32);//Fee_terminal_Id 被計費用戶的號碼
dous.writeByte(this.feeTerminalType);//Fee_terminal_type 被計費用戶的號碼類型,0:真實號碼;1:偽碼
dous.writeByte(this.tpPId);//TP_pId
dous.writeByte(this.tpUdhi);//TP_udhi
dous.writeByte(this.msgFmt);//Msg_Fmt
MsgUtils.writeString(dous,this.msgSrc,6);//Msg_src 信息內容來源(SP_Id)
MsgUtils.writeString(dous,this.feeType,2);//FeeType 資費類別
MsgUtils.writeString(dous,this.feeCode,6);//FeeCode
MsgUtils.writeString(dous,this.valIdTime,17);//存活有效期
MsgUtils.writeString(dous,this.atTime,17);//定時發送時間
MsgUtils.writeString(dous,this.srcId,21);//Src_Id spCode
dous.writeByte(this.destUsrTl);//DestUsr_tl
MsgUtils.writeString(dous,this.destTerminalId,32);//Dest_terminal_Id
dous.writeByte(this.destTerminalType);//Dest_terminal_type 接收短信的用戶的號碼類型,0:真實號碼;1:偽碼
dous.writeByte(this.msgLength);//Msg_Length
dous.write(this.msgContent);//信息內容
MsgUtils.writeString(dous,this.linkID,20);//點播業務使用的LinkID
dous.close();
} catch (IOException e) {
logger.error("封裝短信發送二進制數組失敗。");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM