精华内容
下载资源
问答
  • 手机远程监控系统

    2021-01-19 21:08:48
    日前,笔者在《2005(天津)国际社会公共安全产品与防范技术博览会》上找到了答案——民扬集团上海多媒体有限公司自主研发生产的新一代监控系统“猎影”手机远程监控系统。就该系统的有关情况,笔者展会现场采访了该...
  • 基于Android的手机远程监控客户端和服务器端源代码分享 基于Android的手机远程监控客户端和服务器端源代码分享
  • 日前,笔者在《2005(天津)国际社会公共安全产品与防范技术博览会》上找到了答案——民扬集团上海多媒体有限公司自主研发生产的新一代监控系统“猎影”手机远程监控系统。就该系统的有关情况,笔者展会现场采访了该...
  • android 手机远程监控

    2010-06-21 11:53:17
    android 手机远程监控源代码,供参考学习。
  • 手机远程监控 Android Eclipse平台 手机远程监控 Android Eclipse平台 手机远程监控 Android Eclipse平台
  • 摘 要:基于 IOS 移动远程监控系统是为南宁微波台而设计的手机远程监控系统,它打破了现有远程监控的模式,利用 4G 或 WiFi 环境中数据传输速度快、传输稳定、安全性高与个人手持移动设备易携带、易操作等优点,将台...
  • 西门子_使用智能手机远程监控精智面板pdf,
  • 硬盘录像机苹果手机、安卓手机远程监控设置《精解》
  • socket实现手机远程监控,分享给大家
  • 15单片机通过WIFI模块ESP8266实现手机远程监控可燃气体浓度 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 一,系统方案 1、方案描述 当烟雾报警系统处于正常环境中...

    15单片机通过WIFI模块ESP8266实现手机远程监控可燃气体浓度
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    一,系统方案
    1、方案描述
    当烟雾报警系统处于正常环境中,系统会主动向手机终端发送实时温度,和当前环境中的可燃气体数值。当烟雾报警系统处于达到可燃气体检测设定值时或当温度达到预设定值时,单片机控制端会自动启动继电器进行断气和开窗指令,并且通过互联网向手机终端发送报警,提醒人们采取相应的指示。
    2、原理框图在这里插入图片描述3、设计好的实物图在这里插入图片描述
    4、设计系统原理图在这里插入图片描述
    二、系统软件设计
    1、单片机软件设计
    系统采用15单片机(51内核高速单片机内置8通道10位高速ADC,速度可达30万次/秒)
    主函数展示:
    main()
    {

    LCD1602_Init();	//初始化LCD
    WriteString(0,0,"TEMP: ");//LCD中写入 TEMP:
    WriteString(12,0,"C"); //LCD中写入 C
    WriteString(0,1,"KAD:");//LCD中写入KAD
    WriteString(10,1,"M%");//LCD中写入PPM
    ADC_P11_init();//初始化ADC 
    esp8266_init();	//初始化ESP8266
    delay1ms();	 //一毫秒延时
    
    while(1)
    {
    	Process_receiveData();	//处理接收数据,并控制继电器操作
      	LcdDisplayDS18B20(Ds18b20ReadTemp());//LCD显示ds18b20数据
    	LcdDisplayADC(ADData); //LCD显示AD采集MQ-2数据
    	ESP8266_Set("AT+CIPSEND=0,18");	//向esp8266发送传输18字节数据请求
     	Delay100ms() ;	
      	Temp_data(Ds18b20ReadTemp()); //获取ds18b20温度传感器数据
    	ESP8266_ArraySends(ds18b20Wd_buf,8);		//发送ds18b20温度数组
    	Delay100ms() ;
    	ADC_data(ADData); //获取AD采集	数据
    	ESP8266_ArraySends(	ADC_datas_buf,6); //发送AD采集数组
    	Delay100ms() ;
    	//AlertLogic();	处理接受设置上限值
    	//ESP8266_ArraySends(AlertLogic_buf,3);返回上限数据结果	
    	ESP8266_ArraySends(Recive_table,4);//返回接收数据
    	Delay100ms() ;
    	ControlLogic();
    
    }
    

    }
    串口初始化以及ESP8266初始化函数:
    /*********************************************************************
    名称: 初始化esp8266
    作用: 配置esp8266参数
    *********************************************************************/
    void esp8266_init()
    {
    UsartConfiguration();
    ms_delay(500);
    /ESP8266_Set(“AT+CWMODE=1”);选择WiFi模式1
    ms_delay(500);
    ESP8266_Set(“AT+RST”);
    ms_delay(1000);
    ESP8266_Set("AT+CWJAP=“haqimeme”,“guoxuan@123"”);
    ms_delay(3000);
    ESP8266_Set("AT+CIPSTA=“192.168.1.113”,“192.168.1.1”,“255.255.255.0"”);
    ms_delay(1000);
    ESP8266_Set(“AT+RST”);
    ms_delay(6000);
    ESP8266_Set(“AT+CIPMUX=1”);
    ms_delay(500);
    //ESP8266_Set(“AT+CIFSR”); //查看ip地址
    ESP8266_Set(“AT+CIPSERVER=1,8080”);
    ms_delay(500);
    ESP8266_Set(“AT+CIPSTO=0”);
    /

    ESP8266_Set("AT+CIPMUX=1");//允许多连接
    ms_delay(500);
    

    // ESP8266_Set(“AT+CIFSR”); //查看ip地址
    ESP8266_Set(“AT+CIPSERVER=1,8080”);
    ms_delay(500);

    ES = 1;				//开串口中断
    

    }

    /*******************************************************************************

    • 函 数 名 : UsartConfiguration()
    • 函数功能 : 设置串口
    • 输 入 : 无
    • 输 出 : 无
      *******************************************************************************/

    void UsartConfiguration()
    {
    ACC = P_SW1;
    ACC &= ~(S1_S0|S1_S1);//S1_S0=1,S1_S1=0;
    ACC |= S1_S0; //(P3.6/RxD_2,P3.7/TxD_2)
    P_SW1 = ACC;

    TMOD = 0x20;	// 0010 0000 定时器1工作于方式2(8位自动重装方式)l
    TH1  = 0xFD;	// 波特率:9600 /11.0592MHZ
    TL1  = 0xFD;	// 波特率:9600 /11.0592MHZ		    
    TR1  = 1;  	//下面代码设置定串口
    AUXR &= 0xBE;  //先对需要设置的位进行清零 1011 1110
    AUXR = 0x00;             // 很关键,使用定时器1作为波特率发生器,S1ST2=0
    SCON = 0x50; 	// 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接受)
    ES = 1;                         //开放串口中断
    EA = 1;                         //开放CPU中断
    

    }
    esp8266发送数组函数
    /*********************************************************************************

    • 函数名 :ESP8266_ArraySends
    • 函数功能 :发送数组
    • 输出 :无
    • 输入 :发送数组,发送数组位数
      *********************************************************************************/

    void ESP8266_ArraySends(uint send_data[],uchar num)

    {
    uchar i;

    	for(i=0; i<num; i++)	//	  sizeof(send_data)求出send_data[]数组的长度。例如:sizeof(Wd_buf)=8.	         sizeof(send_data)/sizeof(*send_data)
    	{
    	/*	SBUF = send_data[i];   //将要发送的数据放入到发送寄存器
    		while(!TI);		  //等待发送数据完成
    		TI=0;			  //清除发送完成标志位
    	*/	
    		Send_Uart(send_data[i]);
    	}
    
    	 
    	 ms_delay(50);		  //延时一下再发
    

    }
    esp8266在收到数据并转发给单片机时的数据格式:+IPD,<client号>,<收到的字符长度>:收到的字符,比如+IPD,0,5:hello,其中+PID是固定的;0代表的是TCP客户端编号,esp8266最多支持5个客户端同时连接,也就是说客户端编号是0到4,在本设计中由于只有一个客户端与esp8266相连,所以客户端编号是0;5代表收到的字符长度;hello是收到的字符。在本例中esp8266发送给单片机的数据是+IPD,0,1:1,我们把接收到的字符串缓存到字符数组中,所以在处理收到的数据逻辑中,首先判断是否是以’+'和’I’开始的,否则视作无效数据,然后判断数组中的第十个数据,因为第十个数据才是上位机发送过来的数据。
    /*********************************************************************
    名称:串行通讯中断
    作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数
    据正常的收发。
    ********************************************************************/

    void Uart_Interrupt() interrupt 4 using 1
    {

      if(RI)
      {
     	EA=0;
      	    
    	Recive_esp8266mode[j]=SBUF; 
    	RI=0;
    	j++;
    		
    	if(j==2)
    	{		
    		 if(Recive_esp8266mode[0]=='+'&&Recive_esp8266mode[1]=='I')	 //判断接收到数据是否是上位机发送的数据
    		 {
    			;			
    		 }
    		 else
    		 {
    			j=0;
    	   	 }
    	}	  
    	if(j==13)
    	{
    		j=0;				   
    		Recivedata_flag=1;
    	}
    
    		 EA=1;	  
    	}
    

    }
    2、Android APP软件开发部分
    Android APP软件开发环境为Android studio ,界面简洁终端ID输入的是IP地址192.168.1.112,端口号是8080;因为esp8266选择的是WiFi模式一与家中的路由器组成局域网,在通过指令AT+CIPSTA=“192.168.1.112”,“192.168.1.1”,“255.255.255.0”);//设置静态IP方便连接互联网时能够寻址。连接互联网时需要公网ip,这里博主通过花生壳解析域名获取公网IP达到访问系统效果。

    在这里插入图片描述
    Android APP软件逻辑接收代码:
    class Myhandler extends Handler {
    byte[] SocketReadData= new byte[socketclient.RC_DATA.length];
    @Override
    public void handleMessage(Message msg) {
    SocketReadData=(byte[])msg.obj;
    if(SocketReadData[0]==0&&SocketReadData[1]==1){

                Temp= SocketReadData[3]*10000+SocketReadData[4]*1000+SocketReadData[5]*100+SocketReadData[6]*10+SocketReadData[7];
                if(SocketReadData[2]==0){
                    Temp=-(Temp/100);
                }
                else{
                    Temp=Temp/100;
                }
            }else{
                Temp=0;
    
            }
            if(SocketReadData[8]==0&&SocketReadData[9]==2){
                KAD=SocketReadData[10]*1000+SocketReadData[11]*100+SocketReadData[12]*10+SocketReadData[13];
            }
            if ( KAD>550||Temp>50)
            {
                flag++;
                if(flag==2){//flag 为出发警报Activity标志位,数值为2 防止数据误发导致出发报警
                    Intent intent1 = new Intent(SecondActivity.this, ThirdActivity.class);//显示intent
                    startActivity(intent1);
                }
    
            }
    
    
            if(SocketReadData[14]==1&&SocketReadData[15]==1&&SocketReadData[16]==1&&SocketReadData[17]==1)
            {
                imageButton1.setImageDrawable(getResources().getDrawable(R.mipmap.shut));
                a=1;
            }
            if(SocketReadData[14]==1&&SocketReadData[15]==1&&SocketReadData[16]==2&&SocketReadData[17]==2)
            {
                imageButton1.setImageDrawable(getResources().getDrawable(R.mipmap.open));
                a=0;
            }
            /*if(SocketReadData[19]==1&&SocketReadData[20]==2&&SocketReadData[21]==1&&SocketReadData[22]==1)
            {
                imageButton2.setImageDrawable(getResources().getDrawable(R.mipmap.shut));
                b=1;
            }
            if(SocketReadData[19]==1&&SocketReadData[20]==2&&SocketReadData[21]==2&&SocketReadData[22]==2)
            {
                imageButton2.setImageDrawable(getResources().getDrawable(R.mipmap.open));
                b=0;
            }*/
    
            tvReceive.setText("DS18B20温度 :  "+ Temp+"℃"+"\n"+"KAD :  "+ KAD +"M%");
        }
    
    
    
    }
    

    Android APP软件逻辑向可燃气体监测系统发送数据代码:
    public void sends(String j){
    switch (j){
    case “0x00156f4”:SD_DATA[1]=1;SD_DATA[2]=1;SD_DATA[3]=1;break;//闭合继电器1
    case “0x00256f4”:SD_DATA[1]=1;SD_DATA[2]=2;SD_DATA[3]=2;break;//断开继电器1
    // case “0x00356f4”:SD_DATA[1]=2;SD_DATA[2]=1;SD_DATA[3]=1;break;//闭合继电器2
    // case “0x00456f4”:SD_DATA[1]=2;SD_DATA[2]=2;SD_DATA[3]=2;break;//闭合继电器2

                    }
                    socketclient.Sends(SD_DATA);
                }
    
            }
    

    报警界面代码:
    public class ThirdActivity extends AppCompatActivity {
    MediaPlayer player;
    Vibrator vibrator;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_third);
    player = MediaPlayer.create(this, R.raw.huozaijingbaosheng);
    player.start();
    vibrator = (Vibrator)this.getSystemService(this.VIBRATOR_SERVICE);
    long[] patter = {1000, 1000, 2000, 5000};//首先,这里使用的是一个长整型数组,数组的a[0]表示静止的时间,a[1]代表的是震动的时间,然后数组的a[2]表示静止的时间,a[3]代表的是震动的时间……依次类推下去,然后这里的代码有一点小小的改变:
    vibrator.vibrate(patter, 0);//最后一行中vibrate的第二参数表示从哪里开始循环,比如这里的0表示这个数组在第一次循环完之后会从下标0开始循环到最后,这里的如果是-1表示不循环。

    }
    public void click(View v) {
    
                flag=0;
                player.release();
                vibrator.cancel();
                finish();
    }
    

    }

    系统博主挂到淘宝上,如需详细资料可点击下面链接购买:
    https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.75dc1debztCHw3&ft=t&id=602060950301

    展开全文
  • Android手机远程监控

    2010-12-21 11:00:45
    我又没分了 所以再分享一个 这是网上找的资源,经过修改测试成功的,又是精华啊
  • 安卓系统手机,在手机浏览器输入www.dvr163.com/help/downlaod.php,可以直接下载 或者扫描里面的二维码也可以直接登入
  • 无线视频传输和手机视频监控业务 1、手机端支持EDGE/3G网络制式; 2、手机端支持iphone/android/symbian等主流手机平台; 3、标准H.264编解码,符合3GPP移动视频压缩标准; 4、手机视频点播、手机电视、手机视频...
  • 手机远程实时监控目前最清晰最流畅的家用WiFi网络摄像机带云台手机客户端 FI-361是一款P2P传输、即插即用的手机远程实时监控无线网络摄像机,目前最清晰最流畅的家用WiFi网络摄像机,带云台,用手机滑动可控制网络...
  • 基于opencv与android的手机远程监控

    千次阅读 2018-03-20 21:58:45
    所以搞出来一个远程监控,功能就是把电脑的摄像头数据传到手机上。环境:VS2015,opencv,android studioVS端:其实就是打开一个摄像头,再把图像数据通过socket发送出去,问题不大。但要注意图片尺寸默认480*640。...

    前言:最近搞了一下andriod和socket网络通信,结合之前搞得opencv,立即有了一个把三者结合起来的想法。好了,搞吧。所以搞出来一个远程监控,功能就是把电脑的摄像头数据传到手机上。


    环境:VS2015,opencv,android studio


    VS端:

    其实就是打开一个摄像头,再把图像数据通过socket发送出去,问题不大。但要注意图片尺寸默认480*640。

    main函数伪代码:

    初始化tcp和udp服务端,

    开启tcp和udp监听线程,

    打开摄像头,

    打开录像功能,

    一直读图,并转化为灰色,

    如果收到服务端的信号,则传输图像,

    由于android端bitmap与这里灰度图的显示是相反的,所以传图的时候也对每一个像素取反,

    最后结束。


    初始化部分其实网上有许多,直接用就好了。

    监听线程如果收到“ss",则表示开始传输,收到”ee"则表示结束。

    这里要注意的是,使用udp传输是不稳定的,所以传输的时候每一帧都加上开头和结尾的判断标志,而且发送过快的话andriod端会出现丢包的情况,所以每次传输后面都加了延时。并且由于MTU限制,每一帧的实际数据长度不能超过1472。

    对于TCP来说则没有限制,直接传输图片数据就好了。这个就挺快的,实测在同一局域网下能达到20帧。

    下面是详细代码:

    #include<opencv2\opencv.hpp>
    #include <math.h>
    #include <process.h>
    #include "winsock.h"
    //socket库的lib
    #pragma comment(lib,"ws2_32.lib")
    
    #define PORT 8888
    
    using namespace cv;
    using namespace std;
    
    SOCKET socksvr,tcpsvr, tcpsockclient;
    CHAR szRecv[1472] = { 0 };
    CHAR szSend[1472] = { 0 };
    struct sockaddr_in clientaddr = { 0 };
    struct sockaddr_in tcpclientaddr = { 0 };
    int nLen = sizeof(clientaddr);
    int tcpnLen = sizeof(tcpclientaddr);
    volatile HANDLE udpreceive,tcpreceive;
    UINT threadid,tcpthreadid;
    int start = 0;
    
    
    void delay(int s)
    {
    	while (s > 0)s--;
    }
    void TCPServerInit()
    {
    	tcpsvr = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if (INVALID_SOCKET == tcpsvr)
    	{
    		return;
    	}
    	/*************建立服务器端套接字地址***********************/
    	/********************绑定IP和端口号******************/
    	struct sockaddr_in svraddr = { 0 };
    	svraddr.sin_family = AF_INET;//代表internet协议族
    	svraddr.sin_port = htons(PORT);
    	//htonl()函数是将u_long型变量从主机字节顺序变为TCP/IP网络字节顺序。
    	svraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//inet_addr("127.0.0.1");//htonl(INADDR_ANY);//此宏为0,当前机器上任意IP地址,也可以指定当前机的ip和端口。//127.0
    														  //绑定,将服务器端套接字与服务器端套接字地址绑定
    	bind(tcpsvr, (struct sockaddr *)&svraddr, sizeof(svraddr));//指定名字,类型,长度。绑定套接字。
    																//侦听
    	listen(tcpsvr, SOMAXCONN);//第一个参数是套接字,第二个参数是等待连接队列的最大长度。
    }
    void UDPServerInit()
    {
    	//创建socket
    	socksvr = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    	if (INVALID_SOCKET == socksvr)
    	{
    		return;
    	}
    	//服务器套接字地址
    	//绑定ip与端口,先定义端口等一些信息。
    	struct sockaddr_in svraddr = { 0 };
    	svraddr.sin_family = AF_INET;
    	svraddr.sin_port = htons(PORT);
    	svraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    	bind(socksvr, (struct sockaddr*)&svraddr, sizeof(svraddr));
    
    }
    
    
    
    void TCPSendImage(Mat image)
    {
    	//int i;
    	//int datanum;
    	//send(tcpsockclient, "ss", 2, 0);//发送函数。
    	//sendto(socksvr, "ss", 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	if(start==0)closesocket(tcpsockclient);
    	else send(tcpsockclient, (const char*)image.data, image.cols*image.rows, 0);
    	//for (i = 0; i < image.rows; i += 2)
    	//{
    	//	send(tcpsockclient, (const char*)image.ptr<uchar>(i), image.cols * 2, 0);//发送函数。
    	//	//sendto(socksvr, (const char*)image.ptr<uchar>(i), image.cols * 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	//	//datanum=recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);
    
    	//	//delay(100000);
    	//}
    	//send(tcpsockclient, "ee", 2, 0);//发送函数。
    	//sendto(socksvr, "ee", 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	//datanum = recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);
    }
    
    
    void SendImage(Mat image)
    {
    	int i;
    	int datanum;
    	sendto(socksvr, "ss", 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	for (i = 0; i < image.rows; i+=2)
    	{
    		sendto(socksvr, (const char*)image.ptr<uchar>(i), image.cols*2, 0, (struct sockaddr*)&clientaddr, nLen);
    		//datanum=recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);
    
    		delay(200000);
    	}
    	sendto(socksvr, "ee", 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	//datanum = recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);
    }
    
    UINT WINAPI TCPListenThread(void* pParam)
    {
    	int datanum;
    	printf("TCP listening!\n");
    	while (1)
    	{
    		//以下是建立客户端套接字并建立连接函数。有一个确认的过程。
    		//注:后面填的是客户端地址长度的地址。
    		tcpsockclient = accept(tcpsvr, (struct sockaddr*)&tcpclientaddr, &tcpnLen);//建立连接函数
    		printf("TCP客户端已连接\n");
    		while (1) {
    			if (start == 0) {
    				datanum = recv(tcpsockclient, szRecv, sizeof(szRecv), 0); //接收函数,一直处于侦听模式,等待服务器端发送数据的到来。//构造ip地址
    				printf("Recieve:%s From:%s:%d\n", szRecv, inet_ntoa(tcpclientaddr.sin_addr), ntohs(tcpclientaddr.sin_port));
    				if (datanum == 2 && szRecv[0] == 's'&&szRecv[1] == 's')
    				{
    					start = 2;
    					printf("Start!\n");
    				}
    			}
    			else if (start == 2) {
    				datanum = recv(tcpsockclient, szRecv, sizeof(szRecv), 0); //接收函数,一直处于侦听模式,等待服务器端发送数据的到来。//构造ip地址
    				if (datanum == 2 && szRecv[0] == 'e'&&szRecv[1] == 'e')
    				{
    					start = 0;
    					printf("End!\n");
    					break;
    				}
    			}
    		}
    		
    
    	}
    	CloseHandle(tcpreceive);
    	return 0;
    }
    UINT WINAPI UDPListenThread(void* pParam)
    {
    
    	int datanum;
    	printf("UDP listening!\n");
    	while (1)
    	{
    
    		if (start == 0) {
    			datanum = recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);//构造ip地址
    			printf("Recieve:%s From:%s:%d\n", szRecv, inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
    			if (datanum == 2 && szRecv[0] == 's'&&szRecv[1] == 's')
    			{
    				start = 1;
    				printf("Start!\n");
    			}
    		}
    		else if (start == 1) {
    			datanum = recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);//构造ip地址
    			if (datanum == 2 && szRecv[0] == 'e'&&szRecv[1] == 'e')
    			{
    
    				start = 0;
    				printf("End!\n");
    			}
    		}
    		//if(!(szRecv[0] == 's'&&szRecv[1] == 's')&&!(szRecv[0] == 'e'&&szRecv[1] == 'e'))
    		//{
    		//	sprintf(szSend, "Received %d bytes data!\n", datanum);
    		//	sendto(socksvr, szSend, sizeof(szSend), 0, (struct sockaddr*)&clientaddr, nLen);//发送时构造ip地址和端口。
    		//}
    
    	}
    	CloseHandle(udpreceive);
    	return 0;
    }
    
    
    int main(int argc, char** argv) {
    	WSADATA wsa = { 0 }; //WinSockApi 取WSA+DATA组成套接字结构体
    	WSAStartup(MAKEWORD(2, 2), &wsa);
    	UDPServerInit();
    	TCPServerInit();
    	udpreceive = (HANDLE)_beginthreadex(NULL, 0, UDPListenThread, 0, 0, &threadid);
    	tcpreceive = (HANDLE)_beginthreadex(NULL, 0, TCPListenThread, 0, 0, &tcpthreadid);
    	//DrawCir();
    	Mat img,gray; 
    	VideoCapture cap(0);
    	if (!cap.isOpened()) return -1;
    	VideoWriter me("dir.avi", CV_FOURCC('M', 'J', 'P', 'G'), 20, { 640, 480 });
    	int startre = 0;
    	while (1)
    	{
    		cap >> img;
    		namedWindow("circles", 1);
    		cvtColor(img, gray, CV_BGR2GRAY);
    		imshow("circles", gray);
    		if (startre)me << img;
    		if (start==1) { 
    			SendImage(~gray); 
    		}
    		else if (start == 2) {
    			TCPSendImage(~gray);
    		}
    		waitKey(1);
    	}
    	//
    	//清理套接字资源
    	closesocket(tcpsvr);
    	closesocket(socksvr);
    	WSACleanup();
    	return 0;
    }
    


    代码在配置好opencv环境的VS里面应该能直接运行。


    android端:

    这里主要就是搞了一个图像显示界面以及socket配置界面。

    socket配置部分也是网上找的,直接用就好。

    图像使用bitmap显示在imageview上面。

    流程也是发送ss开始,发送ee结束。

    对于tcp来说,接收到480*640个数据就直接认为是一帧了。

    对于udp来说,需要检验数据的头和尾。接收到ss表示图片开始,接收到ee表示图片结束。

    接收到一个字符串后,通过copyPixelsFromBuffer将数据从内存放到bitmap里,再setImageBitmap就可以看了。

    效果如图所示。



    图中左边是vs显示,右边是andriod模拟器界面。

    操作步骤:

    打开VS程序,

    打开APP,输入PC的ip地址和端口,选择连接类型,点击确定。

    点击连接,输入ss,点击发送,就可以看到图片了。

    这个程序比较大,就直接上工程文件吧。

    点击打开链接


    要注意的是没有连接就发送的话会闪退,退出前不发ee的话VS这边就得重启才能重新连接。这些可以避免,但是毕竟不是做产品,所以咱没有搞那么精细。

    同时彩色图在andriod这边是用的RGB_565格式,也就是说数据量会比灰度大一倍,这个做起来也不难,就是没想搞了。


    搞这个的时候其实想搞一个带公网的,就是能远程访问,不在同一个局域网也能连。按道理是可以的,只要有PC端有公网IP,即使连了路由的话,做一个端口映射就搞定了。到时候手机这边输入路由器WAN口的IP就可以了。

    但是我这个WAN口IP是个教育网IP,这就尴尬了,反正访问不了。


    很不爽啊。要不再搞个中间服务器吧,正好有个aliyun主机,可以嘛。

    这样把PC端和手机端都设成客户端,阿里云上面开两个线程,跑两个tcp server,监听两个端口,然后把我收到的信息发给你,你收到的信息发给我,这就搞定了嘛。


    手机端代码不用动,然后PC端的server改成client就行。

    PC端代码:

    #include<opencv2\opencv.hpp>
    #include <math.h>
    #include <process.h>
    #include "winsock.h"
    //socket库的lib
    #pragma comment(lib,"ws2_32.lib")
    
    #define PORT 9999
    
    using namespace cv;
    using namespace std;
    
    SOCKET socksvr, tcpsockclient;
    CHAR szRecv[1472] = { 0 };
    CHAR szSend[1472] = { 0 };
    struct sockaddr_in clientaddr = { 0 };
    struct sockaddr_in tcpclientaddr = { 0 };
    int nLen = sizeof(clientaddr);
    int tcpnLen = sizeof(tcpclientaddr);
    volatile HANDLE udpreceive, tcpreceive;
    UINT threadid, tcpthreadid;
    int start = 0;
    
    
    void delay(int s)
    {
    	while (s > 0)s--;
    }
    void TCPServerInit()
    {
    	tcpsockclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if (INVALID_SOCKET == tcpsockclient)
    	{
    		return;
    	}
    	/*************建立服务器端套接字地址***********************/
    	/********************绑定IP和端口号******************/
    	struct sockaddr_in svraddr = { 0 };
    	svraddr.sin_family = AF_INET;//代表internet协议族
    	svraddr.sin_port = htons(PORT);
    	//htonl()函数是将u_long型变量从主机字节顺序变为TCP/IP网络字节顺序。
    	svraddr.sin_addr.S_un.S_addr = inet_addr("120.79.34.31");//inet_addr("127.0.0.1");//htonl(INADDR_ANY);//此宏为0,当前机器上任意IP地址,也可以指定当前机的ip和端口。//127.0
    													 //绑定,将服务器端套接字与服务器端套接字地址绑定
    	int iRetVal = connect(tcpsockclient, (struct sockaddr*)&svraddr, sizeof(svraddr));
    	if (SOCKET_ERROR == iRetVal)
    	{
    		printf("服务器连接失败!");
    		closesocket(tcpsockclient);
    		return;
    	}
    	printf("服务器连接成功!\n");
    }
    void UDPServerInit()
    {
    	//创建socket
    	socksvr = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    	if (INVALID_SOCKET == socksvr)
    	{
    		return;
    	}
    	//服务器套接字地址
    	//绑定ip与端口,先定义端口等一些信息。
    	struct sockaddr_in svraddr = { 0 };
    	svraddr.sin_family = AF_INET;
    	svraddr.sin_port = htons(PORT);
    	svraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    	bind(socksvr, (struct sockaddr*)&svraddr, sizeof(svraddr));
    
    }
    
    
    
    void TCPSendImage(Mat image)
    {
    	//int i;
    	//int datanum;
    	//send(tcpsockclient, "ss", 2, 0);//发送函数。
    	//sendto(socksvr, "ss", 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	if (start !=0)
    		send(tcpsockclient, (const char*)image.data, image.cols*image.rows, 0);
    	//for (i = 0; i < image.rows; i += 2)
    	//{
    	//	send(tcpsockclient, (const char*)image.ptr<uchar>(i), image.cols * 2, 0);//发送函数。
    	//	//sendto(socksvr, (const char*)image.ptr<uchar>(i), image.cols * 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	//	//datanum=recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);
    
    	//	//delay(100000);
    	//}
    	//send(tcpsockclient, "ee", 2, 0);//发送函数。
    	//sendto(socksvr, "ee", 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	//datanum = recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);
    }
    
    
    void SendImage(Mat image)
    {
    	int i;
    	int datanum;
    	sendto(socksvr, "ss", 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	for (i = 0; i < image.rows; i += 2)
    	{
    		sendto(socksvr, (const char*)image.ptr<uchar>(i), image.cols * 2, 0, (struct sockaddr*)&clientaddr, nLen);
    		//datanum=recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);
    
    		delay(200000);
    	}
    	sendto(socksvr, "ee", 2, 0, (struct sockaddr*)&clientaddr, nLen);
    	//datanum = recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);
    }
    
    UINT WINAPI TCPListenThread(void* pParam)
    {
    	int datanum;
    		while (1) {
    			if (start == 0) {
    				datanum = recv(tcpsockclient, szRecv, sizeof(szRecv), 0); //接收函数,一直处于侦听模式,等待服务器端发送数据的到来。//构造ip地址
    				printf("Recieve:%s From:%s:%d\n", szRecv, inet_ntoa(tcpclientaddr.sin_addr), ntohs(tcpclientaddr.sin_port));
    				if (datanum == 2 && szRecv[0] == 's'&&szRecv[1] == 's')
    				{
    					start = 2;
    					printf("Start!\n");
    				}
    			}
    			else if (start == 2) {
    				datanum = recv(tcpsockclient, szRecv, sizeof(szRecv), 0); //接收函数,一直处于侦听模式,等待服务器端发送数据的到来。//构造ip地址
    				if (datanum == 2 && szRecv[0] == 'e'&&szRecv[1] == 'e')
    				{
    					start = 0;
    					printf("End!\n");
    				}
    			}
    
    
    	}
    	CloseHandle(tcpreceive);
    	return 0;
    }
    UINT WINAPI UDPListenThread(void* pParam)
    {
    
    	int datanum;
    	printf("UDP listening!\n");
    	while (1)
    	{
    
    		if (start == 0) {
    			datanum = recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);//构造ip地址
    			printf("Recieve:%s From:%s:%d\n", szRecv, inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
    			if (datanum == 2 && szRecv[0] == 's'&&szRecv[1] == 's')
    			{
    				start = 1;
    				printf("Start!\n");
    			}
    		}
    		else if (start == 1) {
    			datanum = recvfrom(socksvr, szRecv, sizeof(szRecv), 0, (struct sockaddr*)&clientaddr, &nLen);//构造ip地址
    			if (datanum == 2 && szRecv[0] == 'e'&&szRecv[1] == 'e')
    			{
    
    				start = 0;
    				printf("End!\n");
    			}
    		}
    		//if(!(szRecv[0] == 's'&&szRecv[1] == 's')&&!(szRecv[0] == 'e'&&szRecv[1] == 'e'))
    		//{
    		//	sprintf(szSend, "Received %d bytes data!\n", datanum);
    		//	sendto(socksvr, szSend, sizeof(szSend), 0, (struct sockaddr*)&clientaddr, nLen);//发送时构造ip地址和端口。
    		//}
    
    	}
    	CloseHandle(udpreceive);
    	return 0;
    }
    
    
    int main(int argc, char** argv) {
    	WSADATA wsa = { 0 }; //WinSockApi 取WSA+DATA组成套接字结构体
    	WSAStartup(MAKEWORD(2, 2), &wsa);
    	UDPServerInit();
    	TCPServerInit();
    	udpreceive = (HANDLE)_beginthreadex(NULL, 0, UDPListenThread, 0, 0, &threadid);
    	tcpreceive = (HANDLE)_beginthreadex(NULL, 0, TCPListenThread, 0, 0, &tcpthreadid);
    	//DrawCir();
    	Mat img, gray;
    	VideoCapture cap(0);
    	if (!cap.isOpened()) return -1;
    	VideoWriter me("dir.avi", CV_FOURCC('M', 'J', 'P', 'G'), 20, { 640, 480 });
    	int startre = 0;
    	while (1)
    	{
    		cap >> img;
    		namedWindow("circles", 1);
    		cvtColor(img, gray, CV_BGR2GRAY);
    		imshow("circles", gray);
    		if (startre)me << img;
    		if (start == 1) {
    			SendImage(~gray);
    		}
    		else if (start == 2) {
    			TCPSendImage(~gray);
    		}
    		waitKey(1);
    	}
    	//
    	//清理套接字资源
    	closesocket(socksvr);
    	WSACleanup();
    	return 0;
    }



    再加一个阿里云ubuntu的代码:


    root@ch:~/camserver# cat pc.c
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <unistd.h>  
    #include <sys/socket.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <ctype.h>  
    #include <pthread.h>
    #define MAXLINE 640*480
    #define SERV_PORT 9999  
    
    int listenfda, connfda;
    int connectstatusa = 0;
    
    extern void SendPh(char *input, int n);
    extern void SePh(void);
    
    void SendPc(char *input, int n)
    {
    	if (connectstatusa)
    	{
    		write(connfda, input, n);
    	}
    }
    
    
    
    
    void SePc(void)
    {
    	struct sockaddr_in servaddr, cliaddr;
    	socklen_t cliaddr_len;
    
    	char buf[MAXLINE], tempbuf[MAXLINE];
    	char str[INET_ADDRSTRLEN];
    	int i, n, error = 0;
    
    	listenfda = socket(AF_INET, SOCK_STREAM, 0);
    	bzero(&servaddr, sizeof(servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    	servaddr.sin_port = htons(SERV_PORT);
    	bind(listenfda, (struct sockaddr *)&servaddr, sizeof(servaddr));
    	listen(listenfda, 20);
    	cliaddr_len = sizeof(cliaddr);
    	while (1) {
    		connfda = accept(listenfda, (struct sockaddr *)&cliaddr, &cliaddr_len);
    		connectstatusa = 1;
    		printf("PC connect %s:%d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));
    		while (1) {
    			n = read(connfda, buf, MAXLINE);
    			if (n > 0)
    			{
    				SendPh(buf, n);
    			}
    			else error++;
    			if (error > 10)
    			{
    				error = 0;
    				break;
    			}
    		}
    		connectstatusa = 0;
    		close(connfda);
    	}
    	return;
    
    }
    
    
    int main()
    {
    	pthread_t thrdhealth, thrdupload;
    	pthread_create(&thrdhealth, NULL, (void *)SePh, NULL);
    	pthread_create(&thrdupload, NULL, (void *)SePc, NULL);
    	while (1)
    	{
    		printf("Main running\n");
    		usleep(5000000);
    	}
    	pthread_join(thrdhealth, NULL);
    	pthread_join(thrdupload, NULL);
    	return 0;
    
    }
    
    root@ch:~/camserver# cat ph.c
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <unistd.h>  
    #include <sys/socket.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <ctype.h>  
    #include <pthread.h>
    #define MAXLINE 640*480
    #define SERV_PORT 8888  
    
    int listenfd, connfd;
    int connectstatus = 0;
    
    extern void SendPc(char *input, int n);
    
    
    void SendPh(char *input, int n)
    {
    	if (connectstatus)
    	{
    		write(connfd, input, n);
    	}
    }
    
    
    
    
    void SePh(void)
    {
    	struct sockaddr_in servaddr, cliaddr;
    	socklen_t cliaddr_len;
    
    	char buf[MAXLINE], tempbuf[MAXLINE];
    	char str[INET_ADDRSTRLEN];
    	int i, n, error = 0;
    
    	listenfd = socket(AF_INET, SOCK_STREAM, 0);
    	bzero(&servaddr, sizeof(servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    	servaddr.sin_port = htons(SERV_PORT);
    	bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    	listen(listenfd, 20);
    	cliaddr_len = sizeof(cliaddr);
    	while (1) {
    		connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
    		connectstatus = 1;
    		printf("Phone connect %s:%d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));
    		while (1) {
    			n = read(connfd, buf, MAXLINE);
    			if (n > 0)
    			{
    				SendPc(buf, n);
    			}
    			else error++;
    			if (error > 10)
    			
    {
    				printf("Phone lost\n");
    				SendPc("ee", 2);
    				error = 0;
    				break;
    			}
    		}
    		connectstatus = 0;
    		close(connfd);
    	}
    	return;
    
    }
    

    注意上面是两个文件,分别是PCserver和PhoneServer 。把两个文件一起编一下就行,要带上-lpthread编译,像下面这样:

    gcc pc.c ph.c -o server -lpthread


    运行流程:

    先开阿里云server,然后把连个client打开,都打开后再在手机上连接阿里云的ip就可以了。

    要注意的是这里只能用tcp了,udp差不多,但是没搞啊。还有阿里云的安全组要打开所有的IP和端口访问。

    完成了。但是这速度慢的,差不多有2帧吧。手机上看到速度只有100多k/s的速度。和在同一局域网下的1M多/s的速度没法比啊。可能是阿里云的学生套餐太慢了吧。

    就这样吧。

    展开全文
  • android手机远程监控

    2011-12-05 00:25:26
    ANDROID远程控制器设计编码Debug完成了,服务器端加客户端,一共只用了两个星期,分析编码能力有所提高啊
    
    

    ANDROID远程控制器设计编码Debug完成了,服务器端加客户端,一共只用了两个星期,分析编码能力有所提高啊

    展开全文
  • 爸爸的眼睛是 手机软件中 功能很强大的一款软件
  • c++ 利用手机短信远程关机,操作前请输入远程控制信息:本机IP地址、管理员密码、关机延时这几个参数就可以了,欲知原理,请下载源码查看。 1、手机具有红外功能。 2、下载安装一个遥控app(遥控精灵、遥控...

    c++ 利用手机短信远程关机,操作前请输入远程控制信息:本机IP地址、管理员密码、关机延时这几个参数就可以了,欲知原理,请下载源码查看。

     

    1、手机具有红外功能。

    2、下载安装一个遥控app(遥控精灵、遥控大师、万能遥控器等)。

    3、打开遥控app选择要遥控的空调品牌型号,进行适配。

    4、用安卓手机控制空调开关

    项目截图:

     

    代码截图:

     

    测试效果截图:

     

    这是前段时间无聊,发现现在手机功能越来越强大,并且支持开发,所以用android手机做了一个通过手机wifi或gprs实现远程控制开关机调节音量等功能的小软件。在这里发出来留作纪念。

     

     

     

    展开全文
  • 性价比高,单网四串,满足能源管理行业/光伏监控行业/水利水电/锅炉监控/机械设备远程监控需求。 典型应用 物联网应用,机械设备远程监视系统 项目背景 本项目主要设备为酿造设备,...
  • 手机 APP 远程控制用电设备; 实时更新与查看远程端的相关数据或状态, 如用电设备的工作状态、 环境光强、 控制器温度等。 控制器由上下两块电路板组成。 上板由触摸按键、 温度传感器、 光强传感器等组成。 下板...
  • C++利用手机短信远程关机,操作前请输入远程控制信息:本机IP地址、管理员密码、关机延时这几个参数就可以了! 1、手机具有红外功能。 2、下载安装一个遥控app(遥控精灵、遥控大师、万能遥控器等)。 3、打开...
  • 为了在手机上实现对家庭的监控,首先需要将本地数据传到云端服务器,然后再在手机设备上获取信息。上一节已经完成了前半部分的内容,今天主要完成android上的开发。
  • 了解更多相亲,请关注:http://www.guilihe.com/h-pd-54.html#keyword=智能空气...pfc=%7B"lid"%3A1%2C"prgmid"%3A314%2C"kw"%3A"智能空气"%2C"sc"%3A%7B"key"%3A"name"%2C"desc"%3Afalse%7D%7D&_pp=0_314 ...
  • 把Android手机变成远程监控摄像头

    千次阅读 2018-11-13 16:48:43
    把Android手机变成远程监控摄像头
  • 手机客户端可远程连接摄像头监控,这只是个android应用程序。
  • wincc实现手机APP远程监控

    千次阅读 2018-07-25 17:47:16
    wincc是西门子公司开发的上位机视窗监控编程软件,用户可以利用软件提供的控件、脚本、方法等进行开发,将控制系统动做...下面介绍一种在不改动原有系统监控的情况下,实现wincc手机APP远程监控的方案。 一、Wincc...
  • 手机APP远程监控PLC简要说明,工业自动化行业,实现远程监控现场情况
  • 说到安装监控摄像头的问题,现在手机远程监控成了监控摄像头的标配了,大家都希望通过手机实时的监控情况。监控摄像头的安装也越来越简单,那怕是一个监控的小白,只需看了说明书,几个步骤就可以轻松安装了。今天...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,153
精华内容 461
关键字:

手机远程监控