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

📄 zzconnectdlg.cpp

📁 组拨技术
💻 CPP
字号:
// ZZConnectDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ZZConnect.h"
#include "ZZConnectDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define		MULTICAST_IP		"239.9.9.9"
#define		MULTICAST_PORT		999


#include "SmsCtrlLib.h"
#include "ZJ_interface.h"
#include "ZJ_platform.h"
#include "ZJ_datapublic.h"



bool DisposePacket( char * packet );

bool ParseTS( char * buf,int iLength );

bool DisposePAT( char * packet );

bool DisposePMT( char * packet );

bool DisPoseData( char * packet );

#define		BUFFER_SIZE		40980
#define		ONE_PACKET_SIZE		188
char				m_buf[BUFFER_SIZE];				//缓冲区
long				m_lLength = 0;							//缓冲中剩余的长度	
char				m_packet[ONE_PACKET_SIZE];			//包缓冲区
TSHeader	m_header;
PAT			m_pat;
PMTPIDITEM	m_pmt[64];
DATAPID		m_dataPID[64];
PMTDATACIRCLE m_pmtcircle;

PMTDATA		m_PMTdata;
PMTDATA1	m_PMTdata1;
//PACKET处理
bool		m_patHasReceived = false;
bool		m_pmtHasReceived = false;
int m_iIndex = 0;





DWORD	m_requestIdMark;
ZJStreamFilter		m_filter;
UINT32 m_pid = 36;
UINT32 m_pid1 = 69;
UINT32 m_pid2 = 8190;
DWORD dwWaitResult;

HANDLE hEventInit;
HANDLE hEventTuneComplete;
HANDLE hEventAddPIDComplete;
HANDLE hEventRemovePIDComplete;
HANDLE hEventGetStatisticsComplete;
HANDLE hEventGetSITable;
SmsHostApiDeviceHandle hDevice;
SMSHOSTLIB_ERR_CODES_E g_lastError;
SMSHOSTLIB_STATISTICS_ST g_statistics;
CFile g_outFile;

void DataCallback(void*	ClientPtr, 
				  UINT32	ServiceHandle, 
				  UINT8*	pBuffer, 
				  UINT32	BufferSize );

void CallbackFunction( 
					  void*						ClientContext,	
					  SMSHOSTLIB_MSG_TYPE_RES_E	MsgType,		
					  SMSHOSTLIB_ERR_CODES_E		ErrCode,	
					  void* 						pPayload,	
					  UINT32						PayloadLen);

#define VALIDATE_RETVAL(retval,strName) \
	if (retval == SMSHOSTLIB_ERR_OK) \
{ \
	 \
} \
	else \
{ \
	; \
	return 1; \
}

#define VALIDATE_RETVAL_SILENT(retval,strName) \
	if (retval == SMSHOSTLIB_ERR_OK) \
{ \
} \
	else \
{ \
	; \
	return 1; \
}

#define WAIT_CALLBACK(eventName,timeout) \
	dwWaitResult = WaitForSingleObject(eventName,timeout); \
	if (dwWaitResult != WAIT_OBJECT_0) \
{ \
	; \
} \
	if (g_lastError != SMSHOSTLIB_ERR_OK) \
{ \
	; \
}






















/////////////////////////////////////////////////////////////////////////////
// CZZConnectDlg dialog

CZZConnectDlg::CZZConnectDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CZZConnectDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CZZConnectDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}







//	m_socketMul.SetMulticastIP(MULTICAST_IP);
//	m_socketMul.SetMulticastPort(MULTICAST_PORT);
//	m_socketMul.CreateReceiver();
//	m_socketMul.StartReceiving();



void CZZConnectDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CZZConnectDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CZZConnectDlg, CDialog)
	//{{AFX_MSG_MAP(CZZConnectDlg)
	ON_WM_CLOSE()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CZZConnectDlg message handlers

BOOL CZZConnectDlg::OnInitDialog()
{

	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here

	InitSms();
	InitZJ();






//	unsigned char buffer[] = "sdfsdfsdf";
//	sprintf(buffer, "sdfsdfsdf");
//	int iErro = zj_T2Z_SendRetrieved(m_requestIdMark,0,buffer,64);



	return TRUE;  // return TRUE  unless you set the focus to a control
}

void InitPAT(char * packet)
{
	m_header.sync_byte = *packet;
	packet++;
	m_header.error_indicator = (*packet & 0x8000)>>15;
	m_header.payload_indicator = (*packet & 0x4000)>>14;
	m_header.transport_priority = (*packet & 0x2000)>>13;
	m_header.PID = (*packet & 0x1FFFF);
	packet+=2;
	m_header.scrambling = (*packet & 0xC0)>>6;
	m_header.adaptation_field = (*packet & 0x30)>>4;
	m_header.counter = (*packet & 0xF);

}

bool DisposePacket( char * packet )
{
//	InitPAT(packet);
	int iSize = sizeof(TSHeader);

	memcpy(&m_header,packet,iSize);


	char buf[5];
	memset(buf,0,5);

	memcpy(buf,packet,4);

	memcpy(&m_header,buf,4);
/*
	memcpy(&m_header,packet,4);
*/

	int nPID = m_header.PID;

	if( nPID == 0x0000 )		//PAT
	{	
		if( m_patHasReceived )
			return true;

		memset(m_pmt,0,64*sizeof(PMTPIDITEM));
		DisposePAT( packet+4 );
		m_patHasReceived = true;
		return true;
	}

	if( !m_patHasReceived )
		return false;
	else
	{
		//PMT
		for( int i = 0 ; i < 64 ; i++ )
		{
			if( nPID == m_pmt[i].pmt_pid )
			{
				DisposePMT( packet+4 );
				m_pmtHasReceived = true;
			}

		}
		return true;
	}

	if( !m_pmtHasReceived )		//音频视频其他
		return false;
	else
	{
		for( int i = 0 ; i < 64 ; i++ )
		{
			if( nPID == m_dataPID[i].pid )
				DisPoseData( packet+4 );
		}
		
	}
	
	

	return true;
}


bool DisPoseData( char * packet )
{
	return true;
}

bool DisposePMT( char * packet )
{
	char * pointerMark = packet;

	//前64
	int iSize = sizeof(PMTDATA); 
	int iSize1 = sizeof(PMTDATA1); 
	memcpy( &m_PMTdata,packet,iSize );
	packet += iSize;
	//接着的32
	memcpy( &m_PMTdata1,packet,iSize1 );
	packet += iSize1;


	//N1循环的字节数
	int cal = m_PMTdata.section_length - 12 + 3 - m_PMTdata1.program_info_length - 4;

	//判断循环结束的地址
	pointerMark = pointerMark + m_PMTdata.section_length + 3;


	//N1开始指针位置
	packet += m_PMTdata1.program_info_length;

	m_iIndex = 0;
	while( packet != pointerMark )
	{
		//stramtype:第一字节
		BYTE istreamType;
		memcpy( &istreamType,packet,1 );
		m_dataPID[m_iIndex].type = istreamType;
		packet+=1;
		//后4字节
		memcpy( &m_pmtcircle,packet,sizeof(PMTDATACIRCLE) );
		packet+= sizeof(PMTDATACIRCLE);

		m_dataPID[m_iIndex].pid = m_pmtcircle.elemantry_pid;
		
		//description循环
		packet += m_pmtcircle.es_info_length;

		m_iIndex++;
	}
	




	return true;
}



bool DisposePAT( char * packet )
{
	int iSize = sizeof(PAT); 
	memcpy( &m_pat,packet,iSize );
	packet += iSize;
	int n = (m_pat.section_length - 9)/4;


	int iItemSize = sizeof(PATCIRCLE);
	PATCIRCLE circle;
	for( int i = 0 ; i < n ; i++ )
	{
		memcpy( &circle, packet,iItemSize );
		packet += iItemSize;
		m_pmt[i].channel_number = circle.program_number;
		m_pmt[i].pmt_pid = circle.PID;
	}
	return true;
}


			



bool ParseTS( char * buf,int iLength )
{
	int iSize = sizeof(m_buf);
	if( iLength + m_lLength > iSize )		//缓冲长度不够
		return false;

	memcpy( m_buf+m_lLength,buf,iLength );
	m_lLength += iLength;
	char * pCurrent = NULL;
	pCurrent = m_buf;

	while( m_lLength >= ONE_PACKET_SIZE )
	{
		memcpy( m_packet,pCurrent,ONE_PACKET_SIZE );
		if( m_packet[0] != 0x47 )
			::AfxMessageBox(_T("不是188对应"));
		DisposePacket( m_packet );
		pCurrent += ONE_PACKET_SIZE;
		m_lLength -= ONE_PACKET_SIZE;
	}

	memmove( m_buf,pCurrent,m_lLength );

 
	return true;
}





int InitSms()
{
	SMSHOSTLIB_ERR_CODES_E retval;
	bool bDemodulatorLocked;

	hEventInit = CreateEvent(NULL,FALSE,FALSE,NULL);
	hEventTuneComplete = CreateEvent(NULL,FALSE,FALSE,NULL);
	hEventAddPIDComplete = CreateEvent(NULL,FALSE,FALSE,NULL);
	hEventRemovePIDComplete = CreateEvent(NULL,FALSE,FALSE,NULL);
	hEventGetStatisticsComplete = CreateEvent(NULL,FALSE,FALSE,NULL);
	hEventGetSITable = CreateEvent(NULL,FALSE,FALSE,NULL);

	SMSHOSTLIB_API_INITLIB_PARAMS_ST initparams;
	initparams.Size = sizeof(SMSHOSTLIB_API_INITLIB_PARAMS_ST);
	initparams.pCtrlCallback = CallbackFunction;
	initparams.pDataCallback = DataCallback;
	initparams.CommType = SMSHOSTLIB_COMM_SDIO;
	initparams.pCommParam = NULL;
	initparams.WorkingDirectory = 
		"\\Program Files\\SianoSmsUtils";		
	initparams.IsSupportMultInstances = TRUE;
	retval = SmsHostApiLibInit(&initparams);

	DEBUGMSG(TRUE, (TEXT("SmsHostApiLibInit %d\r\n"), retval));

	VALIDATE_RETVAL(retval,"InitLib");

	UINT nDevices;
	SmsHostApiDeviceData_ST deviceData;
	retval = SmsHostApiGetDevicesList(1,&nDevices,&deviceData);
	DEBUGMSG(TRUE, (TEXT("SmsHostApiGetDevicesList %d\r\n"), retval));
	VALIDATE_RETVAL(retval,"GetDevicesList");
//	cout << nDevices << " device(s) returned." << endl;

	retval = SmsHostApiDeviceInit_Req(deviceData.DeviceName,SMSHOSTLIB_DEVMD_DVBT,12000000,NULL,&hDevice);
	DEBUGMSG(TRUE, (TEXT("SmsHostApiDeviceInit_Req %d\r\n"), retval));
	VALIDATE_RETVAL(retval,"InitDevice");
	WAIT_CALLBACK(hEventInit,10000);

	SMSHOSTLIB_FREQ_BANDWIDTH_ET bandwidth = BW_8_MHZ;
	retval = SmsHostApiTune_Req(hDevice,602000000,bandwidth);
	DEBUGMSG(TRUE, (TEXT("SmsHostApiTune_Req %d\r\n"), retval));
	VALIDATE_RETVAL(retval,"Tune");
	WAIT_CALLBACK(hEventTuneComplete,1000);
	bDemodulatorLocked = false;
	for (int i = 0; i < 10 && !bDemodulatorLocked; i++)
	{
		Sleep(50);
		retval = SmsHostApiGetStatistics_Req(hDevice);
		DEBUGMSG(TRUE, (TEXT("SmsHostApiGetStatistics_Req %d\r\n"), retval));
		VALIDATE_RETVAL_SILENT(retval,"GetStatistics");
		WAIT_CALLBACK(hEventGetStatisticsComplete,1000);

		if (g_statistics.IsDemodLocked == 1)
		{
			bDemodulatorLocked = true;
		}
	}

	if (!bDemodulatorLocked)
	{
//		cout << "No transmission found, aborting!" << endl;
		return 1;
	}

	retval = SmsHostApiAddPidFilter_Req(hDevice,m_pid);
	DEBUGMSG(TRUE, (TEXT("SmsHostApiAddPidFilter_Req %d\r\n"), retval));


	

	retval = SmsHostApiAddPidFilter_Req(hDevice,m_pid1);
	DEBUGMSG(TRUE, (TEXT("SmsHostApiAddPidFilter_Req  %d\r\n"), retval));


	retval = SmsHostApiAddPidFilter_Req(hDevice,m_pid2);
	DEBUGMSG(TRUE, (TEXT("SmsHostApiAddPidFilter_Req %d\r\n"), retval));


	WAIT_CALLBACK(hEventAddPIDComplete,1000);



	g_outFile.Open( _T("dump.ts"),CFile::modeCreate|CFile::modeWrite );
	int nSecondsSleep = 10;
//	cout << "Sleeping " << nSecondsSleep << " seconds..." << endl;
//	Sleep(nSecondsSleep * 1000);



	CloseHandle(hEventTuneComplete);
	CloseHandle(hEventInit);
	CloseHandle(hEventAddPIDComplete);
	CloseHandle(hEventGetStatisticsComplete);

	return 0;

	
}



void CallbackFunction( 
					  void*						ClientContext,	
					  SMSHOSTLIB_MSG_TYPE_RES_E	MsgType,		
					  SMSHOSTLIB_ERR_CODES_E		ErrCode,		
					  void* 						pPayload,		
					  UINT32						PayloadLen) 	
{
	g_lastError = ErrCode;
	DEBUGMSG(TRUE,(TEXT("CallbackFunction\r\n")));
	switch(MsgType)
	{
	case SMSHOSTLIB_MSG_INIT_DEVICE_RES:
		SetEvent(hEventInit);
		break;
	case SMSHOSTLIB_MSG_ADD_PID_FILTER_RES:
		SetEvent(hEventAddPIDComplete);
		break;
	case SMSHOSTLIB_MSG_REMOVE_PID_FILTER_RES:
		SetEvent(hEventRemovePIDComplete);
		break;
	case SMSHOSTLIB_MSG_TUNE_RES:
		SetEvent(hEventTuneComplete);
		break;
	case SMSHOSTLIB_MSG_GET_STATISTICS_RES:
		memcpy(&g_statistics,pPayload,sizeof(SMSHOSTLIB_STATISTICS_ST));
		SetEvent(hEventGetStatisticsComplete);
		break;
	case SMSHOSTLIN_MSG_GET_SI_TBL_RES:	    
		SetEvent(hEventGetSITable);
		DEBUGMSG(TRUE,(TEXT("SMSHOSTLIN_MSG_GET_SI_TBL_RES\r\n")));
		break;
	}	
}


int InitZJ()
{
	void * p = NULL;
	int iNodeCount = 512;
	p = &iNodeCount;
	ZJ_T2ZRegFunction reg;
	reg.m_zj_Z2T_SetRetrieveFilter = zj_Z2T_SetRetrieveFilter;
	reg.m_zj_Z2T_StopRetrieve = zj_Z2T_StopRetrieve;

	char  directory[64];
	memset(directory,0,64);
	sprintf(directory, "\\Program Files\\SianoSmsUtils");
	ZJRESULT error = zj_T2Z_Init( (void*)&iNodeCount,&reg,directory );

/*
	char buf[64];
	memset(buf,0,sizeof(64));
	sprintf(buf, MULTICAST_IP);

	char buflocalIP[64];
	memset(buflocalIP,0,sizeof(64));
	sprintf(buflocalIP, "127.0.0.1");


	int MulticastPort = MULTICAST_PORT;
	ZJRESULT error1 = zj_T2Z_SetMulticast(buf,MulticastPort,buflocalIP);
*/
	return 1;
}








void DataCallback(void*	ClientPtr, 
				  UINT32	ServiceHandle, 
				  UINT8*	pBuffer, 
				  UINT32	BufferSize )
{

	ParseTS( (char *)pBuffer,BufferSize );


//	int iError = zj_T2Z_SendRetrieved(m_requestIdMark,0,pBuffer,BufferSize);

	if( g_outFile.m_hFile != CFile::hFileNull )
	{
		g_outFile.SeekToEnd();
		g_outFile.Write( pBuffer,BufferSize );
	}

}

ZJRESULT zj_Z2T_SetRetrieveFilter(unsigned long requestId, ZJStreamFilter filter)
{
//	m_filter = filter;
	UINT32	pActSize = 0;
	UINT8	pTableBuff[4096];
	memset(pTableBuff,0,4096);
	int ie = SmsHostDvbGetSITable_Req(0,0,4096,&pActSize,pTableBuff);
	DEBUGMSG(TRUE, (TEXT("SmsHostDvbGetSITable_Req %d\r\n"), ie));

	m_requestIdMark = requestId;
	ZJRESULT ret=0;


	return ret; 
}

ZJRESULT zj_Z2T_StopRetrieve(unsigned long requestId )
{
	ZJRESULT ret=0;

	return ret; 
}


void CZZConnectDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	if( g_outFile.m_hFile != CFile::hFileNull )
	{
		g_outFile.Close();	
	}


	SMSHOSTLIB_ERR_CODES_E	retval = SmsHostApiRemovePidFilter_Req(hDevice,m_pid);
	DEBUGMSG(TRUE, (TEXT("SmsHostApiRemovePidFilter_Req %d\r\n"), retval));
	retval = SmsHostApiRemovePidFilter_Req(hDevice,m_pid1);
	DEBUGMSG(TRUE, (TEXT("SmsHostApiRemovePidFilter_Req %d\r\n"), retval));
	retval = SmsHostApiRemovePidFilter_Req(hDevice,m_pid2);

	DEBUGMSG(TRUE, (TEXT("SmsHostApiRemovePidFilter_Req %d\r\n"), retval));

	

	WAIT_CALLBACK(hEventRemovePIDComplete,1000);

	SmsHostApiLibTerminate();


	CloseHandle(hEventRemovePIDComplete);
	CloseHandle(hEventGetSITable);


	CDialog::OnClose();
}

void CZZConnectDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	
}

⌨️ 快捷键说明

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