📄 sendsmsthread.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 + -