delphi 短信猫(SMS)编程总结

来源:互联网 发布:淘宝卖家退款验证码 编辑:程序博客网 时间:2024/05/21 19:46

       现在有个项目需要用到发短信的功能,所以网上买了个西门子T35i 芯片的短信猫,但实际编程时才发现只能发短信,一般的DLL不支持发长短信,但公司会经常发长短信,联系卖家要求给个发长短信的动态库,但卖家说他那只有这个,长短信要收钱开发的,晕。(怀疑是故意的),然后又买了个支持长短信惠通猫(szhto.ocx、HTCOM.dll不支持线程),开始还行,但用久了不知为啥总是死机一样,发/接不了短信,并且总是有两条短信删不掉,一直留在那,找供应商都不理你,说我程序的问题,无语了,

      那么只有自己上网找了,好在支持T35i的有许多,又把旧的猫拿来研究。经过不懈努力终于OK。(哈。。。。哈。。。。),过程中接触了几个DLL和OCX,我都来评说下吧。

1、sms.dll (好象迅塞公司的),可以发长短信,但不能给10086这样的短号码发信息。

     同步发送的、它的功能也比较简单:

  function Sms_Connection(CopyRight:pchar;Com_Port,Com_BaudRate:integer;var Mobile_Type,CopyRightToCOM:PChar):integer;stdcall;external 'sms.dll';  function Sms_Send(Sms_TelNum:string;Sms_Text:string):integer;stdcall;external 'sms.dll';  Function Sms_Receive(Sms_Type:string;var Sms_Text:PChar):integer;stdcall;external 'sms.dll';  function Sms_Delete(Sms_Index:string):integer;stdcall;external 'sms.dll';  function Sms_AutoFlag :integer;stdcall;external 'sms.dll';  function Sms_NewFlag :integer;stdcall;external 'sms.dll';  function Sms_Disconnection :integer;stdcall;external 'sms.dll';

2、MonDem.dll (这个忘了是那家的了)支持多线程操作,功能也可以,但没研究出怎么发长短信,有知道的一定告之呀!

//函数说明//先初始化,然后发送或者接收,退出程序前关闭Modem{*************************************************************}//  参数: nComNo 0~255 代表COM编号,//        modemType 短信猫类型//  0 - 1口短信猫,//        1 - 2口短信猫,//        2 - 4口短信猫,//        3 - 8短信猫口//  返回: 0 - 成功, -1类型错//        XXX -错误代码,参见代码表{*************************************************************}function fnSetModemType(ComNo:integer; modemType:Smallint) :integer;stdcall; external 'MonDem.dll';{******************************************************}//获取当前短信猫类型设置//参数: nComNo 0~255 代表COM编号。//返回 :短信猫类型//0 - 1口短信猫,//1 - 2口短信猫,//2 - 4口短信猫,//3 - 8短信猫口//XXX -错误代码,参见代码表{*******************************************************}function fnGetModemType(ComNo:integer):integer;stdcall; external 'MonDem.dll';{***********************初始化函数***********************}//参数: comx 0~7 代表端口号码, -1 表示所有端口//返回: 0 - 成功  XXX -错误代码,参见代码表{********************************************************}function fnInitModem(comx:integer):integer;stdcall; external 'MonDem.dll';{***********************发送函数*************************}//参数: comx 0~7 代表端口号码, -1 表示任意一个可用端口//receivephone  接受手机号,sendmsg表示发送信息内容//sendmsg(应该在70个字符以内,包含标点符号,1个汉字算1个字符)//例如: 恭喜发财,测试成功!   长度为10//返回: 0 - 发送成功 1 - 发送失败 XXX -错误代码,参见代码表{********************************************************}function fnSendMsg(comx:integer;receivephone,sendmsg:pchar):integer;stdcall; external 'MonDem.dll';{********************************************************} // 参数: nPortNo 0~255 代表端口号码, -1 表示所有端口//返回: 端口状态,大于等于8表示设备连接正常,可以接收和发送。 //     状态小于8,表示测试状态。小于等于1,可能连线没有接好或者电源 //  没有打开,注意复位短信猫。 //    -1 端口号指定错误或者是端口未打开{********************************************************}function fnGetStatus(nPortNo:integer):integer;stdcall; external 'MonDem.dll';{*************************接收函数***********************}//参数: comx 0~7 代表端口号码,//(-1 表示任意一个可用端口,暂时不支持)//sendphone 发送方手机号码      receivemsg 接收信息内容//返回: 0~7 - 成功,接收端口号码  -1 -  无信息//XXX -错误代码,参见代码表{********************************************************}function fnReadMsgEx(comx:integer;szHeader,receivemsg:pchar):integer;stdcall; external 'MonDem.dll';function fnGetSndCount(nPortNo:integer):integer;stdcall; external 'MonDem.dll';function fnGetRecCount(nPortNo:integer):integer;stdcall; external 'MonDem.dll';//function fnSetReceive(nType:integer):integer;stdcall; external 'MonDem.dll';{************************关闭函数************************}//参数: comx 0~7 代表端口号码, -1 表示所有端口//返回: 0 - 成功  XXX -错误代码,参见代码表{********************************************************}function fnCloseModem(comx:integer):integer;stdcall; external 'MonDem.dll';{*******************错误代码表:**************************}// 100: 授权错误(检测软件狗)// 101: 授权类型错误(检测软件狗类型)// 102: 未初始化,请先初始化// 200: 端口号码错// 201: 不支持的端口// 202: 信息超长// 203: 不能发送空信息// 204: 手机号码错// 205: 设备错//5xx: 操作xx号端口错误{********************************************************}

3、SZHTO.OCX 控件,需要机器码注册,不支持10086发送,并且性能不稳定。用久了总要死回机不知为什么(大概4、5天吧!)

由于是OCX的方式,用起来还是比较方便的。

4、SMSControl.ocx  Ver5.0(LY的)控件的用起来还是比较好用的,功能也多,但需要注册购买的,支持10086等短信发送。

不用买也是可以用的,没有连接/发送等状态的返回值,只能自己设置延时处理了。

                if Smscontrol1.SendMSG(QFindSend.Fields[1].AsString,QFindSend.Fields[2].AsString)>0 then  begin                     Memo1.Lines.Add('发送成功!');                   end                 else begin                   Memo1.Lines.Add('发送失败!')                 end;


0 0
原创粉丝点击