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

📄 txmobile.~pas

📁 访问西门子手机,可发送AT指令,并进行解码和加码.
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
            CurByte := Byte(DataBuf[j]);
            CurByte := CurByte and 127 ;
            strData := strData + Chr(CurByte);
          end
          else if ( k = 0 ) then
          begin
            PreByte := Byte(DataBuf[j-1]) ;
            CurByte := Byte(DataBuf[j]);

            CurByte := CurByte shl 7 ;
            CurByte := CurByte shr 1 ;
            PreByte := PreByte shr 2 ;

            CurByte := CurByte or PreByte ;
            strData := strData + Chr(CurByte) ;

            CurByte := Byte(DataBuf[j]);
            CurByte := CurByte shr 1;
            strData := strData + Chr(CurByte);
          end
          else
          begin
            PreByte := Byte(DataBuf[j-1]);
            CurByte := Byte(DataBuf[j]);

            CurByte := CurByte shl k ;
            CurByte := CurByte shr 1 ;
            PreByte := PreByte shr ( 8 - (k -1 ));

            CurByte :=  CurByte or  PreByte ;
            strData := strData + Chr(CurByte) ;
          end;
       end;

     end;

   Result.strContent := strData;

end;
function TMobile.ReceiveMessage( var ReceiveBuf : TReceiveBuf ) : Integer ; // 返回接收的个数
var
  Buf,ReadBuf,SubBuf: TReadBuf ;
  SubP : PChar;
  PDUCode,strLog : Ansistring;

  nLen,nWriteRet,nReadRet,nCodeLen,nPos : DWord;
  i,j : Integer;
  str1,str2: string;
  Overlapped: TOverlapped ;
  bRet : Boolean;

  Msg : TReceiveMsg ;
begin
   // 写入At+CMGL=0指令
  WriteDbg('TMobile.ReceiveMessage -- Get In ');
  Result := 0;
  str1 := 'AT+CMGL=0'+ #13;
  nLen := Length(str1);
  FillChar(Buf,ReadBufLength,0);
  StrPCopy(Buf,str1);
  Overlapped.hEvent := WriteEndEvent.Handle;
  WriteEndEvent.ResetEvent ;
  WriteFile(CommHandle,Buf,nLen,nWriteRet,@Overlapped);
  bRet := GetOverlappedResult(CommHandle,Overlapped,nWriteRet,True);
  if ( bRet = False ) then
    begin
      WriteDbg('TMobile.ReceiveMessage -- 写入At+CMGL=0指令之后,GetOverlappedResult 调用失败');
      Result := -1 ;   //    GetOverlappedResult 调用失败 !';
      Exit;
    end;
  WriteEndEvent.ResetEvent ;
  strLog := '';
  strLog := strLog + '  执    行 : At+CMGL=0' + #13#10;
  strLog := strLog + '  写入长度 : ' + IntToStr(nLen) + #13#10;
  strLog := strLog + '  实际写入长度 :' + IntToStr(nWriteRet)+ #13#10 ;
  WriteDbg('TMobile.ReceiveMessage -- '+ #13#10 + strLog );
  strLog := '';

  FillChar(Buf,ReadBufLength,0);
  Overlapped.hEvent := ReadEndEvent.Handle;
  ReadEndEvent.ResetEvent;
  ReadFile(CommHandle,Buf,ReadBufLength,nReadRet,@Overlapped);
  bRet := GetOverlappedResult(CommHandle,Overlapped,nReadRet,True);
  if ( bRet = False ) then
     begin
       WriteDbg('TMobile.ReceiveMessage --  读缓冲数据,GetOverlappedResult 调用失败');
       Result := -2 ;        //  GetOverlappedResult 调用失败 ! ;
       Exit;
     end;
  ReadEndEvent.ResetEvent ;
  strLog := strLog + '   返回长度 :  ' + IntToStr(nReadRet)+ #13#10;
  strLog := strLog + '   返 回 值 :  ' + StrPas(Buf)+ #13#10;
//  WriteDbg('TMobile.ReceiveMessage -- ' + #13#10  + strLog );

  if nReadRet = 0 then   // 没有读出数据
   begin
     WriteDbg('TMobile.ReceiveMessage -- 缓冲没有数据,跳出函数调用 ');
     Result := 0 ;
     Exit;
   end;

  WriteDbg('TMobile.ReceiveMessage  -- 解码开始 ');
  while ( True ) do
   begin
     SubP := StrPos(Buf,PChar('+CMGL:')) ;
     if SubP = nil then   //
        Break;
     FillChar(SubBuf,ReadBufLength,0) ;
     StrCopy(SubBuf,SubP) ;
     FillChar(Buf,ReadBufLength,0);
     StrCopy(Buf,SubBuf);

     Msg := GetMsg(SubBuf);
     ReceiveBuf[Result] := Msg ;
     Inc(Result,1);
     strLog :='';
     strLog := strLog + '返 回 值 :  ' + ' 解码 '+ #13#10;
     strLog := strLog + '返 回 值 :  ' + ' 内容 :_'+ Msg.strContent+ #13#10 ;
 //    WriteDbg('TMobile.ReceiveMessage -- ' + #13#10 + strLog);
     Buf[0] := '*';
   end;

 // 删除数据
  WriteDbg('TMobile.ReceiveMessage -- 删除取出的数据 ,Result := ' + IntToStr(Result)) ;
  for i:= 0 to Result -1 do
  begin
    WriteDbg('TMobile.ReceiveMessage -- 删除取出的数据, 进入循环 '+
             IntToStr(i)+ ',Result = '+ IntToStr(Result));
    str1 := 'AT+CMGD='+IntToStr(ReceiveBuf[i].nIndex) + #13;
    nLen := Length(str1);
    FillChar(Buf,ReadBufLength,0);
    StrPCopy(Buf,str1);
    Overlapped.hEvent := WriteEndEvent.Handle;
    WriteEndEvent.ResetEvent ;
    WriteFile(CommHandle,Buf,nLen,nWriteRet,@Overlapped);
    bRet := GetOverlappedResult(CommHandle,Overlapped,nWriteRet,True);
    if ( bRet = False ) then
     begin
        WriteDbg('Delete  --Write  '+ IntToStr(ReceiveBuf[i].nIndex)) ;   //    GetOverlappedResult 调用失败 !';
        Continue ;
      end;
    WriteEndEvent.ResetEvent ;

    FillChar(Buf,ReadBufLength,0);
    Overlapped.hEvent := ReadEndEvent.Handle;
    ReadEndEvent.ResetEvent;
    ReadFile(CommHandle,Buf,ReadBufLength,nReadRet,@Overlapped);
    bRet := GetOverlappedResult(CommHandle,Overlapped,nReadRet,True);
    if ( bRet = False ) then
      begin
         WriteDbg('Delete --Read   '+ IntToStr(ReceiveBuf[i].nIndex)) ; ;        //  GetOverlappedResult 调用失败 ! ;
         continue;
      end;
    if nReadRet = 0 then   // 没有读出数据
     begin
        Result := 0 ;
        continue;
     end; 
  end;      

  WriteDbg('TMobile.ReceiveMessage -- Get Out '+
           '|| ReceiveResult = ' + IntTostr(Result));

end;
function TMobile.SetDCB( DCB1  : TDCB ) : Boolean;    // 待
var
  IniFile : TIniFile;
begin

  IniFile := TIniFile.Create(GetCurrentDir + '\Mobile.ini');
  IniFile.WriteInteger('Siemens','DCB_BaudRate',DCB1.BaudRate);
  IniFile.WriteInteger('Siemens','DCB_ByteSize',DCB1.ByteSize);
  IniFile.WriteInteger('Siemens','DCB_Parity'  ,DCB1.Parity  );
  IniFile.WriteInteger('Siemens','DCB_StopBits',DCB1.StopBits);
  IniFile.Free ;

end;
function TMobile.GetDCB : TDCB;
begin
  Result := DCB ;
end;
function TMobile.ConvertPhoneNum(strNum:string):string;
var
 nLen,i:integer ;
 str:string ;
 c1: Char;
begin
 nLen := Length(strNum);
 if( nLen mod 2 ) = 1 then
   str := strNum + 'F';

 for i:= 1 to  Length(str)  div 2 do
   begin
     c1 := str[i*2 -1];
     str[i*2 -1] := str[i*2];
     str[i*2]:= c1;
   end;
 Result :=  str ;
end;
function TMobile.MakePDU(DestNumber,Content,SCAddress:String;
                         Result_String:pchar  ; var LenOfSCA :DWORD):Bool ;
const
  FirstOctet='00';                       // 文件头
  TpId='00';
  TpDcs='08';            //"04" is 7 bit escii ,"08" is 8 bit unicode;
  TPValidityPeriod='AA'; //aa is 4 day
var
  LenSmsInfo : String ;
  TPMessageReference  : String ;   // 短信中心
  DestPhoneNum : String ;
  AddressLength : String;
  TpUserData : String;
  TPUserDataLength : String;
  temp :WideString;
  Tmp_Pchar :pchar;
  Rlt_str : string;
begin
  if (DestNumber='') or (Content='') then
    begin
      Result:=False;
      exit;
    end
  else
    begin
      TPMessageReference := ConvertPhoneNum(SCAddress);
      LenOfSCA           := Length(TPMessageReference + strTypeOfSCA) div 2 ;
      LenSmsInfo         := Format('%2.2X',[LenOfSCA]);
      DestPhoneNum       := ConvertPhoneNum(DestNumber);
      AddressLength      := Format('%2.2X',[length(DestNumber)]);
      temp               := Content;
      Tmp_Pchar          := StrAlloc(1000);
      if SMSEncode(temp,Tmp_Pchar) = FALSE then
        Begin
          Result := False;
          Exit;
        End;

      TpUserData:=StrPas(Tmp_Pchar);
      if TpDcs='08' then
        TPUserDataLength:=format('%2.2X',[length(TpUserData) div 2])
      else
        TPUserDataLength:=format('%2.2X',[((length(TpUserData) div 2)*8) div 7]);
      Rlt_str:=LenSmsInfo
              + strTypeOfSCA
              + TPMessageReference
              + strTypeOfOA        // 地址类型 ( Type Of OA )
              + FirstOctet            //  FIRST OCTET  文件头
              + AddressLength         // 地址长度
              + '81'                  //  MESSAGE REFERENCE
              + DestPhoneNum           //  Address Field  被叫手机号码
              + TpId                  // Protocol Identifier  协议标志
              + TpDcs                 // Data Coding-Scheme   编码方式
              + TPValidityPeriod      // Validity Period     有效期
              + TPUserDataLength      // User Data Length    数据长度
              + TpUserData;           // User Data           短信内容;
      StrCopy(Result_String,pchar(Rlt_str));
      Result:=true;
     end;
end;
function TMobile.SMSEncode(s:WideString;Result_Code:pchar):Bool;
var
  i,len:Integer;
  cur:DWord ;
  t,temp:String;
begin
  temp := '';
  if length(s)>0 then
   begin
     len:=Length(s);
     i:=1;
     while i<=len do
       begin
         cur:=DWord(s[i]);
         t := Format('%4.4X',[cur]);
         temp:=temp+t;
         inc(i);
       end;
     StrPCopy(Result_Code,Temp);
     Result:=true;
   end
 else
  Result:=false;

end;
function TMobile.TestAtCommand( AtCommand : String ) : String;
var
  nLen,nWriteRet,nReadRet : DWord;
  str1 : string;
  Buf : TReadBuf;
  Overlapped: TOverlapped ;
  bRet : Boolean;
begin
  Result := '';
  str1 := ATCommand + #13;
  nLen := Length(str1);
  FillChar(Buf,ReadBufLength,0);
  StrPCopy(Buf,str1);
  Overlapped.hEvent := WriteEndEvent.Handle;
  WriteEndEvent.ResetEvent ;
  WriteFile(CommHandle,Buf,nLen,nWriteRet,@Overlapped);
  bRet := GetOverlappedResult(CommHandle,Overlapped,nWriteRet,True);
  if ( bRet = False ) then
    begin
      Result := ('GetOverlappedResult 调用失败 !');
      Exit;
    end;

  Result :=  Result + '执行  '+  AtCommand + #13#10 ;
  Result :=  Result + '要写入长度: ' + IntToStr(nLen) + #13#10;
  Result :=  Result + '实际写入长度:' + IntToStr(nWriteRet) + #13#10;

  if nWriteRet <> nLen then
    begin
      Result := Result + '写入失败'+#13#10;
      exit;
    end;

  FillChar(Buf,1000,0);
  WriteEndEvent.ResetEvent ;

  Overlapped.hEvent := self.ReadEndEvent.Handle;
  ReadEndEvent.ResetEvent;
  ReadFile(CommHandle,Buf,1000,nReadRet,@Overlapped);
  bRet := GetOverlappedResult(CommHandle,Overlapped,nReadRet,True);
  if ( bRet = False ) then
    begin
      Result := Result +'GetOverlappedResult 调用失败 !' + #13#10 ;
      Exit;
    end;
  Result := Result + '返回长度 :  ' + IntToStr(nReadRet) + #13#10 ;
  Result := Result + '返 回 值 :  ' + StrPas(buf) + #13#10 ;
  ReadEndEvent.ResetEvent ;

end;
function TMobile.ReadBuf : Ansistring;
var
  nLen,nWriteRet,nReadRet : DWord;
  Overlapped: TOverlapped ;
  Buf : TReadBuf;
  bRet : Boolean;
begin
  Result := '';
  Overlapped.hEvent := self.ReadEndEvent.Handle;
  ReadEndEvent.ResetEvent;
  FillChar(Buf,ReadBufLength,0);
  ReadFile(CommHandle,Buf,1000,nReadRet,@Overlapped);
  bRet := GetOverlappedResult(CommHandle,Overlapped,nReadRet,True);
  if ( bRet = False ) then
    begin
      Result := Result + 'GetOverlappedResult 调用失败 !';
      Exit;
    end;
  Result := Result + '返回长度 :  ' + IntToStr(nReadRet) + #13#10;
  Result := Result + '返  回 值 :  ' + StrPas(buf) + #13#10 ;
  ReadEndEvent.ResetEvent ;
  
end;
function TMobile.ConvertDeliverAddress(strAddress : string ) : String;
var
  Buf : Array[1..20] of char;
  nLen,i : Integer;
  c1 : Char;
begin
  FillChar(Buf,20,0);
  StrPCopy(@Buf,strAddress);
  nLen   := Length(strAddress);
  for i:= 1 to nLen div 2 do
    begin
      c1 := Buf[i*2-1];
      Buf[i*2-1] := Buf[i*2];
      Buf[i*2]   := c1;
    end;
  if Buf[nLen] = 'F' then
     Buf[nLen] := #0;  
  Result := StrPas(@Buf);
end;
procedure TMobile.SetSCA(_SCA: String);
begin
  self.strSMAddress := _SCA ;
end;

end.

⌨️ 快捷键说明

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