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

📄 smsredskyimpl.pas

📁 多线程发送和接收短信
💻 PAS
📖 第 1 页 / 共 3 页
字号:
// s_Text:string;
 Next_Str:widestring;
begin
  i:=pos('+86',Str);
  if i>0  then
    TelNum:=copy(Str,i+3,11); //提取手机号码 //传递给函数变量返回
  //==============================================
  Next_Str:=copy(Str,i+14,length(Str)-(i+4)+1);

  i:=pos(#13,Next_Str);
  if i>0 then
     Next_Str:=copy(Next_Str,i+1,length(Next_Str)-(i+1)+1);
  i:=pos(#13,Next_Str);
  if i>0 then
     Next_Str:=copy(Next_Str,1,i-1);
  RecieveHandOK:=UniCode2GB(Next_Str);  //返回回执的命令信息
end;
//===========(自定义函数)========2004-08-13 by 郭秀双===========================
//功能:对COM口收到信息进行分类====〉〉〉〉提取
//参数:Recie_STR:Com口收到的信息
Function TRedSky.FromComInfo_SortChoose(Recie_STR:string):string;
var
 i:integer;
 SText,Num,ssS:widestring;
 ResultSTR:widestring;
begin
      ssS:=Recie_STR;
      i:=pos('+CMGR',ssS);
      if i>0 then
       begin
       //===================
       i:=pos('0891',ssS);
       if i>0 then
         begin
          SText:=CopyText(Num,ssS);
          if  Num<>'' then
            ResultSTR:=Num;
          if  SText<>'' then
            ResultSTR:=ResultSTR+','+UniCode2GB(SText);
          end;
       i:=Pos('$OK:TMSG',ssS);
       if i>0 then
         begin
           SText:=RecieveOKTMSG(Num,ssS);
           if  SText<>'' then
           ResultSTR:=Num+','+SText;
         end
       else
         begin
           SText:=RecieveHandOK(Num,ssS);
           if  SText<>'' then
           ResultSTR:=Num+','+SText;
         end;
       end ;
      //==============主动读取短信时的信息提取(  )==================================
      i:=pos('+CMTI: "SM"',ssS);
      if i>0 then
       begin
         SText:=ReadComSMS(ssS);
         if  SText<>'' then
         ResultSTR:=Num+','+SText;
         M.Lines.Add('ReadSMS:'+ResultSTR);
       end;
      //=============读取全部短信息的提取( AT+CMGL="ALL" )======================
      i:=pos('+CMGL',ssS);
      if i>0 then
       begin
         i:=Pos('$OK:TMSG',ssS);
         if i>0 then
         begin
           SText:=RecieveOKTMSG(Num,ssS);
           if  SText<>'' then
           ResultSTR:=Num+','+SText;
         end
       else
         begin
           SText:=RecieveHandOK(Num,ssS);
           if  SText<>'' then
           ResultSTR:=Num+','+SText;
         end;
       End;
  //================触发事件====2004-08-14 by guoxiushuang=============
  if (Num<>'') and  (SText<>'') then
      FEvents.OnComReceiveSMS(Num,SText);
end;
procedure TRedSky.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
type
  ss=array[1..500]of char ;
var    str1:^ss;
       i:integer;
       s:array[0..15] of char ;
        n:integer;
       sss,SText:   string;
begin
       SetLength(Sss, BufferLength); //接收RS232的数据并显示Memo1上。
       Move(Buffer^, PChar(Sss)^, BufferLength);
       //========进行字符串的分类处理===========
       M_ComEvent.Lines.Add(ssS);
       FromComInfo_SortChoose(ssS);
end;

//============GBK转为汉字=======================================================
function TRedSky.WideStrToCh(S: String): string; //
var
  C,C1,C2: String;
  SS: WideString;
  i: Word;
begin
  i := 1;
  while i <= (Length(S) - 2) do
  begin
    C1 := Copy(S, i, 2);
    C2 := Copy(S, i + 2, 2);
    C := Chr(StrToInt('$' + C1)) + Chr(StrToInt('$' + C2));
    SS := SS + C;
    i := i + 4;
  end;
  Result := SS;
end;  
//============汉字转成GBK码=====================================================
Function TSendSMSThread.TextToGBK(Text:string):string;
var
 t:widestring;
 i:integer;
begin //晴天====C7E7CCEC
  for i:=1 to Length(Text) do
  t := t + IntToHex(ord(Text[i]),2);
  TextToGBK:=t;
end;
//===========短信息编码=============
//Pdu 编码
function TSendSMSThread.EncodeGb(s: WideString): string;
var
        i,len:Integer;
        cur:Integer;
        t:string;
begin
        Result:='';
        len:=Length(s);
        i:=1;
        while i<=len do
        begin
                cur:=ord(s[i]);
                //BCD转换
                FmtStr(t,'%4.4X',[cur]);
                Result:=Result+t;
                inc(i);
        end;
end;
//
// Pdu模式手机号码编码
//
//
// 用来交换移位
//
function TSendSMSThread.ConvertPhoneNum(PhoneNum: string): string;
var
        Len, i : integer;
        tmp,T_PhoneNum : widestring;

begin
        Len := length(PhoneNum);
         if Len=11 then
           T_PhoneNum:='86'+PhoneNum
        else
           T_PhoneNum:=PhoneNum;
        if (len <> 11) and (len <> 13) then
        begin
                ConvertPhoneNum := '';
                exit;
        end;

        T_PhoneNum := T_PhoneNum + 'F';
        Len := length(T_PhoneNum);
        i := 1;
        while i<=len do
        begin
                tmp := tmp + T_PhoneNum[i + 1] + T_PhoneNum[i];
                inc(i, 2);
        end;
        ConvertPhoneNum := tmp;
end;
//===========(自定义函数)=====2004-08-11=======郭秀双==============================
//格式: '11000D91'+ConvertPhoneNum(trim(CB_Tel.Text))+'0008A7'+L1(SendStr1)+SendStr1;
//功能:控制命令+派车单=转换成编码
//参数:Mission:控制命令; AlarmInfo:派车单
//附加:参数返回的时候前面增加了 长度字节
Function  TSendSMSThread.MakeInfo_UnicodeGBK(SendTel,Mission,AlarmInfo:string):string;
var
 M_Code,A_Code,S_Phone:widestring;
 Len:string;
begin
   if Length(SendTel)>=11 then
      begin
        if Length(SendTel)=11 then
           SendTel:='86'+SendTel;
        if Mission<>'' then
           M_Code:=EncodeGb(WideString(Mission)); //控制命令
        if AlarmInfo<>'' then
           A_Code:=TextToGBK(AlarmInfo);          //派车单
        S_Phone:='11000D91'+ConvertPhoneNum(SendTel)+'0008A7'; //发送的目的电话号码
        //=================================
         Len:=inttostr(length(M_Code+A_Code));
         Len:=IntToHex(strtoint(Len) div 2, 2);
      end;
   M_Temp.Lines.Add('GBKCODE:'+S_Phone+Len+M_Code+A_Code);
   MakeInfo_UnicodeGBK:=S_Phone+Len+M_Code+A_Code;
   
end;
//发送短信息线程
Constructor TSendSMSThread.Create(Suspended:Boolean;Phone,Mission,Text:string;Temp:Tmemo;Comname:Tcomm);
begin
   //showmessage('ok-0');
   inherited Create(Suspended);
     ID_Phone:=Phone;
     ID_Mission:=Mission;
     ID_Text:=Text;
     M_Temp:=Temp;
     Comm1:=Comname;
    // showmessage(ID_Phone+ID_Mission+ID_Text);
   M_Temp.Lines.Add('警告!@@@@InitStartSendMode'+ID_Phone+ID_Mission+ID_Text);
   //Form1.M_Send.Lines.Add('警告!!'+ID_Phone+'::'+ID_Mission+'::'+ID_Text);
   FreeOnTerminate:=True;
   
end;
//=======(自定义函数)===2004-08-11====by 郭秀双=================================
//功能:初始化Pdu 发送设置
//参数:Sign :: 1 :Text方式;0:Pdu方式
Function TSendSMSThread.InitStartSendMode(Sign:string):string;
var
  str:shortstring;
  len:word;
  buf:pchar;
begin
  //showmessage('ok0');
   //=====开始发送====初始化PDU设置信息===================
  str:='AT+CMGF='+Sign+chr(13);
 // M_Temp.Lines.Add('修改发送模式:'+Sign);
  buf:=@str;
  inc(buf);
  len:=length(str);
  comm1.WriteCommData(buf,len);
  sleep(200);
 // showmessage(str);
end;
//=========(自定义函数)=====2004-08-11=====by 郭秀双===========================
//功能:发送信息至Com口,发往目的车载MDT显示屏上
//参数: 
Function TSendSMSThread.SendInfoToCom(Text:string):string;
var
 // SendLength:integer;
 // str:shortstring;
//  len:word;
 // buf:pchar;
  s:string;
begin
  S:=Text;
 // showmessage('ok5');
   //=====开始发送====信息======pchar=============
  comm1.WriteCommData(pchar(s),length(s));
  //==============================
 M_Temp.Lines.Add('警告!@@@@ToCom'+s);
end;
procedure TSendSMSThread.SendSMSToCom;
  var
  SMS:string;
  SendLength:integer;
  str_1,str_2:string; //widestring     Shortstring
//  len:word;
//  buf:pchar;
begin
//  showmessage('ok4');
  if Length(ID_Text)<=112 then
     begin
       SMS:=MakeInfo_UnicodeGBK(trim(ID_Phone),ID_Mission,ID_Text);

       SendLength:=length(SMS) div 2;
       //第一段信息==========================
       str_1:='AT+CMGS='+inttostr(SendLength)+chr(13); //+inttostr(SendLength)53
       //第二段信息==========================
       str_2:='00'+SMS+chr(26)+chr(13);
       M_Temp.Lines.Add('警告!@@@@'+str_1);
       M_Temp.Lines.Add('警告!@@@@'+str_2);
       //======(1)初始化Pdu===========================
       InitStartSendMode('0');
       sleep(200);
       //======(2)发送第一段信息======================
       SendInfoToCom(str_1);
       sleep(200);
       //======(3)发送第二段信息======================
       SendInfoToCom(str_2);
       //M_Temp.Lines.Add('警告!@@@@'+str_1);
       //M_Temp.Lines.Add('警告!@@@@'+str_2);
     end
  else
     begin
       //Form1.M_Send.Lines.Add('警告!信息长度超长!!!!');
       //==========================================================
       SMS:=MakeInfo_UnicodeGBK(trim(ID_Phone),ID_Mission,Copy(ID_Text,1,112));
       SendLength:=length(SMS) div 2;
       //第一段信息==========================
       str_1:='AT+CMGS='+inttostr(SendLength)+chr(13); //+inttostr(SendLength)53
       //第二段信息==========================
       str_2:='00'+SMS+chr(26)+chr(13);
       //Form1.M_Send.Lines.Add('警告!@@@'+str_2);
       //======(1)初始化Pdu===========================
       InitStartSendMode('0');
       sleep(200);
       //======(2)发送第一段信息======================
       SendInfoToCom(str_1);
       sleep(200);
       //======(3)发送第二段信息======================
       SendInfoToCom(str_2);
       //-----------------------------------------------//
       //-----------------------------------------------//
       sleep(5000);
       //-----------------------------------------------//
       //-----------------------------------------------//
       SMS:=MakeInfo_UnicodeGBK(trim(ID_Phone),ID_Mission,Copy(ID_Text,113,Length(ID_Text)-112));
       SendLength:=length(SMS) div 2;
       //第一段信息==========================
       str_1:='AT+CMGS='+inttostr(SendLength)+chr(13); //+inttostr(SendLength)53
       //第二段信息==========================
       str_2:='00'+SMS+chr(26)+chr(13);
      //M_Temp.Lines.Add('警告!@@@@'+str_1);
      //M_Temp.Lines.Add('警告!@@@@'+str_2);
       sleep(200);

       //======(2)发送第一段信息======================
       SendInfoToCom(str_1);
       sleep(200);
       //======(3)发送第二段信息======================
       SendInfoToCom(str_2);
     end;
end;
procedure TSendSMSThread.execute;
var
   WaitReturn: DWORD;
begin
  //showmessage('ok2');
  FreeOnTerminate := True;
  //进入同步,防止其他线程访问
  WaitReturn := WaitForSingleObject(SendMutex, INFINITE);
  begin
     WaitForSingleObject(SendMutex, INFINITE);
     //执行发送信息==========
     SendSMSToCom;
     //====暂停1秒钟==防止数据表锁死=============
     sleep(6000);
     ReleaseMutex(SendMutex);//
     sleep(1000);
     //showmessage('ok3');
  end;
end;
procedure TRedSky.SendSMS(const Phone, Mission, SMS: WideString);
begin
   //showmessage('ok-00');
   TSendSMSThread.Create(false,Phone,Mission,SMS,M,Comm1);
 
end;


//读取GSM中所有的信息,并删除
procedure TRedSky.ReadAllSMSFromGSM;
var
  str:shortstring;
  len:word;
  buf:pchar;
 begin
  InitStartSendMode('1');
  //=====开始发送====初始化PDU设置信息===================
  str:='AT+CMGL="ALL"'+chr(13);
  buf:=@str;
  inc(buf);
  len:=length(str);
  comm1.WriteCommData(buf,len);
  sleep(200);
end;

initialization
  TActiveFormFactory.Create(
    ComServer,
    TActiveFormControl,
    TRedSky,
    Class_RedSky,
    1,
    '',
    OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
    tmApartment);
    //非可视化控件 OLEMISC_INVISIBLEATRUNTIME
    //可是化控件   OLEMISC_SIMPLEFRAME
end.

⌨️ 快捷键说明

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