1

#define nWAP_SIN_EX    25  //单包WAP PUSH额外字节长度
  2

#define nMMS_SIN_EX    77  //单包彩信额外字节长度
  3

  4

int 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
