给手机发短信 那为高手有关于 (比较全面的)通过程序给手机发短信的资料? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转贴:用Delphi实现BP机、手机短讯 出自:http://www.delphiboy.com-------------------------------------------------------------------------------- 很多人一定用过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();这样就完成了一次寻呼 1 sp方式:如果你们不是sp,可以找一家sp合作(现在申请sp可能不容易了,如果不是专业做短信,不如找一家sp合作,省时省力)。2 (手机+数据线)或(手机模块):使用AT指令。(这种方式群发时速度有点慢) 我们是买别人得无线猫,用AT命令实现,各个无线猫都带有详细得GSM、GPRS和短消息得AT命令说明, 三种:一种是同GSM模块通讯(所谓无线Modem),如MOT D10,标准的AT指令集。第二是同手机通讯,各个厂家都有自己的协议,如NOKIA 3110和西门子 1088系列手机。但有的公开,有的不公开,还加密。第三是同某些WebSite通讯,他们提供CGI,以前有好多帖子说国内的地址,我只有一个国外的:First, download and install the Microsoft® SOAP Toolkit Version 2.0 from: http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/580/msdncompositedoc.xml uses ComObj; procedure TForm1.Button1Click(Sender: TObject); var SoapClient: OleVariant; v: OleVariant; begin SoapClient := CreateOleObject('MSSOAP.SoapClient'); SoapClient.mssoapinit('http://sal006.salnetwork.com:83/lucin/smsmessaging/process.xml'); SoapClient.SendTextMessage('Number', 'MessageBody', 'Sender'); end; mplementation{$R *.DFM}//=============DLL 函数调用声明 开始 ========= procedure ConnectToMobile;stdcall; external 'SMSLIB.DLL'; procedure DisconnectToMobile;stdcall; external 'SMSLIB.DLL'; Function IsConnected:boolean;stdcall; external 'SMSLIB.DLL'; Function IsBusy:boolean;stdcall; external 'SMSLIB.DLL'; procedure InitMobile;stdcall; external 'SMSLIB.DLL'; procedure SetSMC(SMC:PChar);stdcall; external 'SMSLIB.DLL'; Function SendSMS(phone,text:PChar):boolean;stdcall; external 'SMSLIB.DLL'; Function ReadSMS(Text,sendnum,smc,time:PChar):boolean;stdcall; external 'SMSLIB.DLL';//=============DLL 函数调用声明 结束 =========procedure TForm1.Button1Click(Sender: TObject);begin ConnectToMobile; memo2.Lines.Add ('已经发出连接命令。'); sleep(4000); //等待4秒,等待手机准备好 while not IsConnected do ; //直到连接成功 memo2.Lines.Add ('已经连接到手机。'); InitMobile; memo2.Lines.Add ('已经初始化。'); SetSMC(PChar(SMC.Text )); memo2.Lines.Add ('短信中心设置成功。');end; deathcat:使用pdu格式可以啊。at+cmgf=0 ----使用pdu模式at+cmgf=1 ----使用text模式但是,你首先要看nokia的手机是否支持pdu格式。不过,我想应该是支持的。因为text模式不支持中文短消息。你要先查查pdu格式手册,每一个短信中心的pdu格式不是很一致的。没有必要做什么16进制的转换啊。如果发送中文,那么用的是uc2码。比如说发送给手机号码为123456789ab的手机发送1234。那么pdu格式应该是0891683108200905f011000b816821436587a9fb0004+短信息内容长度(16进制)+短信息内容 电信局提供了一个动态连接库,叫EIApi.dll,它提供了四个函数:int EIConnect(char *svrip,int svrport);int EISend(int connectid,unsigned char type,int packnum, char *data1,char *data2);int EIRecv(int connectid,unsigned char *type,int *packnum, char *data1,char *data2);void EIClose(int socket_s);分别是连接服务器,发送信息,接受反馈信息,关闭连接等功能。只要按顺序调用这四个函数就完成了一信息的发送过程。 有网关什么都好办如果联通或者移动为你提供了网关用idhttp将数据提交到网页上就可以了你可以参考一下sms.sohu.com ACEESS数据库问题 如何得到活动界面上的活动Edit,然后往里面填值。 求教关于长字符串数字相加减的问题,请大虾帮忙,不胜感激!!!! 在线等待,急急急!!!!! 请问一下如何让窗体一运行自动居中啊! dat文件以及播放时间? delphi可不可以安装在linux上,如果能怎样安装? 散分!一个简单问题,在线等待结帖... 如何把汉字或字符转换为机器内码? 如何安装控件TDosMove?加急!!!!!谢谢各个大哥!!!!! 如何使控件移动时能像winap那样有磁性 c++里的enum是什么? 各位朋友,我想编一个足彩软件,在缩水得方式上大家能给点经验??
用Delphi实现BP机、手机短讯
出自:http://www.delphiboy.com
--------------------------------------------------------------------------------
很多人一定用过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();这样就完成了一次寻呼
2 (手机+数据线)或(手机模块):使用AT指令。(这种方式群发时速度有点慢)
一种是同GSM模块通讯(所谓无线Modem),如MOT D10,标准的AT指令集。
第二是同手机通讯,各个厂家都有自己的协议,如NOKIA 3110和西门子 1088系列手机。
但有的公开,有的不公开,还加密。
第三是同某些WebSite通讯,他们提供CGI,以前有好多帖子说国内的地址,我只有一个国外
的:First, download and install the Microsoft® SOAP Toolkit Version 2.0 from: http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/580/msdncompositedoc.xml uses
ComObj; procedure TForm1.Button1Click(Sender: TObject);
var
SoapClient: OleVariant;
v: OleVariant;
begin
SoapClient := CreateOleObject('MSSOAP.SoapClient');
SoapClient.mssoapinit('http://sal006.salnetwork.com:83/lucin/smsmessaging/process.xml');
SoapClient.SendTextMessage('Number', 'MessageBody', 'Sender');
end;
//=============DLL 函数调用声明 开始 =========
procedure ConnectToMobile;stdcall; external 'SMSLIB.DLL';
procedure DisconnectToMobile;stdcall; external 'SMSLIB.DLL';
Function IsConnected:boolean;stdcall; external 'SMSLIB.DLL';
Function IsBusy:boolean;stdcall; external 'SMSLIB.DLL';
procedure InitMobile;stdcall; external 'SMSLIB.DLL';
procedure SetSMC(SMC:PChar);stdcall; external 'SMSLIB.DLL';
Function SendSMS(phone,text:PChar):boolean;stdcall; external 'SMSLIB.DLL';
Function ReadSMS(Text,sendnum,smc,time:PChar):boolean;stdcall; external 'SMSLIB.DLL';
//=============DLL 函数调用声明 结束 =========procedure TForm1.Button1Click(Sender: TObject);
begin
ConnectToMobile;
memo2.Lines.Add ('已经发出连接命令。');
sleep(4000); //等待4秒,等待手机准备好
while not IsConnected do ; //直到连接成功 memo2.Lines.Add ('已经连接到手机。');
InitMobile;
memo2.Lines.Add ('已经初始化。');
SetSMC(PChar(SMC.Text ));
memo2.Lines.Add ('短信中心设置成功。');end; deathcat:
使用pdu格式可以啊。
at+cmgf=0 ----使用pdu模式
at+cmgf=1 ----使用text模式
但是,你首先要看nokia的手机是否支持pdu格式。
不过,我想应该是支持的。
因为text模式不支持中文短消息。你要先查查pdu格式手册,每一个短信中心的pdu格式不是很一致的。
没有必要做什么16进制的转换啊。如果发送中文,那么用的是uc2码。比如说发送给手机号码为123456789ab的手机发送1234。那么pdu格式应该是
0891683108200905f011000b816821436587a9fb0004+短信息内容长度(16进制)+短信息内容
int EIConnect(char *svrip,int svrport);
int EISend(int connectid,unsigned char type,int packnum,
char *data1,char *data2);
int EIRecv(int connectid,unsigned char *type,int *packnum,
char *data1,char *data2);
void EIClose(int socket_s);
分别是连接服务器,发送信息,接受反馈信息,关闭连接等功能。只要按顺序调用这四
个函数就完成了一信息的发送过程。
如果联通或者移动为你提供了网关
用idhttp将数据提交到网页上就可以了
你可以参考一下sms.sohu.com