⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tt_gsm.dpr

📁 短信接收器程序可实现收短信、解析短信、删除短信、发送短信。
💻 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 + -