?? sms_pudunit.pas
字號(hào):
{ SMSPDUproc }
/// <summary>
/// 短信收發(fā)控件
/// </summary>
/// <author> agamem </author>
/// <date> 2005-7-12 </date>
unit SMS_PUDUnit;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
SPComm,
ExtCtrls,
StrUtils,
csintf;
type
/// <summary>
/// 用戶(hù)信息編碼方式
/// td7_Bit : 7-bit編碼,只能用于發(fā)送英文字符,160個(gè)字符
/// td8_Bit : 8-bit編碼,可用于發(fā)送透明數(shù)據(jù)
/// tdUCS2 : Unicode編碼,可發(fā)送中英文,限制在70個(gè)字符
/// </summary>
TTP_DCS = (td7_Bit, td8_Bit, tdUCS2);
/// <summary>
/// 短信模塊控制狀態(tài)
/// </summary>
TSMSState = (NORMAL, ATE, ATCMGF, ATCNMI, ATCMGS_1, ATCMGS_2,ATCMGR,ATCMGD);
/// <summary>
/// 數(shù)據(jù)監(jiān)視事件
/// </summary>
TSMSMonitor=procedure(Sender:TObject;RevString:string) of object;
/// <summary>
/// 接收短信通知事件
/// </summary>
TSMSRev=procedure(Sender:TObject;mSMSC,mPhoneID,mInfo:string;mGTime:TDateTime) of object;
/// <summary>
/// 短信控件
/// </summary>
TSMSPDUproc = class(TComponent)
private
/// <summary>
/// 串口控件
/// </summary>
SMScomm:TComm;
/// <summary>
/// 超時(shí)判斷計(jì)時(shí)器
/// </summary>
OTTimer:TTimer;
/// <summary>
/// PDU包信息長(zhǎng)度
/// </summary>
FCMGSLen:string;
/// <summary>
/// 用戶(hù)信息編碼模式(短消息編碼模式)
/// </summary>
FTP_DCS:TTP_DCS;
/// <summary>
/// 目標(biāo)號(hào)碼
/// </summary>
FTP_DA:string;
/// <summary>
/// 短消息中心號(hào)碼
/// </summary>
FSMSC:string;
/// <summary>
/// 透明數(shù)據(jù)短消息
/// </summary>
FTP_UDByte:array of Byte;
/// <summary>
/// 字符數(shù)據(jù)短消息
/// </summary>
FTP_UDStr:string;
/// <summary>
/// PUD包
/// </summary>
FPUDStr:string;
/// <summary>
/// 波特率
/// </summary>
FBaudRate:DWORD;
/// <summary>
/// 串口號(hào)
/// </summary>
FCommName:string;
/// <summary>
/// 數(shù)據(jù)位
/// </summary>
FByteSize:TByteSize;
/// <summary>
/// 校驗(yàn)位
/// </summary>
FParity:TParity;
/// <summary>
/// 停止位
/// </summary>
FStopBits:TStopBits;
/// <summary>
/// 激活控件
/// </summary>
FActive:Boolean;
/// <summary>
/// 當(dāng)前收到短消息的編號(hào)
/// </summary>
FCurrSMSIndex:Integer;
/// <summary>
/// 當(dāng)前短消息機(jī)的狀態(tài)
/// </summary>
CurrState:TSMSState;
/// <summary>
/// 超時(shí)/錯(cuò)誤 重發(fā)計(jì)數(shù)
/// </summary>
ReSendCount:Integer;
/// <summary>
/// 超時(shí)判斷計(jì)數(shù)
/// </summary>
tver:Integer;
/// <summary>
/// 串口接收監(jiān)視
/// </summary>
FOnRevMonitor: TSMSMonitor;
/// <summary>
/// 串口發(fā)送監(jiān)視
/// </summary>
FOnSndMonitor: TSMSMonitor;
/// <summary>
/// 接收短消息后是否刪除短消息
/// </summary>
FDelAfterRev: Boolean;
/// <summary>
/// 收到短消息事件
/// </summary>
FOnReceiveSMS: TSMSRev;
procedure setTP_DCS(const Value:TTP_DCS);
procedure setSMSC(const Value:string);
procedure setTP_DA(const Value:string);
/// <summary>
/// 獲取PUD包
/// </summary>
function getPUDStr:string;
procedure SetBaudRate(const Value:DWORD);
procedure SetByteSize(const Value:TByteSize);
procedure SetStopBits(const Value:TStopBits);
procedure SetCommName(const Value:string);
procedure SetParity(const Value:TParity);
procedure setActive(const Value:Boolean);
/// <summary>
/// 串口接收事件
/// </summary>
procedure SMSReceiveData(Sender:TObject; Buffer:Pointer;
BufferLength:Word);
/// <summary>
/// 初始化短信機(jī)
/// </summary>
procedure resetSMS();
/// <summary>
/// 數(shù)據(jù)寫(xiě)入串口
/// </summary>
procedure sendStrToComm(str:string);
/// <summary>
/// 超時(shí)計(jì)數(shù)器事件
/// </summary>
procedure OTTimerTimer(Sender:TObject);
/// <summary>
/// PDU包解碼
/// </summary>
procedure DecodePUD(s:string);
protected
public
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
/// <summary>
/// 設(shè)置發(fā)送的內(nèi)容 透明數(shù)據(jù)
/// </summary>
procedure setTP_UD(value:array of Byte); overload;
/// <summary>
/// 設(shè)置發(fā)送的內(nèi)容 字符數(shù)據(jù)
/// </summary>
procedure setTP_UD(value:string); overload;
/// <summary>
/// 發(fā)送消息
/// </summary>
procedure SendSM; overload;
/// <summary>
/// 發(fā)送消息
/// </summary>
procedure SendSM(mTP_DA,Info:string);overload;
published
/// <summary>
///用戶(hù)信息編碼方式(TP-DCS)
/// </summary>
property TP_DCS:TTP_DCS read FTP_DCS write setTP_DCS;
/// <summary>
/// SMSC地址,短消息中心號(hào)碼
/// </summary>
property SMSC:string read FSMSC write setSMSC;
/// <summary>
/// 目標(biāo)地址(TP-DA),目標(biāo)號(hào)碼
/// </summary>
property TP_DA:string read FTP_DA write setTP_DA;
/// <summary>
/// 取得PUD包
/// </summary>
property PUDStr:string read getPUDStr;
/// <summary>
/// PUD包長(zhǎng)度
/// </summary>
property CMGSLen:string read FCMGSLen;
/// <summary>
/// 串口
/// </summary>
property CommName:string read FCommName write SetCommName;
/// <summary>
/// 波特率
/// </summary>
property BaudRate:DWORD read FBaudRate write SetBaudRate;
/// <summary>
/// 數(shù)據(jù)位
/// </summary>
property ByteSize:TByteSize read FByteSize write SetByteSize;
/// <summary>
/// 校驗(yàn)
/// </summary>
property Parity:TParity read FParity write SetParity;
/// <summary>
/// 停止位
/// </summary>
property StopBits:TStopBits read FStopBits write SetStopBits;
/// <summary>
/// 激活短消息控件
/// </summary>
property Active:Boolean read FActive write setActive;
/// <summary>
/// 回收數(shù)據(jù)監(jiān)視
/// </summary>
property OnRevMonitor:TSMSMonitor read FOnRevMonitor write FOnRevMonitor;
/// <summary>
/// 發(fā)送數(shù)據(jù)監(jiān)視
/// </summary>
property OnSndMonitor:TSMSMonitor read FOnSndMonitor write FOnSndMonitor;
/// <summary>
/// 錯(cuò)誤信息
/// </summary>
property OnError:TSMSMonitor read FOnSndMonitor write FOnSndMonitor;
/// <summary>
/// 讀出短消息后刪除
/// </summary>
property DelAfterRev:Boolean read FDelAfterRev write FDelAfterRev;
/// <summary>
/// 收到短消息后觸發(fā)事件
/// </summary>
property OnReceiveSMS:TSMSRev read FOnReceiveSMS write FOnReceiveSMS;
end;
procedure Register;
implementation
{ SMSPDUproc }
/// <summary>
/// 延時(shí)
/// </summary>
/// <param name="MSecs">需要延時(shí)的毫秒</param>
procedure Delay(MSecs: Longint);
//延時(shí)函數(shù),MSecs單位為毫秒(千分之1秒)
var
FirstTickCount, Now: Longint;
begin
FirstTickCount := GetTickCount();
repeat
Application.ProcessMessages;
Now := GetTickCount();
until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;
function GB5ToUniCode(Value:WideString):string;
var
I, Len:Integer;
S:string;
begin
Result := '';
Len := Length(Value);
I := 1;
while I <= Len do
begin
FmtStr(S, '%4.4X', [ord(Value[I])]); //BCD轉(zhuǎn)換
Result := Result + S;
Inc(I);
end;
end;
//******************************************************************************
// Function/Procedure : HexToInt
// Purpose : 把十六進(jìn)制轉(zhuǎn)換成十進(jìn)制
// Inputs : 十六進(jìn)制字符
// Return : 十進(jìn)制數(shù)
//******************************************************************************
function HexToInt(HexStr:String):Integer;
begin
Result:=StrToInt('$'+HexStr);
end;
//******************************************************************************
// Function/Procedure : UniCodeToGB5
// Purpose : 把十六進(jìn)制的字符數(shù)組轉(zhuǎn)換成UNICODE字符
// Inputs : 十六進(jìn)制的字符數(shù)組
// Return : UNICODE字符
//******************************************************************************
function UniCodeToGB5(s:String):WideString;
var
P:PWord;
I,RealLen:Integer;
sStr:WideChar;
begin
New(p);
RealLen:=Length(s) div 4; //計(jì)算UNICODE真實(shí)長(zhǎng)度
for I:=0 to RealLen - 1 do begin
P^:=HexToInt(Copy(s,4*I+1,4));
Move(P^,sStr,2);
Result:=Result+sStr;
end;
Dispose(P);
end;
//******************************************************************************
// Function/Procedure : ChangeLeftAndRight
// Purpose : 將一個(gè)字符串在位置上進(jìn)行奇數(shù)位與偶數(shù)
// 位的交換,字符串長(zhǎng)度為奇數(shù)位時(shí)自動(dòng)補(bǔ)F
// Inputs : 字符串
// Return : 字符串
//******************************************************************************
function ChangeLeftAndRight(Value:string):string;
var
I:Integer;
S:Char;
begin
Result := Trim(Value);
if Length(Result) = 0 then Exit;
if Length(Result) mod 2 = 1 then Result := Result + 'F';
I := 1;
while I < Length(Result) do begin
S := Result[I];
Result[I] := Result[I + 1];
Result[I + 1] := S;
I := I + 2;
end;
end;
//******************************************************************************
// Function/Procedure : ResumeOrder
// Purpose : ChangeOrder反向操作
// Inputs : 字符串
// Return : 字符串
//******************************************************************************
function ResumeOrder(OriStr:String):String;
var
I:Integer;
sStr:String;
begin
sStr:='';
for i:=1 to (Length(OriStr) Div 2) do
sStr:=sStr+OriStr[I*2]+OriStr[I*2-1];
Result:=StringReplace(sStr,'F','',[rfReplaceAll]);
end;
function gsmEncode7bit(pSrc:string; nSrcLength:Integer):string;
var
nSrc:Integer; // 源字符串的計(jì)數(shù)值
nChar:Integer; // 當(dāng)前正在處理的組內(nèi)字符字節(jié)的序號(hào),范圍是0-7
nLeft:byte; // 上一字節(jié)殘余的數(shù)據(jù)
tmpChar:Byte;
procChar:byte;
s, pDst:string;
i:Integer;
begin
// 計(jì)數(shù)值初始化
nSrc := 0;
nLeft := 0;
// 將源串每8個(gè)字節(jié)分為一組,壓縮成7個(gè)字節(jié)
// 循環(huán)該處理過(guò)程,直至源串被處理完
// 如果分組不到8字節(jié),也能正確處理
i := 1;
pDst := '';
while (nSrc <= nSrcLength) do
begin
// 取源字符串的計(jì)數(shù)值的最低3位
nChar := nSrc and 7;
// 處理源串的每個(gè)字節(jié)
if (nChar = 0) then
begin
// 組內(nèi)第一個(gè)字節(jié),只是保存起來(lái),待處理下一個(gè)字節(jié)時(shí)使用
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -