zoukankan      html  css  js  c++  java
  • 物联网-手机远程控制家里的摄像头(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 = 'usr@163.com'
    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的图片

  • 相关阅读:
    锁表
    vs2010宏的应用
    Oracle:sqlplus查询出的中文是乱码问题的解决(转)
    linux下查看端口和服务的一些命令
    netsh
    xpshutdown关机命令详解
    linux系统如何察看、修改系统时间
    delphi编程中调用其他执行程序?(转)
    如何修改Oracle用户密码的诀窍(转)
    转:用Delphi实现从Excel数据Update(Insert类似)到Oracle数据库表中
  • 原文地址:https://www.cnblogs.com/tanhangbo/p/4293429.html
Copyright © 2011-2022 走看看