首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

使用 Delphi 與 GSM Modem 打造低成本短信發送元件

     編輯:Delphi

隨著企業內部網(Intranet)的普及,透過手機簡訊即時推播最新資訊已成為常見需求。然而,採用電信業者的 SP 服務成本高昂,讓許多中小企業望而卻步。本文將詳細介紹如何利用 GSM Modem 搭配 Delphi 開發自製短信發送 ActiveX 元件,以極低成本實現簡訊提醒功能。

開發環境與工具準備

本範例採用的軟硬體環境如下:

  • 伺服器端:Windows 2000 Advanced Server、IIS 5.0、ASP、SQL Server 2000
  • 客戶端:Windows XP 或 Windows 2000
  • 開發工具:Delphi 6.0、APRO 4.06(亦可改用 Comm32)

首先在 Delphi 6 中安裝 APRO 元件套件,安裝完成後建立新專案,選擇 ActiveX Library,專案命名為 jksms.dpr。接著新增一個自動化物件,名稱為 sms,單元檔存為 main.pas。

核心方法設計:SendMsg

在型別庫編輯器中為 Tsms 介面新增 SendMsg 方法,包含三個參數:

  • ComNumber:GSM Modem 所在的序列埠號
  • Phone:接收簡訊的手機號碼
  • Msg:簡訊內容

PDU 編碼核心程式碼

為了支援中文簡訊,必須採用 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.

元件部署與 ASP 呼叫範例

編譯專案產生 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

此元件在實際生產環境穩定運行超過半年,有效解決了企業內部簡訊通知的成本難題。

APRO 元件安裝

建立 ActiveX Library 專案

新增自動化物件

新增 SendMsg 方法

設定方法參數

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved