📄 myclient.cpp
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <unistd.h>#include <time.h>#include <pthread.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include "hcnetsdk.h" #include "analyzedata.h"//#define ANALYZEint VIEW_NUM = 1;#define SERVER_IP "192.168.20.119" #define USER_NAME "admin"#define PASSWD "12345"#define PORT 8000#define LOCAL_IP "192.168.20.2"#define LOCAL_PORT 7200#define MULTICAST_IP "224.2.213.100"#define MULTICAST_PORT "10000" #define TRUE 1#define FALSE 0#define CIF_WIDTH 176#define CIF_HEIGTH 144#define MAXCHANNUM 3int32_t glUserID = -1;int32_t glRealHandle[MAXCHANNUM] = {-1};int bGetSysHeader[MAXCHANNUM] = {0};int32_t glVoiceHandle = -1; int32_t gbExit = 1;uint32_t MessCallBack(int32_t lCommand, char *sDVRIP, char *pBuf, uint32_t dwBufLen){ int32_t lIndex = -1; int i; char timestamp[30] = {0}; char frontID[36] = {0}; if(lCommand < EXCEPTION_EXCHANGE) { fprintf(stderr, "lCommand[%x], sDVRIP[%s], pBuf[%s], dwBufLen[%d]\n", lCommand, sDVRIP, pBuf, dwBufLen);#ifdef SDK_ALCATEL if (lCommand == COMM_ALARM) {#ifdef ALCATEL_FRONTIDCFG fprintf(stderr, "ALARM:FrontID:"); for (i=0;i<32;i++) fprintf(stderr, "%d", *(pBuf+i)); fprintf(stderr, "\n\r"); fprintf(stderr, "ALARM:AlarmType:%d\n", ((LPNET_DVR_ALARMINFO)(pBuf+32))->dwAlarmType);#ifdef SDK_ALCATEL_DX if (((LPNET_DVR_ALARMINFO)(pBuf+32))->dwAlarmType == 0) fprintf(stderr, "ALARM:AlarmStatus:%s\n", ((LPNET_DVR_ALARMINFO)(pBuf+32))->dwAlarmStatus ? "signal alarm occur" : "signal alarm stop"); fprintf(stderr, "ALARM:Alarm Code:"); for (i=0;i<6;i++) { fprintf(stderr, "%d", ((LPNET_DVR_ALARMINFO)(pBuf+32))->alarmCode[i]); } fprintf(stderr, "\n\r");#endif#else fprintf(stderr, "ALARM:AlarmType:%d\n", ((LPNET_DVR_ALARMINFO)pBuf)->dwAlarmType);#ifdef SDK_ALCATEL_DX if (((LPNET_DVR_ALARMINFO)pBuf)->dwAlarmType == 0) fprintf(stderr, "ALARM:AlarmStatus:%s\n", ((LPNET_DVR_ALARMINFO)pBuf)->dwAlarmStatus ? "signal alarm occur" : "signal alarm stop"); fprintf(stderr, "ALARM:Alarm Code:"); for (i=0;i<6;i++) { fprintf(stderr, "%d", ((LPNET_DVR_ALARMINFO)pBuf)->alarmCode[i]); } fprintf(stderr, "\n\r");#endif#endif }#ifdef SDK_ALCATEL_DX else if (lCommand == COMM_VIDEOSTATUS) { //memset(timestamp, 0, 30); //memset(frontID, 0, 36); memcpy(timestamp, ((LPNET_DVR_VIDEOSTATUS)pBuf)->TimeStamp, 20); //memcpy(frontID, ((LPNET_DVR_VIDEOSTATUS)pBuf)->byFrontID, 32); fprintf(stderr, "VIDEOSTATUS:FrontID:"); for (i=0; i<32; i++) fprintf(stderr,"%d ", ((LPNET_DVR_VIDEOSTATUS)pBuf)->byFrontID[i]); fprintf(stderr, "\n\r"); fprintf(stderr, "VIDEOSTATUS:TimeStamp:%s\n", timestamp); for (i=0; i<MAX_CHANNUM; i++) fprintf(stderr, "VIDEOSTATUS:Channel[%d]:status:%s\n", i+1, ((LPNET_DVR_VIDEOSTATUS)pBuf)->status[i] ? "Normal" : "Frame Lose"); }#endif#endif } else { lIndex = *((int32_t *)pBuf); switch (lCommand) { case EXCEPTION_EXCHANGE: printf("DVR[%s] network exception\n", sDVRIP); break; case EXCEPTION_AUDIOEXCHANGE: printf("lIndex[%d] audioexchange exception\n", lIndex); break; case EXCEPTION_ALARM: printf("lIndex[%d] alarm exception\n", lIndex); break; case EXCEPTION_PREVIEW: printf("lIndex[%d] preview exception\n", lIndex); break; case EXCEPTION_SERIAL: printf("lIndex[%d] serial exception\n", lIndex); break; default: break; } } return 1;}#ifdef ANALYZEvoid *GetFrameThread(void * pParam){ int i = *(int *)pParam; PACKET_INFO packet; while(gbExit) { if(AnalyzeDataGetPacket(i, &packet) == 0) { fprintf(stderr, "lRealHandle[%d]: Get StreamData! Type[%d], BufSize[%d]\n", i, packet.nPacketType, packet.dwPacketSize); } usleep(10); }}#endifvoid Wait(){ printf("\n======== Press 'q' to quit ============\n"); do { sleep(1); } while(getc(stdin) != 'q'); }int socket_create( char *mode, char *host, int port, char *local ){ int opt; int sock; struct sockaddr_in addr; if( strcmp( mode, "udp" ) != 0 && strcmp( mode, "multicast" ) != 0 ) return -1; memset( &addr, 0, sizeof(addr) ); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr( host ); addr.sin_port = htons( port ); if( addr.sin_addr.s_addr == INADDR_ANY && *host != '0' ) { //���ɴ���������������ַ�ķ��� return -1; } sock = socket( AF_INET, SOCK_DGRAM, 0 ); if( sock < 0 ) return -1; opt = 1; setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt) ); if( IN_MULTICAST( ntohl(addr.sin_addr.s_addr) ) ) { struct ip_mreq cmd; opt = 15; setsockopt( sock, IPPROTO_IP, IP_MULTICAST_TTL, &opt, sizeof(opt) ); opt = 1; setsockopt( sock, IPPROTO_IP, IP_MULTICAST_LOOP, &opt, sizeof(opt) ); addr.sin_addr.s_addr = inet_addr( local ); //INADDR_ANY; if( bind( sock, (struct sockaddr *)&addr, sizeof(addr) ) < 0 ) { fprintf( stderr, "Socket: unable BIND to address [%s:%d]\r\n", inet_ntoa( addr.sin_addr ), ntohs( addr.sin_port ) ); close( sock ); return -1; } cmd.imr_multiaddr.s_addr = inet_addr( host ); cmd.imr_interface.s_addr = inet_addr( local ); //INADDR_ANY;//inet_addr( "192.168.100.47" ); if( setsockopt( sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &cmd, sizeof(cmd) ) < 0 ) { fprintf( stderr, "Socket: unable ADD MEMBERSHIP to address [%s/%s]\r\n", host, inet_ntoa(cmd.imr_interface) ); close( sock ); return -1; } else { fprintf( stderr, "Socket: add to membership %s/%s\r\n", host, inet_ntoa(cmd.imr_interface) ); } } else {/* if( bind( sock, (struct sockaddr *)&addr, sizeof(addr) ) < 0 ) { close( sock ); return -1; }*/ } return sock;}void socket_destroy( int sock, char *host, char *local ){ unsigned long addr = inet_addr( host ); if( IN_MULTICAST( ntohl(addr) ) ) { struct ip_mreq cmd; cmd.imr_multiaddr.s_addr = addr; cmd.imr_interface.s_addr = inet_addr( local ); setsockopt( sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const void *)&cmd, sizeof(cmd) ); } close( sock );}void RealDataCallBack (int32_t lRealHandle, uint32_t dwDataType, char *pBuffer, uint32_t dwBufSize, uint32_t dwUser){ if(dwDataType == NET_DVR_SYSHEAD) { bGetSysHeader[dwUser] = 1; }#ifdef ANALYZE AnalyzeDataInputData(dwUser, (unsigned char *)pBuffer, dwBufSize);#else fprintf(stderr, "lRealHandle[%d]: Get StreamData! Type[%d], BufSize[%d], dwUser[%d]\n", lRealHandle, dwDataType, dwBufSize, dwUser); //printf("%s\n", pBuffer);// Multicast Send //int fd_udp = socket_create( "udp", LOCAL_IP, atoi(source_addr), LOCAL_IP ); //p2 = strchr( target_addr, ':' ); *p2 = '\0'; p2++; int fd_multicast = socket_create( "multicast", MULTICAST_IP, atoi(MULTICAST_PORT), LOCAL_IP ); if( fd_multicast < 0 ) printf("multicast error"); struct sockaddr_in target; memset( &target, 0, sizeof(target) ); target.sin_family = AF_INET; target.sin_addr.s_addr = inet_addr( MULTICAST_IP ); target.sin_port = htons( atoi(MULTICAST_PORT) ); //ѭ�����ݽ���#define NET_BUFFER_SIZE 102400 //��������СΪ100KB#define VIDEO_PACKAGE_SIZE 4096 //hik��Ƶ���ְ���С struct sockaddr_in addr; int addr_len; //char buffer[NET_BUFFER_SIZE]; int recv_len = 0; //���������ݴ�С int len; //int count = 0; int i, count, countyu; //char *slipbuf[]; count = dwBufSize/VIDEO_PACKAGE_SIZE; countyu = dwBufSize%VIDEO_PACKAGE_SIZE; fprintf( stderr, "\r\nstart transform udp data ..." ); //for (i=0; i<count; i++) { //slipbuf[i] = pBuffer+i*4096; //} for (i=0; i<count; i++) { len = sendto( fd_multicast, pBuffer+i*4096, 4096, 0, (struct sockaddr *)&target, sizeof(target) ); } sendto( fd_multicast, pBuffer+count*4096, countyu, 0, (struct sockaddr *)&target, sizeof(target)); //�˳����� //socket_destroy( fd_udp, local_addr, local_addr ); socket_destroy( fd_multicast, MULTICAST_IP, LOCAL_IP ); fprintf( stderr, "\r\ntransformer udp exited.\r\n" );#endif}void RealPlay(NET_DVR_DEVICEINFO *devInfo){ int nMode = PTOPTCPMODE; printf("Please input link mode: [0-PTOPTCPMODE; 1-PTOPUDPMODE;3-PTOPRTPMODE]\n"); scanf("%d", &nMode ); int linkmode = nMode;//PTOPUDPMODE/*PTOPTCPMODE*/PTOPRTPMODE; int usesdl = TRUE; NET_DVR_CLIENTINFO clientInfo; clientInfo.lChannel = devInfo->byStartChan; clientInfo.lLinkMode = linkmode/* | 0x80000000*/;//sub-stream: | 0x80000000 clientInfo.hPlayWnd.x = 0; clientInfo.hPlayWnd.y = 0; INITINFO InitInfo; if(usesdl) { //��ʾ���������Ļ��� InitInfo.uWidth = CIF_WIDTH; InitInfo.uHeight = CIF_HEIGTH; } else { InitInfo.uWidth = 0; InitInfo.uHeight = 0; } //�趨������С if(!NET_DVR_DrawAreaInit(InitInfo)) { printf("DrawAreaInit failed\n"); return ; } if(usesdl) { //�趨���Ŵ��ڴ�С clientInfo.hPlayWnd.uWidth = CIF_WIDTH-1; clientInfo.hPlayWnd.uHeight = CIF_HEIGTH-1; } else { clientInfo.hPlayWnd.uWidth = 0; clientInfo.hPlayWnd.uHeight = 0; } //�鲥����ַ clientInfo.sMultiCastIP = "234.5.6.7"; int i; //char filename[80] = {0}; if (devInfo->byChanNum > 1) //ͨ������Ƿ�����1 { VIEW_NUM = 1; //ͨ���������1������ } else { VIEW_NUM = 1; } for(i=0; i<VIEW_NUM; i++) { clientInfo.lChannel = devInfo->byStartChan + i; if(usesdl) { //���Ż��������Ͻ����� clientInfo.hPlayWnd.x = CIF_WIDTH * (i % 2) ; clientInfo.hPlayWnd.y = CIF_HEIGTH * (i / 2); }#ifdef ANALYZE pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); gbExit = 1; char reg[1] = {0}; if ( pthread_create( &hMainThread, &attr, GetFrameThread, (void *)&i ) < 0 ) { return ; } AnalyzeDataOpenStream(i);#endif //��ʼ���ţ����ص�ǰ�����ľ��� glRealHandle[i] = NET_DVR_RealPlay(glUserID, &clientInfo); if(glRealHandle[i] < 0) { printf(" channel:%d RealPlay failed \n", clientInfo.lChannel); return ; } //printf("glRealHandle:%d\n", glRealHandle[i]); #if 0 // NET_DVR_SaveRealData(glRealHandle[i], "real.mp4"); /* to set callback function */ //���ûص��������û��Լ������ͻ����յ������� NET_DVR_SetRealDataCallBack(glRealHandle[i], RealDataCallBack, i);#endif uint32_t BrightValue; uint32_t ContrastValue; uint32_t SaturationValue; uint32_t HueValue; //��ȡ��Ƶ���� NET_DVR_ClientGetVideoEffect(glRealHandle[i], &BrightValue, &ContrastValue, &SaturationValue, &HueValue); printf("RealHandle:%d BrightValue:%d ContrastValue:%d SaturationValue:%d HueValue:%d \n",glRealHandle[i], BrightValue, ContrastValue, SaturationValue, HueValue); } Wait();// sleep(10); for(i=0; i<VIEW_NUM; i++) { if(glRealHandle[i] >= 0) { //NET_DVR_StopSaveRealData(glRealHandle[i]); NET_DVR_StopRealPlay(glRealHandle[i]); glRealHandle[i] = -1; gbExit = 0; fprintf(stderr, "StopRealPlay \n");#ifdef ANALYZE AnalyzeDataClose(i);#endif } } sleep(1); NET_DVR_DrawAreaRelease();}const char *usageinfo[] = {"######### Usage #############","1. RealPlay.","######### End ##############"};int main(int argc, char *argv[]){ //NET_DVR_LOG dvrlog; NET_DVR_DEVICEINFO devInfo; int cmd = 0, usageinfolength; char *localip = LOCAL_IP; char *serverip = SERVER_IP;/* printf("Please input local ip:\n"); scanf("%s", localip ); printf("Please input server ip:\n"); scanf("%s", serverip );*/ //initialization if(!NET_DVR_Init()) //��ʼ�� { printf("HC Clientdemo Init failed\n"); return -1; } #ifdef ANALYZE AnalyzeDataInit(); //��ʼ����֡#endif #if 0 if (!NET_DVR_SetConnectTime(5000, 3)) { //������ӳ�ʱʱ����������� fprintf(stderr, "%d:errno[%d]\n", __LINE__, NET_DVR_GetLastError()); return -1; }#endif //set callback ���ý����豸��Ϣ�Ļص����� //NET_DVR_SetDVRMessCallBack(MessCallBack); //start listen ����������,�����豸�˵���Ϣ#if 1 printf("start !!!! \n"); if( !NET_DVR_StartListen(localip, LOCAL_PORT) ) { printf("StartListen failed ... LastError[%d]\n", NET_DVR_GetLastError()); //�ͷ���������Դ NET_DVR_Cleanup(); return -1; }#endif #ifdef SDK_ALCATEL#if 0 if( !NET_DVR_StartUdpServer(localip, LOCAL_PORT) ) { printf("StartUdpServer failed ... LastError[%d]\n", NET_DVR_GetLastError()); NET_DVR_Cleanup(); return -1; }#endif#endif //�û����豸��ע�� glUserID = NET_DVR_Login(serverip, PORT, USER_NAME, PASSWD, &devInfo); if(glUserID < 0) { //��ȡ��������,����ֵ�ο�SDK�ĵ� printf( "Login DVR failed ... LastError[%d]\n", NET_DVR_GetLastError() ); NET_DVR_StopListen(); NET_DVR_Cleanup(); return -1; } printf("g_lUserID = %d\n", glUserID); printf( "DevInfo.sSerialNumber[%s],\n" "DevInfo.byAlarmInPortNum[%d],\n" "DevInfo.byAlarmOutPortNum[%d],\n" "DevInfo.byDiskNum[%d],\n" "DevInfo.byDVRType[%d],\n" "DevInfo.byChanNum[%d],\n" "DevInfo.byStartChan[%d].\n", devInfo.sSerialNumber, devInfo.byAlarmInPortNum, devInfo.byAlarmOutPortNum, devInfo.byDiskNum, devInfo.byDVRType, devInfo.byChanNum, devInfo.byStartChan ); usageinfolength = sizeof(usageinfo)/sizeof(*usageinfo); for (int i = 0; i< usageinfolength; i++) printf("%s\n", *(usageinfo+i)); while(1) { printf("\nPlease input number 1 or Press 88 to quit:\n"); scanf("%d", &cmd ); switch(cmd) { case 1: RealPlay(&devInfo); break; case 88: goto Exit; break; default: printf("Wrong choices!\n"); break; } } sleep(100);Exit: NET_DVR_Logout(glUserID); //sleep(1); NET_DVR_StopListen();#ifdef SDK_ALCATEL_DX NET_DVR_StopUdpServer();#endif#ifdef ANALYZE AnalyzeDataCleanup();#endif printf("Cleanup\n"); NET_DVR_Cleanup(); return 1;//end}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -