Siri终于可以帮我浇花了

2020-06-30 16:20:00 浏览数 (1)

之前公众号刚申请的时候就写了一篇文章,是一个关于远程浇花的想法,想了很久都没去实现,最近端午放假就做了一下,程序可能有很多漏洞?大佬们手下留情。先上视频:

来看一下整个系统的接线图,主要就是ESP8266和继电器的连接。

接下来看看原理图,本来想使用MQTT协议,无奈太菜只好用python起个flask,然后使用ESP的HTTP模块请求云服务监测是否有任务需要执行。

具体的代码如下:

ESP8266芯片<init.lua>文件代码:

代码语言:javascript复制
light = 4
flowerControlPin = 1
gpio.mode(light,gpio.OUTPUT)
gpio.mode(flowerControlPin,gpio.OUTPUT)

--Flower Timer (close Flower control Pin)
FlowerTimer = tmr.create()
FlowerTimer:alarm(5000,tmr.ALARM_SEMI,function() 
    gpio.write(light,gpio.HIGH) 
    gpio.write(flowerControlPin,gpio.LOW) 
    print("stop.....") 
end)
FlowerTimer:stop()

-- main
function main()
    dofile("server.lua")
end

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(AcquiredInfo)
------------------------------------------------------------
    print("nSTA - GOT IP".."nStation IP: "..AcquiredInfo.IP..
    "nSubnet mask: "..AcquiredInfo.netmask..
    "nGateway IP: "..AcquiredInfo.gateway)
    main()
------------------------------------------------------------
end)

dofile("wificfg.lua") -- waiting WiFi connect

ESP8266芯片<wificfg.lua>文件代码:

代码语言:javascript复制
----------------------------------
--[[WIFI config SSID PASSWORD]]--

wifi.setmode(wifi.STATION)
wifi.sta.config({ssid="ssid",pwd="mimamima"})
wifi.sta.connect()

ESP8266芯片<server.lua>文件代码:

代码语言:javascript复制
----------------------------------
--[[ HTTP server config page  ]]--

joburl = "http://1.1.1.1:8000/getjob"

function getjob(code,data)
    if (code < 0) then
      print("HTTP request failed")
    else
        if (data=="watertheflower") then
            gpio.write(light,gpio.LOW)
            gpio.write(flowerControlPin,gpio.HIGH)
            FlowerTimer:start()
            print("start.....")
        else
            print(data)
        end
    end
end

function doJob()
    print("Hi I am runing")
    http.get(joburl, nil, getjob)
end

JobTimer = tmr.create()
JobTimer:alarm(2000,tmr.ALARM_AUTO,doJob)
JobTimer:stop()
JobTimer:start()

服务器端python代码:

代码语言:javascript复制
from flask import Flask
import time

app = Flask(__name__)

task = False
lastwatertheflower = 0
authentication = "asdf1234"


def setTask():
    global task
    global lastwatertheflower
    lastwatertheflower = int(time.time())
    if task == False:
        task = True

def undoTask():
    global task
    if task == True:
        task = False

@app.route('/assigntask/<password>')
def assigntask(password):
    if password != authentication:
        return "faild"
    now = int(time.time())
    if now-lastwatertheflower > 3600:
        setTask()
        data = 'success'
    else:
        data = "faild"
    return data


@app.route('/getjob')
def getjob():
    if task:
        undoTask()
        return 'watertheflower'
    else:
        return 'nothing'

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

iPhone快捷指令:

代码总共加起来都没到200行,本来想使用AES加密一下时间戳和指令,但是无奈找不到iPhone快捷执行的JSBox怎么用?。

当然也可以使用server酱的TalkAdmin来控制,直接将web地址填入WebHook即可

仅供给大家提供一个好玩的思路,在这个远程浇花的系统中可能存在漏洞点如下:

1.客户端-服务器明文传输,可能导致重放攻击、密钥泄漏

2.服务器-终端设备明文传输,可能导致重放攻击、任意用户控制终端设备(是说其他人可以随便给我浇花么?)

欢迎找到其他漏洞的小伙伴在下方留言哇!

0 人点赞