隨著企業內部網(Intranet)的普及,透過手機簡訊即時推播最新資訊已成為常見需求。然而,採用電信業者的 SP 服務成本高昂,讓許多中小企業望而卻步。本文將詳細介紹如何利用 GSM Modem 搭配 Delphi 開發自製短信發送 ActiveX 元件,以極低成本實現簡訊提醒功能。
本範例採用的軟硬體環境如下:
首先在 Delphi 6 中安裝 APRO 元件套件,安裝完成後建立新專案,選擇 ActiveX Library,專案命名為 jksms.dpr。接著新增一個自動化物件,名稱為 sms,單元檔存為 main.pas。
在型別庫編輯器中為 Tsms 介面新增 SendMsg 方法,包含三個參數:
ComNumber:GSM Modem 所在的序列埠號Phone:接收簡訊的手機號碼Msg:簡訊內容為了支援中文簡訊,必須採用 PDU 模式發送。以下為 main.pas 完整實作,包含手機號碼與訊息內容的 PDU 編碼函式:
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;
end;
implementation
uses ComServ, AdPort; // 需手動加入
// 手機號碼 PDU 編碼
function SEncodeMobNO(SmobNO: string): string;
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);
i := 0;
Str := '';
while i < Length(TempPchar) do begin
Str := Str + TempPchar[i + 1] + TempPchar[i];
i := i + 2;
end;
Result := Str;
end;
// 中文訊息 PDU 編碼 (UCS2)
function EncodeChinese(Input: WideString): string;
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);
try
apdcomport.AutoOpen := False;
apdcomport.Open := False;
apdcomport.ComNumber := comnumber;
apdcomport.Baud := 19200;
msgs := msg;
s := '0031000D9168'; // PDU 標頭,免設定簡訊中心號碼
s2 := SEncodeMobNO(phone); // 目的號碼編碼
s3 := '0008A7'; // 編碼格式:UCS2
s5 := EnCodeChinese(msgs); // 訊息內容編碼
tmp := Length(s5) div 2;
s4 := Format('%X', [tmp]); // 訊息長度
if Length(s4) < 2 then s4 := '0' + s4;
r := s + s2 + s3 + s4 + s5 + #26; // #26 = Ctrl+Z 結束符
cmdlong := (Length(r) - 2) div 2;
apdcomport.Open := True;
apdcomport.Output := 'AT+CMGF=0' + #13; // 設定 PDU 模式
DelayTicks(7, True);
apdcomport.Output := 'AT+CMGS=' + IntToStr(cmdlong) + #13;
DelayTicks(7, True);
apdcomport.Output := r; // 發送 PDU 封包
DelayTicks(9, True);
finally
apdcomport.Open := False;
apdcomport.Free;
end;
end;
initialization
TAutoObjectFactory.Create(ComServer, Tsms, Class_sms, ciMultiInstance, tmApartment);
end.
編譯專案產生 jksms.dll,複製至 Web 伺服器(如 D:\),執行 regsvr32 d:\jksms.dll 註冊元件。ASP 頁面中即可直接呼叫:
Set sms = Server.CreateObject("jksms.sms")
Msg = "您好!測試一下好不好用!"
Phone = "09xxxxxxxx"
Port = 1 ' Modem 所在 COM 埠號
sms.sendmsg Port, Phone, Msg
此元件在實際生產環境穩定運行超過半年,有效解決了企業內部簡訊通知的成本難題。




