`
弄月吟风
  • 浏览: 198447 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Android监控

 
阅读更多

Android的监控一般都是需要用到Jni的,然后进行NDK编译,现在的工业探头走的都是srtp协议,所以接下来就走一下这个协议,首先我们需要创建一个线程用来负责走tcp协议,让探头给我们发送视频数据void *conTrolThread(void *lpParam) {

	char szResponse[1024];
	char szSendBuf[1024];
	int nRet = 0;
	int nTimeOut = 5000;
	//	setsockopt(rtsp_Socket, SOL_SOCKET, SO_RCVTIMEO, (char*) &nTimeOut,
	//			sizeof(nTimeOut));
	rtsp_Socket = socket(AF_INET, SOCK_STREAM, 0);//创建socket
	if (rtsp_Socket < 0) {//告诉Java创建Sock失败
		return 0;
	}
	struct sockaddr_in addrSrv;
	addrSrv.sin_addr.s_addr = inet_addr(m_IP);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(m_Port);
	if (SOCKET_ERROR == connect(rtsp_Socket, (struct sockaddr*) &addrSrv,
			sizeof(struct sockaddr))) {//告诉Java创建Sock失败
		LOGD("失败\n");
		close(rtsp_Socket);
		rtsp_Socket = -1;
		return 0;
	}
	char lstrOptions[1024] = "OPTIONS rtsp://%s:%d/H264 RTSP/1.0\r\n"
		"CSeq: 1\r\n"
		"\r\n";
	sprintf(szSendBuf, lstrOptions, m_IP, m_Port);
	send(rtsp_Socket, szSendBuf, 1024, 0);
	memset(szResponse, 0, sizeof(szResponse));
	nRet = recv(rtsp_Socket, &szResponse[0], 1024, 0);
	char lstrDescribe[1024] = "DESCRIBE rtsp://%s:%d/H264 RTSP/1.0\r\n"
		"CSeq: 2\r\n"
		"Content-Length: 0\r\n"
		"\r\n";
	memset(szSendBuf, 0, sizeof(szSendBuf));
	sprintf(szSendBuf, lstrDescribe, m_IP, m_Port);
	send(rtsp_Socket, szSendBuf, 1024, 0);
	memset(szResponse, 0, sizeof(szResponse));
	nRet = recv(rtsp_Socket, &szResponse[0], 1024, 0);
	char lstrSetup[1024] = "SETUP rtsp://%s:%d/H264 RTSP/1.0\r\n"
		"CSeq: 3\r\n"
		"Transport: RTP/AVP;unicast;client_port=6666-6667\r\n"
		"\r\n";
	memset(szSendBuf, 0, sizeof(szSendBuf));
	sprintf(szSendBuf, lstrSetup, m_IP, m_Port);
	send(rtsp_Socket, szSendBuf, 1024, 0);
	memset(szResponse, 0, sizeof(szResponse));
	nRet = recv(rtsp_Socket, &szResponse[0], 1024, 0);
	char Session[100];
	int i = 0, j = 0;
	for (; i < strlen(szResponse) - 9; i++) {
		if ('S' == szResponse[i] && 'e' == szResponse[i + 1] && 's'
				== szResponse[i + 2] && 's' == szResponse[i + 3] && 'i'
				== szResponse[i + 4] && 'o' == szResponse[i + 5] && 'n'
				== szResponse[i + 6] && ':' == szResponse[i + 7] && ' '
				== szResponse[i + 8]) {
			while (szResponse[i + 9 + j] != '\r' && szResponse[i + 10 + j]
					!= '\n') {
				Session[j] = szResponse[i + 9 + j];
				j++;
			}
			break;
		}
	}
	char lstrPlay[1024] = "PLAY rtsp://%s:%d/H264 RTSP/1.0\r\n"
		"CSeq: 4\r\n"
		"Content-Length: 0\r\n"
		"Session: %s\r\n"
		"Range: npt=0.000-\r\n"
		"\r\n";
	memset(szSendBuf, 0, sizeof(szSendBuf));
	sprintf(szSendBuf, lstrPlay, m_IP, m_Port, Session);
	send(rtsp_Socket, szSendBuf, 1024, 0);
	send(rtsp_Socket, lstrDescribe, 1024, 0);
	memset(szResponse, 0, sizeof(szResponse));
	nRet = recv(rtsp_Socket, &szResponse[0], 1024, 0);
	LOGD("\n");
}

 接下来创建一个接收线程用来负责数据的接收

void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen) {
	(jvm_save)->AttachCurrentThread(&env_save, NULL);
	jarrayVideo = (env_save)->NewByteArray(352 * 288 * 2);
	int hr;
	unpack = new RtpUnPack(hr);
	int n;
	int outSize = 0;
	socklen_t len = clilen;
	unsigned char mesg[20480];
	int isFindIFrame = 0;
	long timebase = 0;
	InitDecoder(352, 288);
	while (canReceive) {
		/* waiting for receive data */
		memset(mesg, 0, sizeof(mesg));
		n = recvfrom(sockfd, mesg, 2048, 0, pcliaddr, &len);
		outSize = 0;
		//接受到视频数据开始拼桢
		BYTE *pFrame = unpack->Parse_RTP_Packet(mesg, n, &outSize);
		if (timebase == 0 || timebase <= unpack->m_RTP_Header.ts) {
			timebase = unpack->m_RTP_Header.ts;
		} else {
			continue;
		}
		if (pFrame != NULL) {
			if (isFindIFrame == 0) {
				if (outSize > 1456) {
					isFindIFrame = 1;
				} else {
					continue;
				}
			}
			int len = outSize;
			if (DecoderNal(pFrame, len, videoVideoData) > 0) {
				disPlayVideo(0, (char *) videoVideoData, c->width, c->height, 0);
			}
		}
	}
	UninitDecoder();
	(env_save)->ReleaseByteArrayElements(jarrayVideo, (jbyte*) videoVideoData,
			0);
	(jvm_save)->DetachCurrentThread();
}
void *recvThread(void *lpParam) {
	int sockfd;
	struct sockaddr_in servaddr, cliaddr;
	sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */
	/* init servaddr */
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(6666);
	/* bind address and port to socket */
	if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) {
		perror("bind error");
		exit(1);
	}
	do_echo(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr));
	LOGD("接收线程关闭\n");

}
 

 

  • 大小: 29.8 KB
  • 大小: 37.3 KB
  • 大小: 27.6 KB
分享到:
评论

相关推荐

    android监控pc应用_android端

    标题中的“android监控pc应用_android端”指的是一个Android应用程序,其功能是使用户能够远程监控PC(个人计算机)的屏幕。这种类型的应用通常基于网络通信技术,如TCP/IP协议,使得Android设备可以作为远程控制...

    Android监控别人的行踪.zip

    【Android监控技术详解】 在移动设备的广泛应用中,Android系统占据了相当大的市场份额,这使得它成为了个人信息处理的重要平台。然而,随着技术的发展,Android设备的监控功能也引起了人们的关注,尤其是对于家长...

    gpsdemo_GPS_android_android监控_android定位_监控.zip

    标题中的“gpsdemo_GPS_android_android监控_android定位_监控.zip”表明这是一个关于Android平台上的GPS定位与监控系统的示例项目。这个项目可能包含了实现GPS定位、数据监控以及Android应用开发的相关代码和资源。...

    sp_java_handsomemmf_socket_android监控_android_

    标题 "sp_java_handsomemmf_socket_android监控_android_" 暗示了这是一个关于使用Java、Socket编程技术在Android平台上实现手机实时视频监控的项目。描述指出,源码包括了客户端代码,这意味着开发者可以了解并学习...

    android 海康监控 视频

    【海康威视Android监控应用详解】 在现代安防领域,海康威视作为一个知名的监控设备制造商,提供了丰富的产品线和解决方案。本文将详细介绍如何在Android设备上使用海康威视的监控系统,以及如何配置和访问监控视频...

    android 监控

    首先,**系统日志收集**是Android监控的基础,通过`Logcat`工具可以获取设备运行时的日志信息,包括应用程序、系统服务、硬件模块等各种事件。开发者可以使用`adb logcat`命令或集成在IDE(如Android Studio)中的...

    gpsdemo_GPS_android_android监控_android定位_监控_源码.zip

    【Android监控】 这里的“监控”可能指的是两个方面:一是对用户位置的实时跟踪,二是对应用程序自身运行状态的监控。对于前者,开发者可以通过周期性地获取位置更新来实现,例如设置LocationListener监听位置变化...

    Android 监控别人的行踪.zip

    "源码的重要性.txt"文件可能包含了实现这些功能的源代码示例,深入研究这些源码可以帮助我们更好地理解和实践Android监控技术。而"监控别人的行踪"这个文件名暗示了实际应用场景,可能是关于如何在合法范围内实现...

    android监控pc应用_服务端

    标题中的“android监控pc应用_服务端”指的是一个Android应用程序,其主要功能是实现对PC(个人计算机)的远程监控,而这里的“服务端”部分则意味着这个应用扮演了服务器的角色,接收并处理来自Android客户端的请求...

    Android监控S7PLCIO.rar

    标题“Android监控S7PLCIO.rar”指出的是一个基于Android平台的应用程序,该应用设计用于监测局域网内的西门子S7系列PLC(可编程逻辑控制器)的输入/输出(IO)状态。这涉及到工业自动化领域的远程监控技术,特别是...

    android监控音量键并自定义动画

    本示例“android监控音量键并自定义动画”着重讲解了如何监听音量键事件以及创建自定义动画效果,这对于音乐播放器、视频应用等多媒体应用尤其重要。 首先,我们要理解如何在Android中监听音量键事件。这通常通过...

    微信扫码个人免签支付系统php源码和Android监控助手全套

    在描述中提到的“Android监控助手全套”可能是指一个配套的Android应用程序,用于帮助商家实时监控和管理支付状态,确保交易的顺利进行。这个助手可能包含的功能有:实时推送交易通知、查看交易详情、统计收入报表、...

    Android系统资源实时监控工具

    在Android开发过程中,系统资源的实时监控是至关重要的,它能帮助开发者理解应用程序的性能表现,定位并优化可能存在的问题。这款"Android系统资源实时监控工具"是一个轻量级的解决方案,专为开发者设计,提供了丰富...

    Android手机远程监控源码.zip

    在Android平台上实现手机远程监控,通常涉及到多个技术领域,包括网络通信、图像处理、设备权限管理等。这个项目"Android手机远程监控源码"可能是提供了一整套解决方案,让我们一起探讨其中可能涉及的关键知识点。 ...

    android远程视频监控源码

    在本文中,我们将深入探讨基于Android的远程视频监控系统的核心知识点。这个系统源码的提供意味着我们可以了解到如何在Android平台上实现远程视频流的接收、处理和显示,这对于开发者来说是宝贵的资源。 首先,我们...

    android性能参数监控工具

    在Android开发过程中,性能参数监控是一项至关重要的任务,它能够帮助开发者发现并优化应用程序的性能问题,提升用户体验。本文将围绕“android性能参数监控工具”这一主题,详细讲解相关知识点。 首先,我们要理解...

    Android视频监控源码9_CamMonitor

    【Android视频监控源码9_CamMonitor】是一个专门为Android平台设计的视频监控应用程序的源代码。这个项目旨在帮助开发者理解如何在Android设备上实现实时的视频流监控功能,适用于智能家居、安全监控等领域。通过...

    Android网络监控(监控Http速度、扫描Rssi、ping实现、Ftp实现)

    Http 主要监控网络的速度,时延 Ping 测量发包、丢包、发送时延等数据 Rssi 扫描周边的AP信息,并展示出来 Ftp 实现Ftp客户端的上传和下载,如需使用此功能,需要自己在代码中填写服务器地址、端口号、用户名和密码...

Global site tag (gtag.js) - Google Analytics