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

📄 shortsmsactiveimpl1.pas

📁 利用AT指令,直接控制GSM的控制.实现
💻 PAS
📖 第 1 页 / 共 4 页
字号:
        //发送短信结果没有返回,可能与模块的连接终止
        begin
          Result:= -6;   //发送短信结果没有返回,可能与模块的连接终止
        end;
      end;
      IfExecCmd:= False;
    except
      Result:= -1;
      IfExecCmd:= False;
    end;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来从SIM卡中读出指定的短信息内容
//函数名:ReadInfo
//参  数:1、Index: 索引
//        2、HandNum: WideString 发送方手机号码
//        3、Info:WideString    读出的短信息内容
//        4、SendTime: WideString 接收到的发送时间
//返回值:Shortint
//        0:读短信成功
//        -1:读短信失败
//        -2:模块忙
//        -3:短信索引不能小于1
//        -4:设置短信模式失败
//        -5:短短信失败,并且可能需要重新设置短信模式
//        -6:读短信结果没有返回,可能与模块的连接终止
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.ReadInfo(Index: Word; var HandNum, Info,
  SendTime: WideString): Smallint;
var
  OutData: string;
  OKNum: Integer;
  CMGRNum: Integer;
  ATNum,ErrNum: Integer;
  StartTime: TDateTime;
  MsgInfo: WideString;
  TempHandNum,TempInfo,TempSendTime: string;
begin
  Result:= 0;
  if IfExecCmd then
  begin
    //模块忙
    Result:= -2;
    Exit;
  end;
  if Index < 1 then
  begin
    //短信索引不能小于1
    Result:= -3;
    Exit;
  end;
  if SetModemCMGF(0) < 0 then
  begin
    //设置接收模式失败
    Result:= -4;
    IfExecCmd:= False;
    Exit;
  end;
  try
    IfExecCmd:= True;
    OutData:= 'AT+CMGR=' + IntToStr(Index) + #13 + #10;
    if Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
    begin
      StartTime:= Now();

      while Now() <= StartTime + 30 * (1/24/60/60) do
      begin
        DoEvents;
        ATNum:= Pos('AT+CMGR=',ReceiveData);
        OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
        CMGRNum:= Postion(#13 + #10 + '+CMGR: ',ReceiveData,ATNum) + ATNum;
        ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;

        if (CMGRNum > ATNum) and (OKNum > CMGRNum) then
        begin
          //读短信成功
          MsgInfo:= MidBStr(ReceiveData,CMGRNum,OKNum - CMGRNum + 4);
          Delete(ReceiveData,ATNum,OKNum - ATNum + 6);

          SMSDecode(MsgInfo,TempHandNum,TempInfo,TempSendTime);
          HandNum:= TempHandNum;
          Info:= TempInfo;
          SendTime:= TempSendTime;

          if Pos(RightBStr('000' + IntToStr(Index),3),CMTIIndex) > 0 then
            Delete(CMTIIndex,Pos(RightBStr('000' + IntToStr(Index),3),CMTIIndex),3);

          IfExecCmd:= False;
          Result:= 0;
          Exit;
        end;
        if ErrNum > ATNum then
        begin
          //读短信失败
          Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
          Result:= -5;
          IfExecCmd:= False;
          Exit;
        end;
        Result:= -6;
      end;
      IfExecCmd:= False;
      Exit;
    end
    else
    begin
      Result:= -1;
      IfExecCmd:= False;
      Exit;
    end;
  except
    Result:= -1;
    IfExecCmd:= False;
    Exit;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来从SIM卡中读出接收到的新短信息
//函数名:ReadNewInfo
//参  数:1、HandNum: WideString 发送方手机号码
//        2、Info:WideString    读出的短信息内容
//        3、SendTime: WideString 接收到的发送时间
//返回值:Shortint
//        >0:返回信息的索引号
//        0:读短信成功
//        -1:读短信失败
//        -2:模块忙
//        -3:短信索引不能小于1
//        -4:设置短信模式失败
//        -5:短短信失败,并且可能需要重新设置短信模式
//        -6:读短信结果没有返回,可能与模块的连接终止
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.ReadNewInfo(var HandNum, Info,
  SendTime: WideString): Smallint;
var
  TempIndex: Byte;
  Resu: ShortInt;
begin
  if Length(CMTIIndex) <= 0 then
  begin
    Result:= 0;
    Exit;
  end;

  try
    TempIndex:= StrToInt(LeftBStr(CMTIIndex,3));
    Resu:= ReadInfo(TempIndex,HandNum,Info,SendTime);
    if Resu>= 0 then
      Result:= TempIndex
    else
      Result:= Resu;
  except
    Result:= -1;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来把SIM卡中的短信删除掉
//函数名:DelInfo
//参  数:1、Index: 索引
//返回值:Shortint
//        0:删除短信成功
//        -1:删除短信失败
//        -2:模块忙
//        -3:短信索引不能小于1
//        -4:删除短信失败,并且可能需要重新设置短信模式
//        -5:删除短信结果没有返回,可能与模块的连接终止
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.DelInfo(Index: Word): Smallint;
var
  OutData: string;
  OKNum,ATNum: Integer;
  StartTime: TDateTime;
  ErrNum: Integer;
begin
  Result:= 0;
  if IfExecCmd then
  begin
    Result:= -2;
    Exit;
  end;

  if Index < 1 then
  begin
    Result:= -3;
    Exit;
  End;

  OutData:= 'AT+CMGD=' + IntToStr(Index) + #13 + #10;

  if Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
  begin
    StartTime:= Now();

    while Now() <= StartTime + 6 * (1/24/60/60) do
    begin
      DoEvents;
      ATNum:= Pos('AT+CMGD='+ IntToStr(Index),ReceiveData);
      OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
      ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;

      if OKNum > ATNum then
      begin
        Result:= 0;
        Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
        IfExecCmd:= False;
        Exit;
      end
      else if (ErrNum > ATNum) then
      begin
        Result:= -1;
        Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
        IfExecCmd:= False;
        Exit;
      end
      else
        Result:= -5;
    end;
    IfExecCmd:= False;
  end
  else
  begin
    IfExecCmd:= False;
    Result:= -1;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来得到模块的生产序号
//函数名:GetModemIMEINO
//参  数:无
//返回值:WideString
//        成功返回生产序号
//        失败返回空值
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.GetModemIMEINO: WideString;
var
  OutData: string;
  OKNum,ATNum: Integer;
  ErrNum:      Integer;
  StartTime: TDateTime;
begin
  if IfExecCmd then
    Exit;

  OutData:= 'AT+CGSN' + Chr(13) + Chr(10);
  if not Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
    Exit;

  StartTime:= Now();

  while Now() <= StartTime + 1 * (1/24/60/60) do
  begin
    DoEvents;
    ATNum:= Pos('AT+CGSN',ReceiveData);
    OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
    ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;

    if OKNum > ATNum then
    begin
      Result:= Trim(MidBStr(ReceiveData,ATNum + 7,OKnum - ATNum - 7));
      Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
      IfExecCmd:= False;
      Exit;
    end;
    if ErrNum > ATNum then
    begin
      Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
      IfExecCmd:= False;
      Exit;
    end;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来恢复模块的默认设置
//函数名:SetModemATZ
//参  数:无
//返回值:ShortInt
//        0:成功
//        -1:失败
//        -2:模块忙
//        -3:没有返回成功或失败标志
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.SetModemATZ: Smallint;
var
  OutData: string;
  OKNum,ATNum: Integer;
  ErrNum:      Integer;
  StartTime: TDateTime;
begin
  if IfExecCmd then
  begin
    Result:= -2;
    Exit;
  end;

  OutData:= 'ATZ' + Chr(13) + Chr(10);
  if not Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
  begin
    Result:= -1;
    Exit;
  end;

  StartTime:= Now();

  while Now() <= StartTime + 1 * (1/24/60/60) do
  begin
    DoEvents;
    ATNum:= Pos('ATZ',ReceiveData);
    OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
    ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;

    if OKNum > ATNum then
    begin
      Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
      Result:= 0;
      IfExecCmd:= False;
      Exit;
    end;
    if ErrNum > ATNum then
    begin
      Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
      Result:= -1;
      IfExecCmd:= False;
      Exit;
    end;
    Result:= -3;
  end;
end;

/////////////////////////////////////////////////////////////
//说  明:此函数是用来设置新信息来到时的提示方式
//函数名:SetModemCNMI
//参  数:无
//返回值:ShortInt
//        0:成功
//        -1:失败
//        -2:模块忙
//        -3:没有返回成功或失败标志
//作  者:卞伟    2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.SetModemCNMI: Smallint;
var
  OutData: string;
  OKNum,ATNum: Integer;
  ErrNum:      Integer;
  StartTime: TDateTime;
begin
  if IfExecCmd then
  begin
    Result:= -2;
    Exit;
  end;

  OutData:= 'AT+CNMI=2,1,0,0,1' + Chr(13) + Chr(10);
  if not Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
  begin
    Result:= -1;
    Exit;
  end;

  StartTime:= Now();

  while Now() <= StartTime + 2 * (1/24/60/60) do
  begin
    DoEvents;
    ATNum:= Pos('AT+CNMI=2,1,0,0,1',ReceiveData);
    OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
    ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;

    if OKNum > ATNum then
    begin
      Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
      Result:= 0;
      IfExecCmd:= False;
      Exit;
    end;
    if ErrNum > ATNum then
    begin
      Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
      Result:= -1;
      IfExecCmd:= False;
      Exit;
    end;
    Result:= -3;
  end;
end;

procedure TShortSMSActiveX.ActiveFormCreate(Sender: TObject);
begin
  Image1.Width:= 32;
  Image1.Height:= 32;
  Width:= 32;
  Height:= 32;
end;

initialization
  TActiveFormFactory.Create(
    ComServer,
    TActiveFormControl,
    TShortSMSActiveX,
    Class_ShortSMSActiveX,
    1,
    '',
//    OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
    OLEMISC_INVISIBLEATRUNTIME or OLEMISC_ACTSLIKELABEL,// or OLEMISC_SIMPLEFRAME,
    tmApartment);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -