随笔 - 150  文章 - 230  trackbacks - 0
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿(9)

随笔分类

随笔档案

文章档案

相册

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

  1#define nWAP_SIN_EX    25  //单包WAP PUSH额外字节长度
  2#define nMMS_SIN_EX    77  //单包彩信额外字节长度
  3
  4int CWapPush::GetMMSEncode(
  5                                          char * pSrcNum,  //源发送号码
  6                              char * pUrl,     //下载连接
  7                                          char * pSubject, //标题
  8                                      int    nMMSSize, //字节大小
  9                                          char * pOut1,    //输出短信二进制
 10                                          int  * nOut1Len,
 11                                          char * pOut2,    //输出短信二进制
 12                                          int  * nOut2Len,
 13                                          int  * nCount)     //几条短信
 14{
 15        * nCount=1;
 16        int  nLeftByte;        
 17        char szEncode1[350*2]={0};          //加码编码1
 18    char szEncode2[350]={0};            //加码编码2 
 19        int  nSrcNumLen = strlen(pSrcNum) ;
 20        int  nUrlLen    = strlen(pUrl);
 21        int  nTransactionID= GetTransactionID();
 22    int  nSubjectLen=strlen(pSubject);  //标题长度
 23        int  nSubject_UTF_8_Len;            //标题***UTF-8的长度
 24        char *pSubject_UTF_8 =(char *) alloca (nSubjectLen* 3 + 1 + 3 ); //new char[nSubjectLen* 3 + 1 ]={0};
 25    GB2312ToUTF_8(pSubject, nSubjectLen,pSubject_UTF_8+2); //标题***UTF-8
 26        nSubject_UTF_8_Len=strlen(pSubject_UTF_8 + 2 );
 27        pSubject_UTF_8[0]=nSubject_UTF_8_Len + 1 + 1 ;            //charset value-length 
 28    pSubject_UTF_8[1]=0xEA;
 29        nSubject_UTF_8_Len=nSubject_UTF_8_Len + 2 ;
 30
 31    if( ( nMMS_SIN_EX + nSrcNumLen + nUrlLen + nSubject_UTF_8_Len  ) > 140 )
 32        {
 33                //第一条短信息
 34                                                    // udh
 35                szEncode1[0]='0';szEncode1[1] ='B';  // "0B" User Data Header Length (11 bytes)
 36                szEncode1[2]='0';szEncode1[3] ='5';  // "05" UDH Item Element id (Port Numbers)
 37                szEncode1[4]='0';szEncode1[5] ='4';  // "04  UDH IE length (4 bytes)
 38                szEncode1[6]='0';szEncode1[7] ='B';  // "0B" 
 39                szEncode1[8]='8';szEncode1[9] ='4';  // "84" destination port number
 40                szEncode1[10]='2';szEncode1[11] ='3';// "23" 
 41                szEncode1[12]='F';szEncode1[13] ='0';// "F0"origin port number
 42                szEncode1[14]='0';szEncode1[15] ='0';// "00"concatenation identifier element
 43                szEncode1[16]='0';szEncode1[17] ='3';// "03"length of params
 44                szEncode1[18]='3';szEncode1[19] ='A';// "3A"concat reference
 45                szEncode1[20]='0';szEncode1[21] ='2';// "02"total parts
 46                szEncode1[22]='0';szEncode1[23] ='1';// "01"sequence number
 47                
 48                                             //pud += "400601AE";
 49                ByteToHexString(nTransactionID,&szEncode1[24]); //transaction id (connectionless WSP)
 50                szEncode1[26]='0';szEncode1[27] ='6';// pdu type (06=push)
 51        szEncode1[28]='2';szEncode1[29] ='2';// Headers len
 52                //application/vnd.wap.mms-message+'0'
 53                memcpy(&szEncode1[30],"6170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500",0x20 * 2 );
 54                // AF84 x-wap-application.ua
 55        szEncode1[94]='A';szEncode1[95] ='F';
 56        szEncode1[96]='8';szEncode1[97] ='4';
 57        // MMS Specific stuff
 58        szEncode1[98]='8';szEncode1[99] ='C';
 59        szEncode1[100]='8';szEncode1[101] ='2';  //8C 82 message type (m-notification.ind)
 60        szEncode1[102]='9';szEncode1[103] ='8';  //98  MMS transaction ID
 61
 62        szEncode1[104]='3';szEncode1[105] ='3'; 
 63        szEncode1[106]='4';szEncode1[107] ='6';  
 64        szEncode1[108]='3';szEncode1[109] ='6';  
 65        szEncode1[110]='3';szEncode1[111] ='6'; 
 66        szEncode1[112]='3';szEncode1[113] ='8';  
 67        szEncode1[114]='3';szEncode1[115] ='8';  
 68                szEncode1[116]='3';szEncode1[117] ='2'; 
 69            ByteToHexString(nTransactionID,&szEncode1[118]);// transaction id (connectionless WSP)
 70                szEncode1[120]='0';szEncode1[121] ='0'; 
 71
 72        szEncode1[122]='8';szEncode1[123] ='D';
 73                szEncode1[124]='9';szEncode1[125] ='0';// 8D90 MMS version 1.0
 74        szEncode1[126]='8';szEncode1[127] ='9';// FROM
 75        ByteToHexString(nSrcNumLen + 1 + 1,&szEncode1[128]); // length of from
 76        szEncode1[130]='8';szEncode1[131] ='0';              // 80 address present
 77
 78                ByteArrayToHexString(pSrcNum,nSrcNumLen,&szEncode1[132]);            //发送号码
 79        szEncode1[132+ nSrcNumLen *2 ]='0';szEncode1[133+ nSrcNumLen *2 ]='0';//00
 80
 81        szEncode1[134+ nSrcNumLen *2 ]='9';szEncode1[135+ nSrcNumLen *2 ]='6';//96 subject
 82
 83        ByteArrayToHexString(pSubject_UTF_8,nSubject_UTF_8_Len,&szEncode1[136+ nSrcNumLen *2 ]);//显示标题
 84        szEncode1[136+ (nSubject_UTF_8_Len + nSrcNumLen)*2 ]='0';szEncode1[137+  (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='0';//00
 85
 86            szEncode1[138+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[139+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='A';
 87        szEncode1[140+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[141+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='0';//Personal message class
 88        szEncode1[142+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[143+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='E';//msg size
 89        int msgByte=0;
 90                if(nMMSSize&0xFF000000)
 91                {
 92                        sprintf(&szEncode1[146+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%08X",nMMSSize);
 93                        msgByte=4;
 94                }
 95        else if(nMMSSize&0xFF0000)
 96                {
 97                        sprintf(&szEncode1[146+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%06X",nMMSSize);
 98                        msgByte=3;
 99                }
100        else if(nMMSSize&0xFF00)
101                {
102                        sprintf(&szEncode1[146+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%04X",nMMSSize);
103                        msgByte=2;
104                }
105        else if(nMMSSize&0xFF)
106                {
107                        sprintf(&szEncode1[146+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%02X",nMMSSize);
108                        msgByte=1;
109                }
110                ByteToHexString(msgByte,&szEncode1[144+ (nSubject_UTF_8_Len + nSrcNumLen) *2]); // 2 octets
111
112        szEncode1[146+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[147+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='8';//88 expiry
113        szEncode1[148+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[149+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='5';//05 expiry length
114        szEncode1[150+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[151+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='1';//81 relative format
115
116                szEncode1[152+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[153+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='3';// 3 octets
117        szEncode1[154+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[155+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='9';
118        szEncode1[156+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='3';szEncode1[157+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='A';
119        szEncode1[158+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[159+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='0';//01 51 80: 24hrs (86400 secs)
120        szEncode1[160+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[161+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='3';//83 content location
121
122                ByteArrayToHexString(pUrl, nUrlLen ,&szEncode1[162+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2]);
123                szEncode1[162+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte + nUrlLen) *2]='0';
124                szEncode1[163+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte + nUrlLen) *2]='0';
125
126            *nOut1Len=140;
127                ChangeStringToHexBuf(szEncode1, (*nOut1Len) *2  ,pOut1);
128                nLeftByte =  164 + (nUrlLen + nSubject_UTF_8_Len+nSrcNumLen +msgByte )*2  - 280;
129        
130                   //第二条短信息
131                szEncode2[0]='0';szEncode2[1] ='B';  // "0B" User Data Header Length (11 bytes)
132                szEncode2[2]='0';szEncode2[3] ='5';  // "05" UDH Item Element id (Port Numbers)
133                szEncode2[4]='0';szEncode2[5] ='4';  // "04  UDH IE length (4 bytes)
134                szEncode2[6]='0';szEncode2[7] ='B';  // "0B" 
135                szEncode2[8]='8';szEncode2[9] ='4';  // "84" destination port number
136                szEncode2[10]='2';szEncode2[11] ='3';// "23" 
137                szEncode2[12]='F';szEncode2[13] ='0';// "F0"origin port number
138                szEncode2[14]='0';szEncode2[15] ='0';// "00"concatenation identifier element
139                szEncode2[16]='0';szEncode2[17] ='3';// "03"length of params
140                szEncode2[18]='3';szEncode2[19] ='A';// "3A"concat reference
141                szEncode2[20]='0';szEncode2[21] ='2';// "02"total parts
142                szEncode2[22]='0';szEncode2[23] ='2';// "01"sequence number
143                memcpy(&szEncode2[24],&szEncode1[280],nLeftByte);
144                *nOut2Len= 12+ nLeftByte/2 ;
145                ChangeStringToHexBuf(szEncode2, (*nOut2Len )*2 ,pOut2);
146                * nCount = 2 ;        
147        }        
148        else
149        {
150        // User Data Header: udh
151                szEncode1[0]='0';szEncode1[1] ='6';  // "06" User Data Header Length (6 bytes)
152                szEncode1[2]='0';szEncode1[3] ='5';  // "05" UDH Item Element id (Port Numbers)
153                szEncode1[4]='0';szEncode1[5] ='4';  // "04  UDH IE length (4 bytes)
154                szEncode1[6]='0';szEncode1[7] ='B';  // "0B" 
155                szEncode1[8]='8';szEncode1[9] ='4';  // "84" destination port number
156                szEncode1[10]='2';szEncode1[11] ='3';// "23" 
157                szEncode1[12]='F';szEncode1[13] ='0';// "F0"origin port number
158                //WSP header:
159            ByteToHexString(nTransactionID,&szEncode1[14]);// transaction id (connectionless WSP)
160                szEncode1[16]='0';szEncode1[17] ='6';// pdu type (06=push)
161        szEncode1[18]='2';szEncode1[19] ='2';// Headers len
162                //application/vnd.wap.mms-message+'0'
163                memcpy(&szEncode1[20],"6170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500",0x20 * 2 );
164                // AF84 x-wap-application.ua
165        szEncode1[84]='A';szEncode1[85] ='F';
166        szEncode1[86]='8';szEncode1[87] ='4';
167        // MMS Specific stuff
168        szEncode1[88]='8';szEncode1[89] ='C';
169        szEncode1[90]='8';szEncode1[91] ='2';  //8C 82 message type (m-notification.ind)
170        szEncode1[92]='9';szEncode1[93] ='8';  //98  MMS transaction ID
171
172        szEncode1[94]='3';szEncode1[95] ='3'; 
173        szEncode1[96]='4';szEncode1[97] ='6';  
174        szEncode1[98]='3';szEncode1[99] ='6';  
175        szEncode1[100]='3';szEncode1[101] ='6'; 
176        szEncode1[102]='3';szEncode1[103] ='8';  
177        szEncode1[104]='3';szEncode1[105] ='8';  
178                szEncode1[106]='3';szEncode1[107] ='2'; 
179            ByteToHexString(nTransactionID,&szEncode1[108]);// transaction id (connectionless WSP)
180                szEncode1[110]='0';szEncode1[111] ='0'; 
181
182        szEncode1[112]='8';szEncode1[113] ='D';
183                szEncode1[114]='9';szEncode1[115] ='0';// 8D90 MMS version 1.0
184        szEncode1[116]='8';szEncode1[117] ='9';// FROM
185        ByteToHexString(nSrcNumLen + 1 + 1,&szEncode1[118]); // length of from
186        szEncode1[120]='8';szEncode1[121] ='0';              // 80 address present
187
188                ByteArrayToHexString(pSrcNum,nSrcNumLen,&szEncode1[122]);            //发送号码
189        szEncode1[122+ nSrcNumLen *2 ]='0';szEncode1[123+ nSrcNumLen *2 ]='0';//00
190
191        szEncode1[124+ nSrcNumLen *2 ]='9';szEncode1[125+ nSrcNumLen *2 ]='6';//96 subject
192
193        ByteArrayToHexString(pSubject_UTF_8,nSubject_UTF_8_Len,&szEncode1[126+ nSrcNumLen *2 ]);//显示标题
194        szEncode1[126+ (nSubject_UTF_8_Len + nSrcNumLen)*2 ]='0';szEncode1[127+  (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='0';//00
195
196            szEncode1[128+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[129+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='A';
197        szEncode1[130+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[131+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='0';//Personal message class
198        szEncode1[132+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[133+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='E';//msg size
199        int msgByte=0;
200                if(nMMSSize&0xFF000000)
201                {
202                        sprintf(&szEncode1[136+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%08X",nMMSSize);
203                        msgByte=4;
204                }
205        else if(nMMSSize&0xFF0000)
206                {
207                        sprintf(&szEncode1[136+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%06X",nMMSSize);
208                        msgByte=3;
209                }
210        else if(nMMSSize&0xFF00)
211                {
212                        sprintf(&szEncode1[136+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%04X",nMMSSize);
213                        msgByte=2;
214                }
215        else if(nMMSSize&0xFF)
216                {
217                        sprintf(&szEncode1[136+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%02X",nMMSSize);
218                        msgByte=1;
219                }
220                ByteToHexString(msgByte,&szEncode1[134+ (nSubject_UTF_8_Len + nSrcNumLen) *2]); // 2 octets
221        szEncode1[136+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[137+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='8';//88 expiry
222        szEncode1[138+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[139+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='5';//05 expiry length
223        szEncode1[140+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[141+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='1';//81 relative format
224                szEncode1[142+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[143+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='3';// 3 octets
225        szEncode1[144+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[145+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='9';
226        szEncode1[146+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='3';szEncode1[147+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='A';
227        szEncode1[148+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[149+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='0';//01 51 80: 24hrs (86400 secs)
228        szEncode1[150+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[151+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='3';//83 content location
229                ByteArrayToHexString(pUrl, nUrlLen ,&szEncode1[152+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2]);
230        szEncode1[152+ (nSubject_UTF_8_Len + nSrcNumLen + msgByte + nUrlLen) *2 ]='0';szEncode1[153 + (nSubject_UTF_8_Len+nSrcNumLen+msgByte+nUrlLen) *2]='0';//00结束
231                *nOut1Len= 152/2 + 1 + nSubject_UTF_8_Len + nSrcNumLen + msgByte + nUrlLen;
232                ChangeStringToHexBuf(szEncode1, (*nOut1Len) *2  ,pOut1);
233                //WriteFile("mms.txt" ,szEncode1 ,(*nOut1Len) *2);
234        }
235        return 0;
236}
237



  1BYTE ChangeAsciiToHexByte(char src_char)
  2{
  3        BYTE src_byte = ( BYTE ) src_char; 
  4
  5        BYTE result_byte = src_byte; 
  6
  7        if(  src_byte >= 0x30 
  8          && src_byte <= 0x39 ) 
  9        
 10          result_byte = src_byte - 0x30
 11          return result_byte; 
 12        }
 
 13   
 14        if(  src_byte >= 0x41 
 15          && src_byte <= 0x46 ) 
 16        
 17          result_byte = src_byte - 0x41 + 0x0a
 18        }
 
 19
 20        if(  src_byte >= 0x61 
 21          && src_byte >= 0x66 ) 
 22        
 23          result_byte = src_byte - 0x61 + 0x0a
 24        }
 
 25
 26        return result_byte; 
 27}

 28
 29char *ChangeStringToHexBuf(char *pSrc, int len, char *pResultBuf)
 30{
 31
 32        int     nLength = len/2 ;
 33    BYTE        first_byte;
 34        BYTE        second_byte; 
 35        BYTE        result_byte;
 36        forint nIndex = 0; nIndex < nLength; nIndex ++ )
 37        {                
 38                first_byte  = ChangeAsciiToHexByte(pSrc[ nIndex * 2 ] );
 39                second_byte = ChangeAsciiToHexByte(pSrc[ nIndex * 2 + 1]);
 40                result_byte = ( BYTE ) ( first_byte * 16 + second_byte );
 41                pResultBuf[ nIndex ] = result_byte;
 42        }

 43        pResultBuf[ nIndex ] = '\0';
 44        return pResultBuf;
 45}

 46
 47static char HexCode[] = 
 48{
 49      '0''1''2''3''4''5''6''7''8''9',
 50      'A''B''C''D''E''F',
 51}
;
 52char * ByteToHexString(BYTE src_byte,char *pHexCode)
 53{
 54        int n = src_byte;
 55    if  (n < 0)
 56      n = 256 + n;
 57    pHexCode[0= HexCode[n / 16];
 58    pHexCode[1= HexCode[n % 16];
 59        return pHexCode;
 60}

 61char * ByteArrayToHexString(char *pSrc,int nLen ,char *pDesc)
 62{
 63        for (int nIndex = 0 ; nIndex <nLen; nIndex ++ )
 64        {
 65                ByteToHexString( (BYTE) pSrc[nIndex] , pDesc );
 66                pDesc    = pDesc + 2;
 67        }

 68    return pDesc;
 69}

 70
 71char * UTF_8ToUnicode(char *pText,WCHAR *pOut )
 72{
 73        unsigned char* uchar = (unsigned char