?? modeocom.cpp
字號:
//if(R_Waite_Event==NULL || R_Message_Event==NULL) return;
::SetEvent(R_Message_Event);
Sleep(0);
return;
WaitForSingleObject(R_Waite_Event,2000+DEBUG_TIME);
::ResetEvent(R_Waite_Event);
}
long ModeoCom::GetLength(){return R_ln;}
long ModeoCom::Read(void * lpData, WORD ln)
{
int k;
k=ln;
if(ln>m_ln) k=m_ln;
memcpy(lpData,m_buf,k);
m_ln-=k;
if(m_ln<0) m_ln=0;
//::SetEvent(R_Waite_Event);//通知等待線程,數(shù)據(jù)已OK
return k;
}
void ModeoCom::Cls()
{
R_ln=0;
m_Code=0;
if(Read_Event!=NULL) ::ResetEvent(Read_Event);
}
long ModeoCom::Send(void * lpData, WORD ln)
{
int f,k,lw,s,n;
static BYTE ch[64];
BYTE *ip=(BYTE*)lpData;
if(hCom==NULL||hCom==(void*)0xffffffff) return 0;
lw=0;
while(lw<ln)
{
k=ln-lw;
if(k==0) return ln;
if(k>1750) k=1750;
*(DWORD*)&S_buf[0]=0xBABABABA;
*(WORD*) &S_buf[6]=ln;
*(DWORD*)&S_buf[8]=GetCRC32(&ip[lw],k);
*(DWORD*)&S_buf[12]=GetTickCount();//本次數(shù)據(jù)ID
*(WORD*) &S_buf[4]=k;//本次數(shù)據(jù)長
memcpy(&S_buf[16],&ip[lw],k);
lw+=k;
k+=16;
f=0;
while(f<8)
{
Cls();//清隊收發(fā)標致
n=0;
while(n<4)
{
if(TxData(S_buf,k)==k) break;
sprintf((char*)ch,"ERR1:A=%d,B=%d,C=%d,T=%d,k=%d",m_Code,m_Link,f,n,k);
SaveData((char*)ch);
n++;
}
if(Waite(5000))break;
if(m_Link!=16)
{
sprintf((char*)ch,"ERR4:A=%d,B=%d,C=%d,T=%d,k=%d",m_Code,m_Link,f,n,k);
SaveData((char*)ch);
return -1;
//已斷線了
}
if(m_Code!=1)
{
sprintf((char*)ch,"ERR2:A=%d,B=%d,C=%d,R=%d",m_Code,m_Link,f,R_ln);
SaveData((char*)ch);
Sleep(500);
if(m_Code==0) Sleep(5000-f*500);
memset(ch,0,32);
for(s=0;s<56;s++) TxData(ch,32);//補發(fā)一次零數(shù)據(jù),已清空對方結緩沖區(qū)
}
f++;
}
}
if(lw!=ln)
{
sprintf((char*)ch,"ERR3:A=%d,B=%d,C=%d",m_Code,m_Link,f);
SaveData((char*)ch);
}
return lw;
}
BOOL ModeoCom::TestLink()
{
if(hCom==NULL||hCom==(void*)0xffffffff) return FALSE;
return TRUE;
}
/*
第一步:執(zhí)行MODEO復位操作 ATZ0
執(zhí)行ATW2要求返回實際連接速度
第二步:ATD電話號碼。
數(shù)據(jù)傳送
如果數(shù)據(jù)發(fā)不出?
第三步:+++
第四步:ATH0掛機
*/
BOOL ModeoCom::TallPh(char * tall)//撥號
{
DWORD k;
MSG msg;
R_ln=0;
if(hCom==NULL||hCom==(void*)0xffffffff) return FALSE;
m_RxSeek=0;
m_TxSeek=0;
m_Code=0;
R_ln=0;
m_NEW=FALSE;
m_BEAK_ph=TRUE;
memset(Err_code,0,32);
memset(S_buf,0,128);
sprintf((char*)S_buf,"ATDT%s",tall);
k=strlen((char*)S_buf);
S_buf[k]=0x0D;k++;
if(TxData(S_buf,k)!=(long)k)
{
sprintf(Err_code,"無法發(fā)送號碼:%s",tall);
return FALSE;
}
Sleep(1000);//等-秒
m_NEW=FALSE;
m_End_Code=128;
m_Link=1;//正在連接
k=GetTickCount();
while(GetTickCount()-k<60000)
{
switch(m_End_Code)
{
case 0://0、已連接
strcpy(Err_code,"OK,已成功連接");
if(m_TxSeek==0) m_TxSeek=m_RxSeek;
R_ln=0;
m_ln=0;
m_Input=0;
m_End_Code=128;
m_Link=16;
return TRUE;
break;
case 1://1、OK
break;
case 2://2、來電
strcpy(Err_code,"來電");
k=130;
break;
case 3://對方不應答
strcpy(Err_code,"對方不應答");
R_ln=0;
m_End_Code=128;
m_Link=0;
return FALSE;
break;
case 4://4、錯誤
R_ln=0;
m_End_Code=128;
m_Link=0;
return FALSE;
break;
case 5://5、未檢測到撥號音
strcpy(Err_code,"沒有撥號音");
R_ln=0;
m_End_Code=128;
m_Link=0;
return FALSE;
break;
case 6://6、檢測到忙音
strcpy(Err_code,"電話占線或對方不應答");
R_ln=0;
m_End_Code=128;
m_Link=0;
return FALSE;
break;
case 7://7、無靜音應答
strcpy(Err_code,"無靜音應答");
R_ln=0;
m_End_Code=128;
m_Link=0;
return FALSE;
break;
case 8://8、所撥的號碼已延遲
strcpy(Err_code,"來電");
R_ln=0;
m_End_Code=128;
m_Link=0;
return FALSE;
break;
default:
Sleep(20);
if(!m_BEAK_ph)
{
strcpy(Err_code,"手動掛斷電話了");
return FALSE;
}
break;
}
}
m_Link=0;
strcpy(Err_code,"等待超時,沒有收到調解器的任何有用信息");
m_End_Code=128;
return FALSE;
}
DWORD ModeoCom::FenTallChar(BOOL TX)
{
int n,f;
if(R_ln==0) return 128;
for(int k=0;k<R_ln;k++)
{
for(n=0;n<MAX_COMMDAND_STR;n++)
{
if(memcmp(End_code[n],&R_buf[k],strlen(End_code[n]))==0)
{
if(TX)
{
k+=strlen(End_code[n]);
for(f=0;f<R_ln-k;f++)
{
R_buf[f]=R_buf[f+k];
}
if(R_ln>k) R_ln-=k;
else R_ln=0;
}
return n;
}
}
}
return 128;
}
BOOL ModeoCom::SendCommand(char * comx)//執(zhí)行AT指令
{
BYTE ch[64];
MSG msg;
if(hCom==NULL||hCom==(void*)0xffffffff) return FALSE;
DWORD tx=8000;
memset(command,0,64);
strcpy((char*)ch,comx);
DWORD k=strlen((char*)ch);
command_ln=k;
strcpy(command,comx);
if(strcmp(comx,"AT")==0) tx=1000;
ch[k]=0x0D;
k++;
m_End_Code=128;
SaveData(comx);
if(strcmp(comx,"+++")==0) k=3;
if(memcmp(comx,"ATA",3)==0) tx=60000;//如果是應答命令則等長一些
if(TxData(ch,k)!=(long)k) return FALSE;
Sleep(50);
k=GetTickCount();
while(GetTickCount()-k<tx)
{
switch(m_End_Code)
{
case 1:
m_End_Code=128;
return TRUE;
break;
case 4:
m_End_Code=128;
return FALSE;
break;
case 128:
break;
default:
m_End_Code=128;
return TRUE;
break;
}
}
SaveData("超時");
m_End_Code=128;
return FALSE;
}
BOOL ModeoCom::FindThDataMac()//分析來電顯示
{
BOOL Tm[3];
int k,n;
Tm[0]=FALSE;
Tm[1]=FALSE;
Tm[2]=FALSE;
if(R_ln==8) return FALSE;
for(k=0;k<R_ln;k++)
{
if(*(DWORD*)&R_buf[k] == *(DWORD*)"DATE") Tm[0]=TRUE;
if(*(DWORD*)&R_buf[k] == *(DWORD*)"TIME") Tm[1]=TRUE;
if(*(DWORD*)&R_buf[k] == *(DWORD*)"NMBR") Tm[2]=TRUE;
}
if(!Tm[0] || !Tm[1] || !Tm[2]) return FALSE;//沒有來電
memset(VCID_time,0,16);
memset(VCID_data,0,16);
memset(VCID_ph,0,32);
//把后繼數(shù)據(jù)取完
do
{
Sleep(100);
n=GetRvcLength();
if(n>0)
{
m_Tall_time=GetTickCount();
if(R_ln>65535) R_ln=0;
k=65535-R_ln;
if(k>n) k=n;
k=RxData(&R_buf[R_ln],k);
if(k>0) R_ln+=k;
R_buf[R_ln]=0;
}
}while(n>0);
for(k=0;k<R_ln;k++)
{
if(*(DWORD*)&R_buf[k] == *(DWORD*)"TIME")
{
k+=4;
n=k;
while(k<R_ln)
{
if(R_buf[k]>='0' && R_buf[k]<='9') //去掉前面的空格
{
n=k;
break;
}
k++;
}
while(k<R_ln)
{
if(R_buf[k]<'0' || R_buf[k]>'9')
{
R_buf[k]=0;
break;
}
k++;
}
if(strlen((char*)&R_buf[n])<16)strcpy(VCID_time,(char*)&R_buf[n]);//來電時間
}
if(*(DWORD*)&R_buf[k] == *(DWORD*)"DATE")
{
k+=4;
n=k;
while(k<R_ln)
{
if(R_buf[k]>='0' && R_buf[k]<='9') //去掉前面的空格
{
n=k;
break;
}
k++;
}
while(k<R_ln)
{
if(R_buf[k]<'0' || R_buf[k]>'9')
{
R_buf[k]=0;
break;
}
k++;
}
if(strlen((char*)&R_buf[n])<16)strcpy(VCID_data,(char*)&R_buf[n]);//來電時間
}
if(*(DWORD*)&R_buf[k] == *(DWORD*)"NMBR")
{
k+=4;
n=k;
while(k<R_ln)
{
if(R_buf[k]>='0' && R_buf[k]<='9') //去掉前面的空格
{
n=k;
break;
}
k++;
}
while(k<R_ln)
{
if(R_buf[k]<'0' || R_buf[k]>'9')
{
R_buf[k]=0;
break;
}
k++;
}
if(strlen((char*)&R_buf[n])<32)
{
strcpy(VCID_ph,(char*)&R_buf[n]);//來電號碼
m_End_Code=32;//顯電了
m_End_CodeEx=32;
sprintf(command_str,"電話:%s 時間:%s:%s",VCID_ph,VCID_data,VCID_time);
//sprintf(command_ok, "電話:%s 時間:%s:%s",VCID_ph,VCID_data,VCID_time);
sprintf(command_ok,"來電:%s",VCID_ph);
m_NEW=TRUE;
Sleep(200);
R_ln=0;
return TRUE;
}
}
}
memset(VCID_time,0,16);
memset(VCID_data,0,16);
memset(VCID_ph,0,32);
return FALSE;
}
void ModeoCom::AddTall(char * ip)//加入電話號碼
{
if(ip[0]==0) return;
strcpy(MAC_th[num],ip);
if(num<32) num++;
}
void ModeoCom::DownPh()
{
if(m_Link==0) return;
if(m_Link==16)SendCommand("+++");
sprintf(command_ok,"請稍后,掛斷電話");
m_NEW=TRUE;
if(SendCommand("ATH0"))
{
SaveData("掛斷電話");
m_Link=0;
m_BEAK_ph=FALSE;
sprintf(command_ok,"OK!電話已掛斷");
m_NEW=TRUE;
if(m_hWnd!=NULL)::PostMessage(m_hWnd,RING_COM,3,0);
}
}
void ModeoCom::Link()//手動連接
{
m_Link=1;//正在連接
SaveData("手動應答");
sprintf(command_ok,"請稍后,正在應答......");
m_NEW=TRUE;
SendCommand("ATA");
SaveData("手動應答OK");
}
void ModeoCom::PhAutoMac()//根據(jù)電話號碼應答
{
int k,n,ln,lx;
lx=strlen((char*)VCID_ph);
for(k=0;k<num;k++)
{
ln=strlen((char*)MAC_th[k]);
ln-=lx;
for(n=0;n<=ln;n++)
{
if(memcmp(&MAC_th[k][n],VCID_ph,lx)==0)
{
SaveData("號嗎應答ATA");
m_Link=1;//正在連接
sprintf(command_ok,"正在應答:%s",VCID_ph);
m_NEW=TRUE;
//SendCommand("ATA");
BYTE cx[8];
strcpy((char*)cx,"ATA");
cx[3]=0x0D;
TxData(cx,4);
SaveData(command_ok);
return;
}
}
}
}
void ModeoCom::Lock()
{
if(hMutex ==NULL) hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"MODEM_SEND_Mutex");//申請同步事件
if(hMutex!=NULL) WaitForSingleObject(hMutex,10000);//==WAIT_OBJECT_0)
}
void ModeoCom::UnLock()
{
ReleaseMutex(hMutex);
}
void ModeoCom::SaveData(char *ip)
{
BYTE buf[32];
if(OPEN==0)
{
if(!m_fp.Open("modemdata.ini",CFile::modeWrite))
{
#ifdef _DEBUG
if(!m_fp.Open("modemdata.ini",CFile::modeWrite|CFile::modeCreate))
{
OPEN=1;
return;
}
else
{
OPEN=16;
}
#else
OPEN=1;
return;
#endif
}
else
{
OPEN=16;
m_fp.SeekToEnd();
m_fp.Write("-----------------------------",strlen("-----------------------------"));
buf[0]=0x0D;
buf[1]=0x0A;
m_fp.Write(buf,2);
}
}
if(OPEN!=16) return;
SYSTEMTIME ts;
::GetLocalTime(&ts);
sprintf((char*)buf,"%02d %02d:%02d:%02d ",ts.wDay,ts.wHour,ts.wMinute,ts.wSecond);
m_fp.SeekToEnd();
m_fp.Write(buf,strlen((char*)buf));
m_fp.Write(ip,strlen(ip));
buf[0]=0x0D;
buf[1]=0x0A;
m_fp.Write(buf,2);
}
DWORD ModeoCom::GetTai(){return m_Link;}
BOOL ModeoCom::GetVCIDph()
{
if(VCID_ph[0]==0) return FALSE;
return TRUE;
}
char* ModeoCom::GetTallName(){return VCID_ph;}
void ModeoCom::SendKey(BYTE TR, UINT nChar, UINT nRepCnt, UINT nFlags)
{
BYTE mx[32];
memset(mx,0,16);
*(DWORD*)&mx[0]=0xBABABAB2;
mx[4]=TR;
mx[5]=nChar;
mx[6]=nRepCnt;
mx[7]=nFlags;
TxData(mx,8);
/*KEY_TABE[5]=TR;
KEY_TABE[6]=nChar;
KEY_TABE[7]=nRepCnt;
KEY_TABE[8]=nFlags;
TxData(KEY_TABE,16*4);*/
}
void ModeoCom::SendMouse(DWORD key, CPoint point)
{
BYTE mx[32];
*(DWORD*)&mx[0]=0xBABABAB1;
*(DWORD*)&mx[4]=key;
*(CPoint*)&mx[8]=point;
TxData(mx,16);
}
int ModeoCom::SendExMessage(void *lpData, WORD ln)
{
if(hCom==NULL||hCom==(void*)0xffffffff) return 0;
Cls();//清隊收發(fā)標致
if(TxData(lpData,ln)!=ln) return 0;
if(WaiteEx(5000)) return 1;
return m_Code;
}
BOOL ModeoCom::WaiteEx(DWORD tx)
{
Sleep(0);//切換線程
MSG msg;
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(GetMessage(&msg, NULL, 0, 0) == FALSE)
{
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(m_Code==1) return TRUE;
if(m_Code==2) return FALSE;
DWORD tr=GetTickCount();
while(GetTickCount()-tr<tx+DEBUG_TIME)
{
if(m_Code==1) return TRUE;
if(m_Code==2) return FALSE;
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(GetMessage(&msg, NULL, 0, 0) == FALSE)
{
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(Read_Event!=NULL)
{
::WaitForSingleObject(Read_Event,1000);
::ResetEvent(Read_Event);
}
if(m_Code==1) return TRUE;
if(m_Code==2) return FALSE;
}
return FALSE;
}
BOOL ModeoCom::RxFile(int k, BYTE *m_sou)
{
return TRUE;
}
void ModeoCom::GetPh(DWORD ID)
{
BYTE buf[16];
*(DWORD*)&buf[0]=0xBFBCBE9F;
*(DWORD*)&buf[4]=ID;
TxData(buf,8);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -