目前大多数的企业及学校内部都建有Intranet。并建有内部网站实现资源共享。为了使用户及时的得知网上的最新信息,很多网站都采用了手机短信提醒的方式,但使用中国移动或中国联通的SP方式,会大大的增加企业的成本。故本文讨论的是利用GSM Modem和短信发送控件来实现的短信提醒。

首先,介绍一下笔者所使用环境。

服务器:Windows 2000 Advanced ServerIIS 5.0ASPSQL Server 2000

客户端:Windows XP Windows 2000

开发工具:Delphi6.0,APRO4.06

在建立项目之前先在Delphi6中安装APRO控件,这是笔者使用的方法,读者也可以用comm32

安装APRO如图1

 

 

装好后,新建项目。

选择ActiveX Library

 

点击OK后。保存项目命名为jksms.dpr.

新建一个自动化对象

命名为:sms点击OK.

保存单元文件,命名为:main.pas

新建方法:sendmsg

 为该方法添加参数。

ComnumberGSM Modem所在的串口号。

Phone:要发送的目的手机号码。

Msg:发送信息内容。

完成后单击刷新。

打开main.pas为该方法写程序。

以下是main.pas的程序清单:

unit main;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses

ComObj, ActiveX, jksms_TLB, StdVcl, SysUtils,windows,ADTrmEmu,

OoMisc,registry;

type

Tsms = class(TAutoObject, Isms)

protected

procedure sendmsg(comnumber: Integer; const phone, msg: WideString);

safecall;

{ Protected declarations }

end;

implementation

uses ComServ , adport;//这里需手工添加

function SEncodeMobNO(SmobNO: string): string;

//要想发送中文短信必须使用ModemPDU方式。这个函数是将手机号码进行PDU编码。

var

 TempPchar: Pchar;

 i: integer;

 Str: string;

begin

 if (copy(smobno, 1, 1) = +) then //判断是否包含国家编码

  SmobNO := copy(smobno, 2, length(smobno) - 1); //去掉手机号码中的+

 if ((length(SmobNO) mod 2) = 1) then

  SmobNO := SmobNO + F;

  TempPchar := Pchar(SmobNO); //将字符串 Char数组化

 i := 0;

 Str := ’’;

 while i < length(TempPchar) do begin

  Str := Str + TempPchar[i + 1] + TempPchar[i];

  i := i + 2;

 end;

 result := Str;

end;

function EncodeChinese(Input: WideString): string;//将信息内容进行PDU编码

var

 i: Integer;

begin

 Result := ’’;

 for i := 1 to Length(Input) do

  Result := Result + Format(%4.4X, [ord(Input[i])]);

end;

procedure Tsms.sendmsg(comnumber: Integer; const phone, msg: WideString);

//发送短信的方法

var

 apdcomport:Tapdcomport;

 r,s,s2,s3,s4,s5:string;

 cmdlong,tmp:integer;

 msgs:WideString;

begin

 apdcomport:=TApdComPort.Create(nil);//创建串口通信对象

 apdcomport.AutoOpen:=false;//关闭自动打开属性

 apdcomport.Open:=false;

 apdcomport.ComNumber:=comnumber;//设置串行通信口

 apdcomport.Baud:=19200;//设置串口波特率

 msgs:=msg;

 s:=0031000D9168 ;

 //PDU编码属性,这种方法是不需要设置短信中心号码的,因为现的手机SIM卡已经写好了

 s2:=SEncodeMobNO(phone);//对手机号码进行PDU编码

 s3:=0008A7;

 s4:=’’;

 s5:=EnCodeChinese(msgs);

 tmp:=length(s5)div 2;

 s4:=format(%X,[tmp]);

 if length(s4)<2 then

  s4:=0+s4;

 //计算PDU编码长度

 r:=s+s2+s3+s4+s5+^Z;

 cmdlong:=(length(r)-2) div 2;

 apdcomport.Open:=true;//打开串行口

 apdcomport.Output:=AT+CMGF=0#13;//设置ModemPDU模式

 delayticks(7,true);//延时

 apdcomport.Output:=AT+CMGS=+inttostr(cmdlong)+#13;//设置信息长度,这里应为PDU编码长度的1/2.

 delayticks(7,true);

 apdcomport.Output:=r;//发送短信。

 delayticks(9,true);

 apdcomport.Open:=false;

 apdcomport.Free;

end;

initialization

TAutoObjectFactory.Create(ComServer, Tsms, Class_sms,ciMultiInstance, tmApartment);

end.

以上程序编译后生成jksms.dll文件。Copyweb服务器上d:\。运行:regsvr32 d:\jksms.dll。在ASP程序中这样使用。

Set sms=Server.CreateObject("jksms.sms")

Msg="您好!测试一下好不好用!"

Phone="手机号码"

Port=Modem所在端口号

Sms.sendmsg port,phone,msg

至此,控件制作完成。此控件在笔者单位已运行半年,一切正常。