请问高手.如何向手机发短消息???????????????(299分)

  • 主题发起人 主题发起人 ch_yahuu
  • 开始时间 开始时间
C

ch_yahuu

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用delphi做一个向手机发短消息的程序....
哪位高手教教我怎么做啊....
请高手写出源代码啊..
或者发邮件给我哈
Email:ch_yahuu@163.net
谢谢啊...
我五体投地的谢谢高手啊..
谢了
谢了..
....
 
用Delphi实现BP机、手机短讯
  很多人一定用过OICQ,想必也用过了它的BP机短讯、手机短讯,编程的朋友一定想

实现这种功能,如果你的程序能发到手机、发到BP机一定很酷。现在我就介绍一种可行

的方法。

  一、原理

  它不同于OICQ的双方都在网上才能进行交流的寻呼功能,它可以将文字信息发送到

真正的寻呼机上。只要你能够上网,就可以自己动手,随时随地将信息发送出去,即使

你在国外,也可以利用它来向国内的友人发送信息了,而且不用交纳国际长途费用,是

不是方便又省事呢!

  二、分析

  现在网上各寻呼台都有网上服务,网页寻呼(Web Paging)就是常用的一种。它是通过

在互联网上访问寻呼台的主页,然后由寻呼台的信息寻呼系统打传呼。所以我们只要利

用HTTP协议就可以实现网络寻呼了。以下就简单介绍一下HTTP协议: HTTP中完成一个会

话通常要完成:

  1)客户端程序与服务器建立连接

  2)发送请求

  3)服务器响应客户端

  4)关闭连接

  HTTP常用到的请求有:

   1)GET(请求一万维网页)

   2)HEAD(读取一万维网页的头部)

   3)PUT(请求一存储万维网页)

   4)POST(附加一个命名的资源)

   5)DELETE(删除万维网页)

   6)LINK(连接两个已有的资源)

   7)UNLINK(断开两个已有资源的连接)

  HTTP中常用到的应答状态代码有:(*号代表0-9间的一个数)

   1. 1** (信息)

   2. 2**(成功)

   3.4**(客户端错误)

   4.5**(服务器错误)

其实我们要实现的程序,只用POST、GET请求,收到正常应答就可以了。POST可以用于把

用户输入的数据以数据流的方式传给CGI程序,CGI通过Contect-Length环境变量来取相

应长度的数据流信息。

  POST请求格式如下:

  POST http://www2.scuta.edu.cn/stu/chatroom/check.asp HTTP/1.0

  Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,

application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword,

*/*

  Referer: http://www2.scuta.edu.cn/stu/

  Accept-Language: zh-cn

  Content-Type: application/x-www-form-urlencoded

  Proxy-Connection: Keep-Alive

  User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)

  Host: www2.scuta.edu.cn

  Content-Length: 87

  Pragma: no-cache

  Cookie: ASPSESSIONIDQGGGQHHE=ABGNNOJCIGOFCDLBIOLHKAFK

  服务器正常应答的头部结构为:

   200 OK HTTP/1.0 说明提交数据成功

  三、程序的实现

  Delphi中NMHTTP已经可以很容易的实现上面的所说的数据提交,而且它还支持Proxy

、这样对于通过代理服务器上网一样可以适用,并且它不是OICQ中发送讯信所用到

SOCKET5代理。

  新建一个窗体,加入组件一个ComboBox,命名为callto,用于存放寻呼对象,如国信

寻呼就有95908、94908、94909、98062、98063、98019、98035、98052、98038、99055

、98060、98061、98051、98003、99062、99016、99017、99018、99019、99046、99076

;加入组件Edit,命名为tonumber,表示寻呼号码;加入组件RadioGroup,命名为

RadioGroup1,Caption设为呼机类型,items中加入两项,分别为中文机、数字机;加入组

件Edit,命名为firstName,用于表示发寻呼人的姓;加入组件RadioGroup,命名为

RadioGroup2,Caption设为寻呼人性别,items中加入两项,分别为先生、小姐;加入组件

Memo,命名为callmsg,用于输入发送的信息(注:对于数字机只能是数字信息);加入组

件NMHTTP,命名为NMHTTP1;加入Checkbox,命名为ifuseproxy,用于确定是否使用代理

服务器;加入两个Edit组件,分别用于软件代理服务器地址、代理服务器端口;最后加入

命令按钮,Caption设为“发送”。

  现在以国信寻呼为例,它用GET请求就可以实现了,“发送”按钮的程序代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var callstr:string;
begin

callstr:='http://tips.gxspace.com/cgi-bin/tips/webpaging?stn_id='+callto.Text

+'&page_no='+tonumber.Text;
case RadioGroup1.ItemIndex of
0:callstr:=callstr+'&pager_type=C';
1:callstr:=callstr+'&pager_type=N';
end;
callstr:=callstr+'&firstname='+firstname.text;
case RadioGroup2.ItemIndex of
0:callstr:=callstr+'&title=0';
1:callstr:=callstr+'&title=1';
end;
callstr:=callstr+'&msg='+callmsg.Text+'&answer=null&B1=发送寻呼';
NMHTTP1.InputFileMode := FALSE;
NMHTTP1.OutputFileMode := FALSE;
NMHTTP1.ReportLevel := Status_Basic;
If ifuseproxy.Checked then
Begin
NMHTTP1.Proxy := Edit1.Text;
NMHTTP1.ProxyPort := StrToInt(Edit2.Text);
End;
NMHTTP1.Get(callstr);
end;


  有些寻呼(如润迅寻呼就不能用上面的GET请求实现,它要用POST请求),使用与上面

相差不大,如下面是NMHTTP的POST用法:

NMHTTP1.InputFileMode:=False;
NMHTTP1.OutputFileMode:=True;
NMHTTP1.ReportLevel:=Status_Basic;
If ifuseproxy.Checked then
Begin
NMHTTP1.Proxy := Edit1.Text;
NMHTTP1.ProxyPort := StrToInt(Edit2.Text);
End;
With NMHTTP1.HeaderInfo do
Begin
Cookie := Edit5.Text;
LocalMailAddress := Edit6.Text;
LocalProgram := Edit7.Text;
Referer := Edit8.Text;
UserID := Edit9.Text;
Password := Edit10.Text;
End;


// 把要提交的数据先放在test.txt文件中:格式为stnid=A&pageno=123456....

NMHTTP1.Post('http://www.wocall.com/script/zbwebcall.asp','test.txt');

file://NMHTTP的具体用法在Delphi安装目前/Borland/Delphi5/Demos/FastNet/Http下

有个NMHTTP使用的例子。

  以上都是用NMHTTP实现的,其实用Delphi中的WebBrowser组件同样可以完成数据的

提交,使用是这样的 Webbrowser1.OleObject.Document.FrontPage_Form1.submit();

  说明:WebBrowser1是WebBrowser组件的名,Frontpage_Form1是用WebBrowser打开的

网页中的表单名

  网页中的表单是这机样的:

<FORM action=http://message.com.cn/cgi-bin/ips/webpaging method=post

name=FrontPage_Form1>
.......
</FORM>


这样的实现方法就是用程序生成一个已经按用户输入信息生成一个网页,然后通过

WebBrowser1.Navigate(生成的网页),最后提交到服务器

Webbrowser1.OleObject.Document.FrontPage_Form1.submit();这样就完成了一次寻呼




手机短信息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,"%2.2X",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="0x"+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,"%4.4X",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("0x"+InputStr.SubString(i+1,4));

}

Buf[InputStr.Length()/4]=0;

return WideCharToString(Buf);

}

ChangNing(Redpower)

changning@telekbird.com.cn

2001-8-7


 
发寻呼楼上的说的没错,但发手机信息就没那么简单了。好些发手机信息的网叶都要求
COOKIE ,请问楼上怎样解决发消息前的用户注册?
 
每次post或get的时候都把收到的cookie再送出去
 
老掉牙的问题和老掉牙的回答,用“手机”搜索看看前面的帖子行不
 
用TurboPower控件,支持发送短信息!
 
手机楼上说得太简单了,如果这样个个都开发,这样那些SP是靠什么赚钱的?
主要你还要有跟移动公司数据交换的网关的协议,如果他没有提供给你、或者你跟他合作开
发的API调用,怎么把Internet上面想发送的信息通过移动公司的网关发到用户手上的手机?
 
搞了半天到底有没有谁开发出来过啊!!!!?????

这种代码网上的好象是很多但我知道的可用的没有真是奇怪,

楼上的弟兄说也有道理,人家总是要赚钱的吧?!
 
xdzhan:
您好,我一直找不到TurboPower的控件,不知道能不能告诉我一个实用的网址呀!
谢谢您了!
 
to smj_9547:
可以!告诉我你的EMail地址。
 
我的EMAIL是:smj_9547@21cn.com,谢谢您了!
 
smj_9547:老大,在google中敲入TurboPower你能找到无数下载网站
 
接受答案了.
 
我也想知道你是如何实现的?可以具体一些吗?我是新手,我已经有移动和联通的端口和协议了。谢谢!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部