📄 txmobile.~pas
字号:
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 + -