中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

舊手機威力之看門狗

發布時間:2020-04-07 19:17:26 來源:網絡 閱讀:1292 作者:youerning 欄目:編程語言

不知道大家是否有關門后又回到門口檢查門是否關了的經歷,反正我有,作為一個懶人應該采取一些措施,在不往回跑的前提下檢查門是否關了。

幾乎沒有忘記關過門,但是強迫癥逼死人:(

解決方案

遠程控制聯網手機在房內對門口拍照,然后查看圖片檢查是否關門. 遠程方面使用web方式.

這里放一張截圖:
舊手機威力之看門狗

如圖所示,如果關門了,通過照片能看出是否關門了,這里拍攝的是打了小鎖的情況。

實施方案

硬件:

  • 時刻聯網的舊手機

    這里使用的紅米note7 pro做的測試, 舊手機有點問題.

軟件:

  • termux 0.69
  • termux-api 0.32
  • juiceSSH(可選)
  • python3
  • frp(選擇自己喜歡的內網穿透方式)

環境準備

主要是手機APP安裝以及APP里面Linux環境軟件的安裝

手機APP

手機安裝termux, termux-api, juiceSSH

通過你中意的應用市場找到這兩個app然后安裝

建議通過Google商店安裝, 不過可能有難度,需要自行研究

安裝好之后可以通過自帶的窗口或者通過JuiceSSH連接,因為JuiceSSH對于命令輸入更友好

關于JuiceSSH或者電腦連接手機的Termux可以參考: 一個舊手機的威力

Termux Linux環境

Linux包以及Python包

安裝termux-api用于訪問手機相機
pkg install termux-api

一定要既安裝手機APP的Termux-API, 也要通過上面命令安裝termux-api

通過這個包我們可以獲得一堆訪問手機意見或者軟件的訪問API, 比如相機,短信,電話,震動之類的API.

可通過以下命令調用手機相機拍照

# 查看幫助
?  ~ termux-camera-photo -h    
Usage: termux-camera-photo [-c camera-id] output-file
Take a photo and save it to a file in JPEG format.
  -c camera-id  ID of the camera to use (see termux-camera-info), default: 0

# 通過相機id為1的相機拍照,并保存相片到本地1.jpeg
termux-camera-photo -c 1 1.jpeg

至于你的哪個相機是前置哪個是后置,或者某個后置(后置可能有多個), 需要自己測試。

但是上面的照片是放在APK的存儲空間里面,所以手機相冊看不到,所以需要通過其他API將圖片放到手機的本地存儲。

執行以下命令后,會在加目錄生成一個storage目錄,通過這個目錄我們可以在termux內訪問手機的本地存儲

# 手機應該會詢問該APP可否訪問手機存儲
termux-setup-storage

然后我們就可以將將拍攝的圖片移到外面,然后就可以通過相冊或者文件管理器打開

cp 1.jpeg storage/downloads

注: 在執行相關命令的時候會彈出權限是否允許,需要手動點擊允許, 不允許的話自然這些API或者說命令都沒法用了.

Termux-API參考鏈接: Termux-API

Python相關依賴

選擇你自己喜歡的編程語言或者web框架都可以了,這里選擇Python, flask實現web遠程控制。

# 安裝Python
pkg install python

# 安裝flask pillow
pip install flask pillow

安裝pillow是為了壓縮圖片。

如果安裝sanic, pillow失敗,可以考慮安裝以下依賴(我安裝了很多的其他庫,所以確定哪個是一定必要的)

apt install python python-dev clang fftw libzmq libzmq-dev freetype freetype-dev libpng libpng-dev pkg-config zlib zlib-dev libiconv libiconv-dev curl

內網穿透也參考這篇文章: 一個舊手機的威力

至此我們完成了所有的準備工作。

web遠程控制

效果如下
舊手機威力之看門狗

由于我暫時沒想好一個好的放置位置(跟房間布局有關),所以暫時還沒有實際應用,所以照片拍攝的照片是手持手機,然后遠程控制拍攝。

代碼實現

純演示項目,如果覺得有意思自己完善吧。

為了盡可能的少代碼,前端方面沒使用任何第三方庫。

目錄結構

?  ~ tree watchdog                
watchdog
├── app.py
├── static
│?? ├── 2019-05-18-18-54-00.jpeg
│?? └── latest.jpeg
└── templates
    └── index.html

2 directories, 4 files

代碼app.py

from flask import Flask
import subprocess as sp
from datetime import datetime
from PIL import Image
from os import path
from flask import render_template
app = Flask(__name__)

@app.route("/")
def index():
    # 為了不緩存圖片
    now = datetime.now()
    timestamp = now.timestamp()
    return render_template('index.html', timestamp=timestamp)

@app.route("/watch")
def watch():
    cwd = path.dirname(path.abspath("__file__"))
    static_dir = path.join(cwd, "static")
    now = datetime.now()
    date_str = now.strftime("%Y-%m-%d-%H-%M-%S")
    # 拍攝的照片保存位置
    img_path = path.join(static_dir, "{}.jpeg".format(date_str))
    print(img_path)
    # 拼湊出latest.png文件路徑
    latest_img_path = path.join(static_dir, "latest.jpeg")
    print(latest_img_path)
    cmd = "termux-camera-photo -c 0 {}".format(img_path)
    retcode = sp.call(cmd, shell=True)

    if retcode != 0:
        return "failed"

    img = Image.open(img_path)
    # 根據實際圖片壓縮,自己測試
    new_img = img.resize((int(img.size[0] * 0.4), int(img.size[1] * 0.4)))
    try:
        new_img.save(latest_img_path)
    except Exception as e:
        print(e)
        return "failed"
    return "ok"

if __name__ == '__main__':
    app.run(host="0.0.0.0", debug=True)

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Watch Dog</title>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Cache-Control" content="no-cache">
    <meta http-equiv="Expires" content="0">
    <style>
        .container {
            text-align: center;
        }

        img {
            width: 80%;
        }
        button{
            padding: 10px 40px;
            background: #09F;
            color: #FFF;
            text-decoration: none;
        }
    </style>

    <script type="text/javascript">
        function watch() {
            var xhttp = new XMLHttpRequest();
            xhttp.open("GET", "/watch", true)
            xhttp.onloadend = e => {
                var resp = xhttp.responseText
                alert(resp)
                if (resp == "ok") {
                    // 刷新頁面
                    window.location.reload()
                }
            };  
            xhttp.send()
        }

    </script>
</head>
<body>
<div class="container">
    <!-- 加個時間戳為了強制更新圖片 -->
    <img src="/static/latest.jpeg?{{timestamp}}" alt="">
    <br>
    <button onclick="watch()">關門了嗎?</button>
</div>

</body>
</html>

在windows上安裝一些需要編譯的python庫實在是件痛苦的事情,因為需要Microsoft Visual C++ 14.0, 而為了裝這個又得需要裝visual studio.

總結

總的來說流程如下

  1. 安裝必要的軟件
  2. 找一個合適的地方放置手機
  3. 編寫自己喜歡的遠程控制方式
  4. 內網穿透或者其他方式連接控制端

如果你喜歡的話也可以通過寫一個APP的方式實現。

代碼鏈接: watchdog

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拉孜县| 东乌| 山西省| 宁远县| 玉门市| 佳木斯市| 富民县| 阳东县| 什邡市| 扶风县| 双柏县| 永昌县| 蒙阴县| 孝义市| 松滋市| 通化市| 沙田区| 会理县| 沅江市| 仁布县| 额尔古纳市| 汽车| 襄城县| 三台县| 巴青县| 左权县| 上高县| 城口县| 阜新| 额敏县| 江永县| 百色市| 仁寿县| 邵武市| 白玉县| 张家界市| 巴彦淖尔市| 蒙自县| 仪陇县| 资阳市| 湖州市|