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

📄 sendsmsthread.cpp

📁 基于普通手机的短信编程源码
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <dirent.h>
#include <dir.h>
#include <stdio.h>
#include <stdlib.h>
#include <winbase.h>
#include <time.h>
#pragma hdrstop
#include "sms_Unit1.h"
#include "SendSmsThread.h"
#include "smsPdu.h"

extern int is_send_thread_running;  //线程运行标志
extern int send_thread_stop;
extern TForm1 *Form1;
extern HANDLE hComm;
extern SendSmsThread * mySendSmsThread;
int GetCfgItem(char * cfg_file,char *cfg_seg, char *cfg_item, char *value);
#pragma package(smart_init)
//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall Unit1::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------

__fastcall SendSmsThread::SendSmsThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}

//---------------------------------------------------------------------------
//监控文件  send_sms/send_sms.dat,如有短信记录写入,即进行发送
//
void __fastcall SendSmsThread::Execute()
{
        BOOL tf;
        char comm[100],bite_rate[100],sms_center[100],tmp[500],full_file_name[100];
        //char tel_no[500],sms_content[500];
        FILE *fp;
        SM_PARAM sm_param;
        int GetItemFromStr(char * str,char fgf,int item_no,char * val,int val_len );
        char * delete_space(char *str);
        int get_systime1(char *bgntime);
        int k;

        //设线程运行标志
        is_send_thread_running=1;
        
        //进行手机和电脑的连接
        //
        getcwd(full_file_name, 100);
        strcat(full_file_name,"\\sms.ini");
        memset(comm, 0, sizeof(comm));
        memset(bite_rate, 0, sizeof(bite_rate));
        memset(sms_center, 0, sizeof(sms_center));
        if( GetCfgItem(full_file_name,"send_sms","comm",comm)!=0
          ||GetCfgItem(full_file_name,"send_sms","bite_rate",bite_rate)!=0
          ||GetCfgItem(full_file_name,"send_sms","sms_center",sms_center)!=0 )

        {
                sprintf(tmp,"读配置文件  %s  错误!! 发送线程结束 ",full_file_name);
                Form1->StatusBar1->Panels->Items[0]->Text=tmp;
                is_send_thread_running=0;
                return;
        }

        //打开串口
        tf=OpenComm(comm, atol(bite_rate), NOPARITY, 8, ONESTOPBIT);

        if( tf == 0 )
        {
                 sprintf(tmp,"发送:打开串口%s失败!!", comm);
                 Form1->StatusBar1->Panels->Items[1]->Text=tmp;
                 is_send_thread_running=0;
                 return ;
        }

     connect:
        //连接手机和电脑
        {
                char cmd[100],ans[100];
                int nLength;

                //清除串口缓冲区
                PurgeComm(hComm,PURGE_TXCLEAR);
                PurgeComm(hComm,PURGE_RXCLEAR);

                memset(ans, 0, sizeof(ans));
                sprintf(cmd, "AT\r");

                // 输出命令串"AT"
                WriteComm(cmd, strlen(cmd));

                // 读应答数据
                Sleep(1000);
                nLength = ReadComm(ans, 128);

                // 根据能否找到"OK"决定连接成功与否
                if( (nLength<=0) || (strstr(ans, "OK")==NULL) )
                {
                         sprintf(tmp,"发送:手机与电脑连接失败!");
                         Form1->StatusBar1->Panels->Items[1]->Text=tmp;
                         Sleep(2000);
                         if( send_thread_stop==1 ){   //终止线程
                                is_send_thread_running=0;
                                CloseHandle(hComm);
                                return;
                         }
                         else{
                                Sleep(2000);
                                goto connect;
                        }
                }
                sprintf(tmp,"");
                Form1->StatusBar1->Panels->Items[1]->Text=tmp;
        }//end of connect



        //读取文件尾的记录,循环发送。
        //短信记录格式:手机号|短信内容
        //
        getcwd(full_file_name, 100);
        strcat(full_file_name,"\\sms_send.txt");
        if( (fp=fopen(full_file_name, "r"))==NULL ){
                sprintf(tmp, "打开短信数据文件[%s]失败,发送线程结束\n", full_file_name);
                Form1->StatusBar1->Panels->Items[0]->Text=tmp;
                CloseHandle(hComm);
                is_send_thread_running=0;
                return;
        }

        //移动指针到文件尾
	while( fgets(tmp, sizeof(tmp)-1, fp)!=NULL );

        //读取文件尾的记录,循环发送
	while(1)
	{
                //检测手机和电脑的连接
                k=0;
                connectTest:
                {
                        char cmd[100],ans[100];
                        int nLength;

                        k++;
                        //清除串口缓冲区
                        PurgeComm(hComm,PURGE_TXCLEAR);
                        PurgeComm(hComm,PURGE_RXCLEAR);

                        memset(ans, 0, sizeof(ans));
                        sprintf(cmd, "AT\r");

                        // 输出命令串"AT"
                        WriteComm(cmd, strlen(cmd));

                        // 读应答数据
                        Sleep(100);
                        nLength = ReadComm(ans, 128);

                        // 根据能否找到"OK"决定连接成功与否
                        if( (nLength<=0) || (strstr(ans, "OK")==NULL) )
                        {
                                if( k>=3 ){
                                        sprintf(tmp,"发送:手机与电脑连接失败!");
                                        Form1->StatusBar1->Panels->Items[1]->Text=tmp;
                                }
                                if( send_thread_stop==1 ){   //终止线程
                                        is_send_thread_running=0;
                                        CloseHandle(hComm);
                                        return;
                                }
                                else{
                                        Sleep(500);
                                        goto connectTest;
                                }
                        }
                        sprintf(tmp,"");
                        Form1->StatusBar1->Panels->Items[1]->Text=tmp;
                }//end of 检测手机和电脑的连接


                if( send_thread_stop==1 ){   //终止线程
                        CloseHandle(hComm);
                        is_send_thread_running=0;
                        return;
                }

                //处理读到的记录
                memset(tmp, 0, sizeof(tmp));
		if( fgets(tmp, sizeof(tmp), fp)!=NULL )
		{        char DateTime[500],tel_no[500],sms_content[500];

                        //取手机号和短信
                        delete_space(tmp);
                        if( strlen(tmp)==0 )
                                continue;
                        memset(tel_no, 0, sizeof(tel_no));
                        memset(sms_content, 0, sizeof(sms_content));
                        if(  GetItemFromStr(tmp, '|', 1, tel_no, sizeof(DateTime)-1 )!=0
                           ||GetItemFromStr(tmp, '|', 2, tel_no, sizeof(tel_no)-1 )!=0
                           ||GetItemFromStr(tmp, '|', 3, sms_content, sizeof(sms_content)-1 )!=0)
                        {
                                Form1->StatusBar1->Panels->Items[0]->Text="短信格式错误!!应为:发送时间|手机号|短信内容";
                                continue;
                        }
                        delete_space(tel_no);
                        delete_space(sms_content);
                        if( strlen(sms_content)==0 || strlen(tel_no)==0 )
                                continue;

                        //装填消息结构
                        memset( &sm_param, 0, sizeof(sm_param) );
                        //sprintf(sm_param.SCA, "%s%s","86", "138000771500");         //中心号(在号码前加"86")
                        //sprintf(sm_param.SCA, "%s%s","86", "13010591500");
                        sprintf(sm_param.SCA, "%s%s","86", sms_center);
                        sprintf(sm_param.TPA, "%s%s", "86" , tel_no);                //对方号码(在号码前加"86")
                        sprintf(sm_param.TP_UD, "%s",sms_content);                   //短消息内容
                        sm_param.TP_PID = 0;                                         //用户信息协议标识
                        sm_param.TP_DCS = GSM_UCS2;                                  //用户信息编码方式

                        //清除串口缓冲区
                        PurgeComm(hComm,PURGE_TXCLEAR);
                        PurgeComm(hComm,PURGE_RXCLEAR);

                        //发送短消息
                        char count=0;
                        while(count<5){
                             tf=gsmSendMessage(&sm_param);
                             if( tf==TRUE )
                                break;
                        }

                        //显示发送结果
                        {
                        TListItem * item;
                        char time[20];
                        item=Form1->ListView1->Items->Add();
                        get_systime1(time);
                        item->Caption=time;
                        item->SubItems->Add(tel_no);
                        item->SubItems->Add(sms_content);
                        if( tf==TRUE )
                               item->SubItems->Add("成功");
                        else
                               item->SubItems->Add("失败");
                        //上滚屏幕
                        Form1->ListView1->Scroll(0, 10000);
                        }
		}//end of 处理完一条记录
                else
                       Sleep(1000);

	}//end while 读文件
}
//---------------------------------------------------------------------------

/******************************************
 功能:  从字符串中取数据数据项
 入参:  str 字符串	如:11|222|3333|44|555555|
        fgf  分隔符     如'|'  
	item_no 项目顺序号
        val     取到的数据项
        val_len 存放数据项缓冲的最大长度
 返回:  0成功  !0失败
*******************************************/
int GetItemFromStr(char * str,char fgf,int item_no,char * val,int val_len )
{
        int len,fgf_no,i,j,count;

        len=strlen(str);
        if( len==0 ){
                val[0]='\0';
                return(0);
        }

        item_no=item_no-1;

        //定位分隔符
        for(i=0,count=0; count<item_no && i<len-1; ){
                for(;str[i]!=fgf&&i<len-1 ; i++);
                        count++;
                if( i==len-1&& count<item_no ){
                        val[0]='0';
                        return(1);
                }
                i++;
        }

        //取数据项
        if( i==len-1 )
                val[0]='0';
        else{
                for(j=0; (str[i]!=fgf)&&(i<len)&&(j<val_len-1); i++,j++)
                        val[j]=str[i] ;
                val[j]='\0';
                if( (j==val_len-1) && (str[i]!=fgf) ) //数据项太长
                        return(2);
        }
	return( 0 );
}

/*****************************************
子 函 数:去掉字符串左右空格,Tab字符,回车符
调用原形:char * delete_space(char *);
作    者:gwq
开发时间:2001.01.26
******************************************/

char * delete_space(char *str)
{
	int i;

	if( (i=strlen(str))==0 )
		//return(NULL);
		return("");
	else
		i=i-1; //数组最大下标

		//去掉尾空,Tab字符,回车符
	for( ; (i>=0)&&((str[i]==' ')|(str[i]==9)|(str[i]==10)) ; i--)
		str[i]='\0';

		//去掉前空,Tab字符,回车符
	for(i=0 ; (str[i]==' ')|(str[i]==9)|(str[i]==10) ; i++);

	strcpy(str,str+i);

	return(str);
}

int get_systime1(char *bgntime)
{
	long k;
	struct tm * tgtime;

	time(&k);
	tgtime=localtime(&k);
	sprintf( (char *)bgntime,"%4d%02d%02d-%02d:%02d:%02d",1900 + tgtime->tm_year,tgtime->tm_mon+1,tgtime->tm_mday,tgtime->tm_hour,tgtime->tm_min,tgtime->tm_sec);
	return ( 0 );       
}

⌨️ 快捷键说明

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