物联网-手机远程控制家里的摄像头(1)

有这样一个想法,家里摆一个摄像头作为安防用途或者监控小孩子、宠物等,

远端的手机可以通过向摄像头发送指令来控制摄像头。

首先,这种想法已经有成熟的产品了,但是这样的产品有缺陷:

1.没法自己DIY一些功能,出了BUG时只能等待厂家的固件

2.因为要用到服务商的云平台,可能因此每年产生几百块的服务费

3.平台无法复用,比如无法添加NAS功能

4.隐私泄露的问题

这样的产品的需求是:

1.低功耗,因为需要24小时运行

2.高清摄像,红外夜视(可选),容易看清贼的脸

3.稳定的代码

4.历史记录查看功能

5.较低的延迟

6.自动判断视野内是否有物体在动作(图像处理)

7.最好使用免费的云服务

根据上述的需求,目前产生了下述想法:

1.使用树莓派或者承载openwrt的路由器作为主体,顺带可以做NAS

2.使用邮箱作为云服务平台

3.采用高性价比的摄像头

这里具体来分析一下:

1.要打通手机和摄像头的通道,最简单的是手机和摄像头直连。最近几年独立的ip

越来越紧缺,我们从ISP拿到的ip很多已经是内网的IP,也就是说,无法直接连接

手机和摄像头。

下图是一种比较好的情况,服务区处理NAT里面,手机具有独立IP,这样,可以通过

反向连接的方式打通手机和服务器的通道,手机直接去连接NAT内部的服务器是

无法成功的,因为在这里一个ip对应好多机器(除非开了DMZ主机或者虚拟服务器)

但是这里考虑最坏的情况,手机和服务器都在NAT内部,无法互相连接。

这样,就需要外部的服务器来中转了。

于是,本人考虑了以下几种情况:

1.使用微信API

看了微信API的文档,得知如果需要使用这个API,需要自己搭建一个

服务器用于和微信服务器交互,虽然有免费的空间,但是速度慢是肯定的,

因为时延和稳定性的要求,加上成本的要求(如果买虚拟空间会增加成本),

这个方案暂时pass。

2.使用微博API

网上查得,微博开放了微博私信API,但是又看到一些API的用户

吐槽微博随意关闭API,所以这个待定

3. 使用飞信API

因为官方没有公布次API,使用私有的API会产生不稳定的现象,

而且也不见得支持图片的发送,所以暂时放弃

4.使用百度云API

百度云API可以存储资料,虽然通过旁敲侧击的方法可以用于通讯,

但是需要做专用的软件来支持这个功能。目前百度云API暂时用来

存储视频资料。

5.使用邮箱

目前互联网世界有数不尽的邮件服务商,不会出现后续无法用此方法的情况,

而且邮箱自古以来就是用来通讯的。虽然存在若干不方便的因素,

但是不影响使用,后续可以做APP解决。这里暂时使用邮箱来解决问题。

树莓派测试代码

因为要用到linux,所以暂时使用方便的Python。这里的demo是

使用邮箱来接收指令并且发送图片。

#!/usr/bin/python
# -*- coding: utf-8 -*-
#python2.7 mailtest.py

from smtplib import SMTP
from smtplib import SMTPRecipientsRefused
from poplib import POP3
from time import sleep 

#for attach img
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

import sys 

smtpserver = ‘smtp.163.com‘
pop3server = ‘pop.163.com‘
email_addr = ‘[email protected]‘
username = ‘usr‘
password = ‘IWantToFly‘ 

#https://docs.python.org/2/library/smtplib.html
def send_mail():

    mail_attach = ‘1.jpg‘

    msg = MIMEMultipart()
    msg["To"] = ‘‘
    msg["From"] = ‘‘
    msg["Subject"] = ‘MY_CMD:1‘

    msg_text = MIMEText(‘<img src="cid:1.jpg">‘ , ‘html‘)
    msg.attach(msg_text)

    fp = open(mail_attach, ‘rb‘)
    img = MIMEImage(fp.read())
    fp.close()
    img.add_header(‘Content-ID‘, mail_attach)
    msg.attach(img)

    send_svr = SMTP(smtpserver)
    #send_svr.set_debuglevel(1)
    #print send_svr.ehlo()[0] #服务器属性等

    send_svr.login(username,password)
    try:
       errs = send_svr.sendmail(email_addr,email_addr,msg.as_string())
    except SMTPRecipientsRefused:
       print ‘server refused....‘
       sys.exit(1)
    send_svr.quit()
    assert len(errs) == 0,errs
    print ‘send end‘

#https://docs.python.org/2/library/poplib.html
def recv_mail():
    recv_svr = POP3(pop3server)
    recv_svr.user(username)
    recv_svr.pass_(password)

    #msg_cnt is the last mail index, mail index is range(1, msg_cnt)
    msg_cnt, mailbox_size = recv_svr.stat()
    for i in range(1, msg_cnt):
        try:
            #only list msg header to reduce size, use retr to retrive the whole body
            rsp,msg,siz = recv_svr.top(i, 0)

            #print    msg
            for msg_one_entry in msg:
                if msg_one_entry.find(‘Subject:‘) == 0:
                    #response to command here
                    print msg_one_entry
        except:
            print ‘_______error‘

#recv_mail()
send_mail()

这里有两个函数,用于接收的函数是用来接收指令的,用于发送的函数是用来发送本地的图片(后续改成用摄像头生成的图片)

当接收到的指令和某个预定义的指令匹配时,采用对应的action(比如连续发三张图片,或者发一个MP4)

开始的服务器地址和用户名密码是要自己填的。

下面显示一下效果:

发出去的(想象成你在手机上发了这个邮件):

收到的(想象成你在手机上收到了这个邮件):

( ⊙ o ⊙ ) 是一张doge的图片

时间: 2024-10-30 19:28:30

物联网-手机远程控制家里的摄像头(1)的相关文章

物联网-手机远程控制家里的摄像头(2) - POP3和SMTP的C语言精简实现

在上一篇博客里面,使用了Python来发送.接收mail,但是实际测试中出现了一些不稳定的 情况,而且Python和即将使用的opencv会不兼容,使用进程间通讯或者其他方法会让整个系统 显得复杂而且可能不稳定,于是尝试用c或者C++实现邮件的发送和接收. 首先考虑的是上网找一个邮件库,找到了VMime库,于是开始安装.在简单看了一下它的文档之后 开始搭建它的环境,可惜要装的东西太多,搭建许久后放弃,而且它里面用了各种C++的特性,使用起来显得眼花缭乱 而且整个库太完整了,显得不够精简. 于是继

手机远程控制

1.  设备管理器 手机远程控制最重要的是要外置应用拿到管理设备的权限,这些权限在设备管理器中进行注册,就是大家在我们Settings->安全->设备管理器中能看到的. A.申明一个管理器权限要求列表:myadmin.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 3 <device-admin xmlns:android="http://schemas.android.com/a

android手机有多个摄像头,打开其中一个

方法: private Camera openFrontFacingCameraGingerbread() { int cameraCount = 0; Camera cam = null; Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); cameraCount = Camera.getNumberOfCameras(); for (int camIdx = 0; camIdx < cameraCount; camIdx++) {

手机变为电脑的摄像头,使像素高清起来-使用DroidCam

你是不是已经在嫌弃电脑自带的摄像头的渣渣像素呢? 今天给大家安利一个方法:将手机摄像头设置为电脑的摄像头,让像素高清起来,对于搞图像的同志们真是福音啊,尤其是做人脸识别的时候. 方法有很多种,我推荐我在用的一个:DroidCam. 手机端.电脑端都装上它. 软件截图: (手机端) (电脑端) 反正现在做人脸识别方便多了.在OpenCV调用的时候: capture = cvCaptureFromCAM(0);//使用第0个摄像头 只需要调用这个摄像头就可以了.快捷的设置,可以在QQ里面设置: 软件

用手机远程控制扫描仪

目前的扫描仪都还不够智能,没有提供扫描仪和手机之间的直接通信.所以我们可以通过PC作为桥接,使用Dynamic .NET TWAIN在PC上搭建一个扫描服务,实现手机对扫描仪的远程控制.这个简单的sample只需要在手机上点击扫描按钮,就可以触发扫描仪工作,获取图像. 参考:Wireless TWAIN Document Scanning on Android PC上的TWAIN扫描 下载Dynamic .NET TWAIN SDK 下载JSON.NET 运行Visual Studio,创建一个

手机远程控制电脑桌面的工具用什么呢

今手机的使用率越来越高,同时手机能够支持的功能也越来越多,早期的电脑远程控制电脑,已经是一个黑科技,而现在手机同样也可以控制电脑了,想要实现这一想法只需要借助一个"TeamViewer"的软件,可以用手机或其他电脑远程同步控制一台电脑. 方法就是先下载"TeamViewer":然后安装,安装的时候选"个人/非商务用途",这个是免费的:如果选"公司/商务用途"是要付费的. 安装完成后,打开软件.会有"您的ID"

使用微软Remote Desktop 手机远程控制 windows

在我的电脑上右击选择“属性”,打开属性面板.然后点击左边的“远程设置”. 2/2 如果你要操作的计算机出入外网(大多数是家里网线进线直连电脑),就选择远程桌面选择框中的“允许运行任意版本远程桌面的计算机连接”,并确定. 如果为路由器假设的局域网,且两个设备都在该局域网内选择第三项“仅允许运行使用网络级别的身份验证的远程桌面的计算”.并确定. 我这里选择的是两个设备均在局域网,所以选择第三项.然后单击确定.Windows7端配置完毕.下面进入Android 端配置,下载并打开软件.界面如下 1/5

android 判断手机是否支持前置摄像头

话不多说 直接上代码, @SuppressLint("NewApi") public static boolean isSupportFrontCamera() { if (!hasGingerbread()) { return false; } @SuppressWarnings("deprecation") int numberOfCameras = android.hardware.Camera.getNumberOfCameras(); if (2 == n

android 推断手机是否支持前置摄像头

话不多说 直接上代码, @SuppressLint("NewApi") public static boolean isSupportFrontCamera() { if (!hasGingerbread()) { return false; } @SuppressWarnings("deprecation") int numberOfCameras = android.hardware.Camera.getNumberOfCameras(); if (2 == n