1. 程式人生 > >CMPP傳送長簡訊,我可以實現了 CMPP2長簡訊實現(java版)

CMPP傳送長簡訊,我可以實現了 CMPP2長簡訊實現(java版)

辭職後我就在yiDong從事簡訊和群發的工作,從北京方面的專家哪裡學會了傳送簡訊,一開始只能傳送短簡訊,就是不超過140個字元,如果超過我就分割然後分成短的傳送。一直不能傳送超過140字元的。後來經過我閱讀了很多人帖子才實現,主要是看了下面的內容,然後修改了程式碼才實現的。希望能夠幫助和我一樣迷茫的朋友把。

我來說說我的實現吧:

1.以前我們可以發短簡訊的的時候的那個CMPPSubmitMessage。我們還是會用這個。我開發使用的是華為的一個簡訊開發包做的。這個包是移動給的。要做簡訊閘道器都可以叫移動提供。發簡訊用的是這個com.huawei.smproxy.CMPPSMProxy.send(CMPPSubmitMessage 
msgvo) 方法傳送的。長簡訊也是用這個傳送。

CMPPSubmitMessage 類中的幾個屬性給說明一下:

/**
   * 相同Msg_Id的資訊總條數,從1開始
   */
int pkTotal = 1;
        /**
         * Pk_number 1 
Unsigned Integer 相同Msg_Id的資訊序號,從1開始
         */
   int 
pkNumber = 1;

        /**
         * Registered_Delivery 1 
Unsigned Integer 是否要求返回狀態確認報告:
   0:不需要
   1:需要
   2:產生SMC話單
   
(該型別簡訊僅供閘道器計費使用,不傳送給目的終端)
         */
int registeredDelivery 
= 1;


        /**
         * Msg_level 1 Unsigned Integer 
資訊級別
         */
    int msgLevel = 3;
        
/**
         * Service_Id 10 Octet String 業務型別,是數字、字母和符號的組合。
         
*/
String serviceID = "XXXXX";
        
/**
         * Fee_UserType
         * 計費使用者型別欄位
    
0:對目的終端MSISDN計費;
    1:對源終端MSISDN計費;
    2:對SP計費;
    
3:表示本欄位無效,對誰計費參見Fee_terminal_Id欄位。
         */
int 
feeUserType = 2;

        /**
         * 
被計費使用者的號碼(如本位元組填空,則表示本欄位無效,對誰計費參見Fee_UserType欄位,本欄位與Fee_UserType欄位互斥)
         
*/
String feeTerminalID = "";
        
/**
         * GSM協議型別。詳細是解釋請參考GSM03.40中的9.2.3.9
         
*/
int tpPID = 0;
        /**
         * 
GSM協議型別。詳細是解釋請參考GSM03.40中的9.2.3.23,僅使用1位,右對齊
         * 
長訊息:1.短訊息是:0
         */
// int tpUDHI 
= 0;

        /**
         * 資訊格式
    0:ASCII串
    
3:簡訊寫卡操作
    4:二進位制資訊
    8:UCS2編碼
    15:含GB漢字 。。。。。
         
*/
// int msgFMT = 
8;

        /**
         * 資訊內容來源(SP_Id)
         
*/
String msgSrc = "XXXX";
        
/**
         * 資費類別
   01:對“計費使用者號碼”免費
   02:對“計費使用者號碼”按條計資訊費
   
03:對“計費使用者號碼”按包月收取資訊費
   04:對“計費使用者號碼”的資訊費封頂
   
05:對“計費使用者號碼”的收費是由SP實現
         */
String feeType = 
"01";

        /**
         * 資費程式碼(以分為單位)
         
*/
String feeCode = "0";
        /**
         
* 存活有效期,格式遵循SMPP3.3協議
         */
Date validTime = 
null;

        /**
         * 定時傳送時間,格式遵循SMPP3.3協議
         
*/
     Date atTime = null;
        /**
         * 
源號碼
    SP的服務程式碼或字首為服務程式碼的長號碼, 
    
閘道器將該號碼完整的填到SMPP協議Submit_SM訊息相應的source_addr欄位,
    
該號碼最終在使用者手機上顯示為短訊息的主叫號碼
         */
//String srcTerminalID 
= "XXXXXX";

        /**
         * 接收簡訊的MSISDN號碼
         
*/
//String[] destTerminalID = 
{"XXXXX"};

這個類中很多地方是可以不用管的,要以長簡訊要修改的有:

1.// int tpUDHI = 1; 這個要修改為1.

2 int msgFMT = 8; 
只能用UCS2編碼格式

3 將長簡訊分成好幾條短簡訊傳送。

第1,2好修改。

第3點,我這裡寫了一個實現類:

import java.util.ArrayList;
import 
java.util.List;

public class LongMessageByte {
public static 
List<byte[]> getLongByte(String message){
   List<byte[]> list = 
new ArrayList<byte[]>();
   try {
    byte[] messageUCS2;
    
messageUCS2 = message.getBytes("UnicodeBigUnmarked");
    int messageUCS2Len 
= messageUCS2.length;// 長簡訊長度
    int maxMessageLen = 140;
    if 
(messageUCS2Len > maxMessageLen) {// 長簡訊傳送
     //int tpUdhi = 1; 
//長訊息是1.短訊息是0
     //int msgFmt = 0x08;//長訊息不能用GBK
     int 
messageUCS2Count = messageUCS2Len / (maxMessageLen - 6) + 1;// 
長簡訊分為多少條傳送
     byte[] tp_udhiHead = new byte[6];
     tp_udhiHead[0] = 
0x05;
     tp_udhiHead[1] = 0x00;
     tp_udhiHead[2] = 0x03;
     
tp_udhiHead[3] = 0x0A;
     tp_udhiHead[4] = (byte) messageUCS2Count;
     
tp_udhiHead[5] = 0x01;// 預設為第一條
     for (int i = 0; i < messageUCS2Count; 
i++) {
      tp_udhiHead[5] = (byte) (i + 1);
      byte[] 
msgContent;
      if (i != messageUCS2Count - 1) {// 不為最後一條
       
msgContent=byteAdd(tp_udhiHead,
       messageUCS2, 
i*(maxMessageLen-6),
       (i+1)*(maxMessageLen-6));
       
list.add(msgContent);
      } else {
       
msgContent=byteAdd(tp_udhiHead,
       messageUCS2, i*(maxMessageLen-6), 
messageUCS2Len);
       list.add(msgContent);
      }
     }
    
}
   } catch (Exception e) {
    e.printStackTrace();
   }
   return 
list;
}

private static byte[] byteAdd(byte[] tpUdhiHead, 
byte[] messageUCS2, int i,
    int j) {
   byte[] msgb = new 
byte[j-i+6];
   System.arraycopy(tpUdhiHead,0,msgb,0,6);
   
System.arraycopy(messageUCS2,i,msgb,6,j-i);
   return 
msgb;
}
}
以前發短簡訊時是這樣的:

message = new CMPPSubmitMessage(pkTotal, pkNumber, 

               registeredDelivery, msgLevel, serviceID, feeUserType, 

               feeTerminalID, tpPID,0,15
msgSrc, 
               feeType, feeCode, validTime, atTime, srcTerminalID, 

               destTerminalID, msgContent.getBytes(“GBK”), 
"");

現在發第訊息時就如下發:

List<byte[]> list = 
LongMessageByte.getLongByte(msgContent);
            for(byte[] 
msg:list){

message = new CMPPSubmitMessage(pkTotal, pkNumber, 

               registeredDelivery, msgLevel, serviceID, feeUserType, 

               feeTerminalID, tpPID, 1, 
8,
 msgSrc, 
               feeType, feeCode, validTime, 
atTime, srcTerminalID, 
               destTerminalID,msg, "");


               
System.out.println(message);
                    
System.out.println(sender.getConnState());
                    returnMsg = 
sender.send(message);
                    
System.out.println(returnMsg);
            }

轉自:http://hi.baidu.com/hhayy7758/item/e7a3c7c7952d4860f6c95d53

相關推薦

CMPP傳送簡訊可以實現 CMPP2簡訊實現java

辭職後我就在yiDong從事簡訊和群發的工作,從北京方面的專家哪裡學會了傳送簡訊,一開始只能傳送短簡訊,就是不超過140個字元,如果超過我就分割然後分成短的傳送。一直不能傳送超過140字元的。後來經過我閱讀了很多人帖子才實現,主要是看了下面的內容,然後修改了程式碼才實現的

開發轉測試七年從測試策略到測試架構Test architecture

程式設計師之間流傳著這樣一句順口溜:有人喜歡創造世界,他們做了開發者;有的人喜歡開發者,他們做了測試員。什麼是軟體測試?軟體測試就是一場本該在使用者面前發生的災難提前在自己面前發生了,這會讓他們生出一種救世主的感覺,拯救了使用者,也就拯救者這個軟體,避免了他們被解除安裝的命運。  

Vue使用axios傳送post請求後端無法接收怎麼處理?Djnago後臺

      今天終於解決了一個困擾很久的問題,在使用Vue進行前端專案的搭建時,通常採用axios作為資料傳輸的工具,我們會發現,使用get請求一切都正常,但是使用post請求,會發生一些奇怪的事情。這次我使用的是python的web框架django,但道理都是一樣的,我們可

基於百度API實現圖片文字識別功能Java

1、登入百度AI開放平臺     (1)在頂部導航欄中,找到控制檯選項,並選擇文字識別功能,進入管理中心頁面        (2)在管理中心頁面中,找到建立應用按鈕並點選   (3)填寫應用名名稱和應用描述,選擇相應的應用型別,勾選自己需要的介面服

Redis 分布式鎖的正確實現方式 Java

想要 uda 就是 tex implement 代碼實現 key eval() attach 前言 分布式鎖一般有三種實現方式:1. 數據庫樂觀鎖;2. 基於Redis的分布式鎖;3. 基於ZooKeeper的分布式鎖。本篇博客將介紹第二種方式,基於Redis實現分布式鎖。

Linu實現簡單進度條小程式彩色

在實現進度條小程式之前,我們先來看兩段小程式碼 test.c #include<stdio.h> int main() { printf("hello bit\n"); sleep(3); return 0; } test1.c #include<stdio.h

SAP移庫介面實現Java

 SAP移庫介面Java程式碼實現: 移庫介面: public static Map<String, Object> storageMoveToSap(StorageTransfer storageTransfer) throws Throwable{ SapBapiIn

SAP發料介面實現Java

 發料介面原始碼如下: public Map<String, Map<Integer, Map<String, Object>>> sendOutStorageMtrReq(List<Map<String, Object>>

資料結構實現 8.1:字典樹C++

資料結構實現 8.1:字典樹(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 查詢操作 2.3 其他操作 3. 演算法複雜度分析 3.1 增加操作 3.2 查

資料結構實現 10.1:AVL樹C++

資料結構實現 10.1:AVL樹(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.1.1 左左 2.1.2 右右 2.1.3 左右 2.1.4 右左 2.1

HTML5學習第5篇—viedo:自己實現viedo的播放控制元件

      最近正在學習html5新增的媒體元素video,為了能夠更熟悉video的屬性、方法和事件,決定自己實現一下video的播放控制元件,因為是初學,只是寫了個簡版。程式碼如下: <!DOCTYPE html> <html lang="en

關於富文字編輯器—UEditorjava的使用以及如何將UEditor的檔案/圖片上傳路徑改成絕對路徑

突然發現好久沒寫部落格了,感覺變懶了,是要讓自己養成經常寫文章的習慣才行。既可以分享自己的所學,和所想,和大家一起討論,發現自己的不足的問題。 大家可能經常會用到富文字編輯器,今天我要說的是UEditor的使用,這是一個簡單易用的開源富文字編輯器。但是對於沒有用過的同學而言還是需要稍微瞭解一下的。 可能有些人

Redis 分散式鎖的正確實現方式 Java

前言 分散式鎖一般有三種實現方式:1. 資料庫樂觀鎖;2. 基於Redis的分散式鎖;3. 基於ZooKeeper的分散式鎖。本篇部落格將介紹第二種方式,基於Redis實現分散式鎖。雖然網上已經有各種介紹Redis分散式鎖實現的部落格,然而他們的實現卻有著各種各樣的問題,為

next_permutation()/prev_permutaton()的實現Java

Java裡也沒有這個東西… public class Main{ /** * 下一個排列 stl中的next_permutation() * @param nums

上升子序列模板Java

hdu1257 d[i]就是儲存到i的最大上升子序列長度 g[i]儲存長度為i的最大上升子序列的的最小編號(因為編號越小越有機會有上升子序列的機會) import java.util.Scanner;

資料結構實現 2.1:連結串列C++

1. 概念及基本框架 連結串列 是一種 線性結構 ,而且儲存上屬於 鏈式儲存(即記憶體的物理空間是不連續的),是線性表的一種。連結串列結構如下圖所示: 下面以一個我實現的一個簡單的連結串列類來進一步理解連結串列。 template <class T&g

Spark自定義累加器的實現需要注意的細節java

可以參考下面博文 !!!!!! 需要注意的是 ,原始碼中給出 也就是說兩個方法的實現是不一樣的。 下面是我的實現 import constant.Constants; import org.apache.spark.AccumulatorParam;

遞迴和迭代兩種方式實現歸併排序Java

遞迴版 package MergeSort; import Utils.SortUtils; /** * 歸併排序遞迴版 * @author liguodong */ pub

C++實現 電子郵件客戶端程式簡易

#Windows作業系統下 用命令列工具實現傳送郵件(程式設計前工作)   步驟:   1.telnet連線伺服器(以網易郵箱為例,埠號25)      2.返回220 說明連線成功   .   3.ehlo傳送使用者名稱(QQ郵箱使用者名稱預設是QQ號)     返回了一堆登入方式

微信公眾號開發《傳送訊息模板到公眾號java

具體實現過程工具類測試:(使用前需要適當修改即可) package com.shove.util; import java.io.InputStream; import java.io.OutputStream; import java.ne