谁有手机发送短信源代码? ( 积分: 60 )

  • 主题发起人 主题发起人 liqingke586
  • 开始时间 开始时间
L

liqingke586

Unregistered / Unconfirmed
GUEST, unregistred user!
谁有手机发送短信源代码?
 
谁有手机发送短信源代码?
 
手机短信息SMS开发—编码,解码

1、 英文编码
缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为7位编码。
例如:1234 编码后得到31D98C06
2进制表示
8位编码 00110001 00110010 00110011 00110100
7位编码 00110001 11011001 10001100 00000110
通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。
以下是C++Builder的实现代码:
String __stdcall EncodeEnglish(String InputStr)
{
int n,len,cur;
String tempstr,returnstr;
unsigned char mid1[2],mid2[2];
len=InputStr.Length();
n=0;
for(int i=1;i<=len;i++)
{
if (i<len)
{
strcpy(mid1,InputStr.SubString(i,1).c_str());
strcpy(mid2,InputStr.SubString(i+1,1).c_str());
cur=(mid1[0]>>n)|((mid2[0]<<(7-n))&amp
0xff);
}
else
{
strcpy(mid1,InputStr.SubString(i,1).c_str());
cur=(mid1[0]>>n)&amp
0x7f;
}
FmtStr(tempstr,&quot;%2.2X&quot;,ARRAYOFCONST((cur)));
returnstr=returnstr+tempstr;
n=(n+1)%7;
if (n==0)
i++;
}
return returnstr;
}
2、 英文解码
简单地说就是将7位字符编码转换为8为字符编码
以下是C++Builder的实现代码:
int ReturnHex(int Value)
{
switch (Value)
{
case 0:
Value=0x7f;
break;
case 1:
Value=0x3f;
break;
case 2:
Value=0x1f;
break;
case 3:
Value=0x0f;
break;
case 4:
Value=0x07;
break;
case 5:
Value=0x03;
break;
case 6:
Value=0x01;
break;
case 7:
Value=0x00;
break;
}
return Value;
}
String __stdcall DecodeEnglish (String InputStr)
{
unsigned char InStr[300];
char OutStr[300];
String str;
int j=0,i=0;
int Point=0;
int temp;
memset(InStr,0,301);
memset(OutStr,0,301);
for(int i=0;i<InputStr.Length();i=i+2)
{
str=&quot;0x&quot;+InputStr.SubString(i+1,2);
InStr[i/2]=StrToInt(str);
}
while(j<=InputStr.Length()/2)
{
if(Point==0)
OutStr=InStr[j]&amp;ReturnHex(Point);
else
OutStr=((InStr[j]&amp;ReturnHex(Point))<<Point)|(InStr[j-1]>>(8-Point));
if(Point%7==0&amp;&amp;Point!=0)
Point=0;
else
Point=Point+1;
i++;
j=i-(i/8);

}
OutStr[12]=((InStr[12]&amp;0x07)<<5)|(InStr[11]>>(8-5));
return AnsiString(OutStr);
}
3、 中文编码
中文编码较为简单,就是将GB2312的中文编码转换为代码页为CP936的Unicode编码即可
以下是C++Builder的实现代码
String EncodeChinese(String InputStr)
{
int cur;
String tempstr,returnstr;
WideString ws;
wchar_t mid[2];
ws=WideString(InputStr);
for(int i=1;i<=ws.Length();i++)
{
wcscpy(mid,ws.SubString(i,1).c_bstr());
cur=mid[0];
FmtStr(tempstr,&quot;%4.4X&quot;,ARRAYOFCONST((cur)));
returnstr=returnstr+tempstr;
}
return returnstr;
}
4、 中文解码
将代码页为CP936的Unicode编码转换为GB2312的中文编码即可

以下是C++Builder的实现代码
String DecodeChinese(String InputStr)
{
wchar_t Buf[300];
for(int i=0;i<InputStr.Length();i=i+4)
{
Buf[i/4]=StrToInt(&quot;0x&quot;+InputStr.SubString(i+1,4));
}
Buf[InputStr.Length()/4]=0;
return WideCharToString(Buf);
}
 
SMS程式开发
九十年代初,AT命令仅被用于modem操作。由于没有控制移动电话文本消息的先例,因此开发了一种叫SMS Block Mode的协议,通过终端设备(TE)或电脑来完全控制SMS。几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM研制了一整套AT命令,其中包含对SMS的控制。AT命令在此基础上演化并被加入GSM 07.05标准,以及之后的GSM 07.07标准。

对SMS的控制共有三种实现途径:
&amp;#8226
最初的Block Mode;
&amp;#8226
基于AT命令的Text Mode;
&amp;#8226
基于AT命令的PDU Mode;
到现在,PDU已取代Block Mode,后者逐渐淡出。
什么是PDU Mode?
它是发送或接收手机SMS消息的一种方法。消息正文经过十六进制编码后进行传送。
PDU命令有哪些?
基本的PDU命令是AT+CMGR,AT+CMGL,AT+CMGS。例如读取电话上全部未读过的SMS消息,最简单的办法是用AT+CMGL=0;而用AT+CMGL=4则可读取全部SMS消息,无论已读过与否。

实例:
15:38:58 TX:AT
15:39:05 TX:AT+CPMS=&quot;ME&quot;
15:39:05 RX:AT+CPMS=&quot;ME&quot;
15:39:05 RX:
+CPMS: 15,15,4,10,15,15
15:39:05 RX:
OK

15:39:07 TX:AT+CMGL=0
15:39:07 RX:AT+CMGL=0
15:39:07 RX:
+CMGL: 5,0,,52

15:39:07
RX:07914408020033F40407D0B1582C0600000030525183920028D43708
2E7FD3CB633A888E2E83EE6F399B0C32CBDF6D10B96C0FCFE9617AFAED76B95C
15:39:07 RX:
OK

使用工具对上述收到的SMS进行解码后,可得到如下的解释:
IEI: 00
LENGTH: 00
MESSAGE REF: 00
STATUS: 00
SC Address length: 07
SC Address type: 91
Type of number: International
Numbering plan identifier: E.164
SC Address: 44802000334
Message Type Indicator: 04
Message Type: SMS-DELIVER / SMS-DELIVER REPORT
More Messages To Send: No
Status Report Indication: No
Reply Path: No
Originating Address Length: 07
Originating Address type: D0
Type of number: Alphanumeric
Numbering plan identifier: Unknown
Originating Address: 1B85C260
Decoded: 1111
Protocol Identifier: Default
Data Coding Scheme: GSM Default Alphabet
SC Timestamp: 00305251839200
decoded: 00/03/25 15:38:29
Time Zone: GMT+0.00H
User Data Length: 28
decimal: 40
Message: To protect the world from devastation
于是我们知道这条SMS消息的第一部分是:
07914408020033F4
07是跟在服务中心地址内的字节数;
91是TON/NPI。TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还可有其他数值,但91最常用到。
44080200033F4是所使用的服务中心地址,由于位置上略有处理,实际号码应为:
44802000334F(字母F意指长度减1),这就是服务中心的准确地址(号码)。
下一单元是:

04

这是文件头字节(header byte, 是一种bitmask)。将每个字节设为1时,有如下含义:

10000000
回复路径(Reply Path):移动电话可循发送SMS消息的短消息中心进行回复(但并非所有SMSC都会这样设置)。

01000000
TP-UDH - 带有用户数据文件头

00100000
TP-Status-Report-Indication - 发送状态报告给发信人,表示消息收到

00010000
00001000
此两类在正常的移动终接短消息(MT,Mobile Terminated SMS)中不会使用。

00000100
TP-More Messages to Send - SMSC内再无新消息发送给该移动电话。

00000010
00000001
最后两个位数表示消息种类 - 10指是移动终接短消息(MT),01指移动起始短消息(MO,Mobile Originated SMS)。

所以&quot;04&quot;指此条消息是正常的移动终接短消息,SMSC内再无新消息发送给该手机。


my mail : jinwutongbj@yahoo.com.cn
 
谢谢各位提供的代码。
 
gyh75:
lqk586@126.com
能把源码发给我吗?十分感谢!
 

Similar threads

D
回复
0
查看
881
DelphiTeacher的专栏
D
D
回复
0
查看
851
DelphiTeacher的专栏
D
后退
顶部