📄 tt_gsm.dpr
字号:
//本函数模块由金天平封装
library TT_GSM;
uses
SysUtils,
Classes,
dialogs,
windows,
Forms,
USerialComm in 'USerialComm.pas',
fc_gsm in 'fc_gsm.pas';
const
//正常
DEVICE_NORMAL = 0;
E_TIMEOUT = 999;
// 端口初始化失败
E_PORT_INIT = 998;
// 设备尚未初始化
E_DEVICE_BEFORE_INIT = 997;
// 无效操作
E_VOID_ACTION = 996;
{$R *.res}
var
initflag: boolean;
FErrorCode: DWord; //最后一次错误代码
FErrorString: string; //最后一次错误信息;
FLastStatusCode: string; //保存每次发送命令成功后返回的状态码
FSerialComm: TSerialComm;
FBaudRate: DWord;
FByteSize: DWord;
FStopBit: DWord;
DeviceLastError: integer;
SmsNumber: integer;
{ 打开串口
参数说明:
const char *pCom----发卡器所在端口,如com0,com1;
返回值:
0-----端口打开成功;
-1----端口打开失败;
}
function TT_GsmClose: integer; stdcall;
begin
try
Result := -1;
if initflag then
begin
initflag := false;
if assigned(FSerialComm) then
FSerialComm.Free;
Result := 0;
end;
except
Result := -1;
end;
end;
function TT_GsmOpen(const pPort: pchar): integer; stdcall;
var ReadStr: string;
begin
if initflag then Result := 0
else begin
//if not assigned(FSerialcomm) then
//ReadStr:='COM'+IntToStr(pPort);
FSerialComm := TSerialComm.Create(pPort);
FSerialComm.DCBBaudRate := 9600;
FSerialComm.DCBByteSize := 8;
FSerialComm.DCBStopBit := 0;
if FSerialComm.Open = STATUS_INIT_SUCCEED then begin
if FSerialComm.SendData('AT+CGMF=0' + #13, 500) = STATUS_CMD_SUCCEED then begin //设置发送编码为PDU
InsertLogfile('Func [Send] 设置发送编码为PDU ');
ReadStr := '';
if FSerialComm.ReadData(ReadStr, 500) <> STATUS_RECEIVE_FAIL then begin
if FSerialComm.SendData('AT+CGMM' + #13, 500) = STATUS_CMD_SUCCEED then begin
ReadStr := '';
if FSerialComm.ReadData(ReadStr, 1000) <> STATUS_RECEIVE_FAIL then begin
ReadStr := myHextoStr(ReadStr);
if (length(ReadStr) <= 0) then
begin
InsertLogfile('Func [Error] 与设备连接失败 ');
initflag := false;
Result := -1;
TT_GsmClose;
end
else
begin
InsertLogfile('Func [Success] 与设备连接成功,型号为: ' + copy(ReadStr, 19, 4));
initflag := true;
Result := 0;
end
end;
end;
end;
end;
end
else begin
initflag := false;
Result := -1;
end;
end;
end;
function ConverContent(Mobile, SmsCenterNum, SendMsg: widestring): integer; stdcall;
var
SendString: widestring;
SendLen: integer;
ReadStr: string;
tem: string;
sitems: TStringList;
SuccBz: Boolean;
i: integer;
begin
result := -1;
if (copy(Mobile, 1, 2) <> '13') and (copy(Mobile, 1, 2) <> '15') then
Mobile := ConverMobileNum(Mobile, 0)
else
Mobile := ConverMobileNum(Mobile, 1);
SmsCenterNum := ConverInfoCenter(SmsCenterNum);
SendMsg := ContentToUnicode(SendMsg);
SendString := codeaddcode(Mobile, SendMsg);
SendLen := length(SendString) div 2;
SendString := SmsCenterNum + SendString;
ReadStr := '';
if FSerialComm.SendData('AT+CMGS=' + inttostr(SendLen) + #13, 500) = STATUS_CMD_SUCCEED then begin
if FSerialComm.ReadData(ReadStr, 1000) <> STATUS_RECEIVE_FAIL then begin
if (length(ReadStr) <= 0) then
begin
InsertLogfile('Func [Send] 设置发送长度失败 ');
result := -1;
end
else
begin
InsertLogfile('Func [Send] 设置发送长度成功 ');
InsertLogfile('Func [Send] 发送PDU编码内容: ' + SendString);
if FSerialComm.SendData(SendString + ^Z, 500) = STATUS_CMD_SUCCEED then begin
ReadStr := '';
if FSerialComm.ReadData(ReadStr, 5000) <> STATUS_RECEIVE_FAIL then begin
ReadStr := myHextoStr(ReadStr);
sitems := SpString(ReadStr, #$D#$A);
for i := 0 to sitems.Count - 1 do
begin
tem := sitems[i];
if UpperCase(tem) = 'OK' then SuccBz := True;
end;
if SuccBz then
begin
InsertLogfile('Func [Send] 发送信息成功 ');
result := 0;
end
else
begin
InsertLogfile('Func [Send] 发送信息失败 ');
result := -1;
end;
end;
end;
end;
end;
end;
end;
function TT_SendMessage(const Mobile, SendMsg: widestring): integer; stdcall;
var
SmsCenterNum: widestring;
ConverMobile: widestring;
ReadStr: string;
PortStr: string;
begin
result := -1;
if initflag then begin
InsertLogfile('Func [SendNum] 发送号码为: ' + Mobile);
ReadStr := '';
if FSerialComm.SendData('AT+CSCA?' + #13, 500) = STATUS_CMD_SUCCEED then begin //获取短信中心号码;
if FSerialComm.ReadData(ReadStr, 1000) <> STATUS_RECEIVE_FAIL then begin
ReadStr := myHextoStr(ReadStr);
SmsCenterNum := copy(readstr, pos('+86', ReadStr) + 3, 11);
if (SmsCenterNum = '') and (length(SmsCenterNum) <> 11) then
begin
InsertLogfile('Func [Error] 获取短信中心号码失败 ');
result := -1;
end;
InsertLogfile('Func [Send] 获取短信中心号码: ' + SmsCenterNum);
result := ConverContent(Mobile, SmsCenterNum, SendMsg);
end;
end;
end;
end;
//新增超时参数 2008-06-28 便于调用程序控制时间
function TT_RecvMessage(const TimeOut: Integer): pchar; stdcall;
var
ReadStr: string;
ct, i: Integer;
tem, ResultStr: string;
sitems: TStringList;
SuccBz: Boolean;
begin
result := '';
if initflag then begin
if FSerialComm.SendData('AT+CMGL=4' + #13, 500) = STATUS_CMD_SUCCEED then begin
ReadStr := '';
if FSerialComm.ReadData(ReadStr, TimeOut) <> STATUS_RECEIVE_FAIL then begin
ReadStr := myHextoStr(ReadStr);
//showmessage(ReadStr);
ct := 0;
Result := '';
ResultStr := '';
sitems := SpString(ReadStr, #$D#$A);
//showmessage('2');
for i := 0 to sitems.Count - 1 do
begin
tem := sitems[i];
if UpperCase(tem) = 'OK' then SuccBz := True;
if (length(tem) > 15) then
begin
inc(ct);
try
ResultStr := ResultStr + DecodeInfo(tem) + '*_*';
finally
end;
end;
end;
SmsNumber := ct;
InsertLogfile(ResultStr);
if (ResultStr = '') and SuccBz then ResultStr := '没有新短信*_*';
Result := pchar(ResultStr);
end;
end;
end
else
begin
result := '';
end;
end;
function TT_DeleMessage(const DeleAllFlag: Integer): integer; stdcall;
var
ReadStr: string;
i, j: Integer;
tem: string;
sitems: TStringList;
SuccBz: boolean;
begin
result := -1;
if initflag then begin
if SmsNumber = 0 then SmsNumber := 1;
for i := 1 to SmsNumber do begin
if i < DeleAllFlag then Continue; //如果传入参数为0,表示删除全部短信,否则为删除指定短信
if FSerialComm.SendData('AT+CMGD=' + IntToStr(i) + #13, 500) = STATUS_CMD_SUCCEED then begin
ReadStr := '';
if FSerialComm.ReadData(ReadStr, 2000) <> STATUS_RECEIVE_FAIL then
begin
ReadStr := myHextoStr(ReadStr);
sitems := SpString(ReadStr, #$D#$A);
for j := 0 to sitems.Count - 1 do
begin
tem := sitems[j];
if UpperCase(tem) = 'OK' then SuccBz := True;
//else if UpperCase(tem) = 'ERROR' then SuccBz := False;
end;
if SuccBz then Result := 0 else Result := -1;
end;
end;
end;
end
else
begin
result := -1;
end;
end;
exports
TT_GsmOpen,
TT_GsmClose,
TT_SendMessage,
TT_RecvMessage,
TT_DeleMessage;
begin
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -