快乐起航2012 发表于 2015-10-19 15:03:02

用DIY智能插排自动开关路由器电源

本帖最后由 快乐起航2012 于 2015-10-19 18:22 编辑

用DIY智能插排自动开关路由器电源      路由器一直通着电总感到不安全,不用时白白费着电,容易被人破解,还有说不清的辐射问题。手动去关闭电源又显得过于繁琐,用我们DIY的智能插排可以自动开关路由器的电源吗?下面尝试一下,将路由器插到智能插排上如下图所示:
      
      如何去控制呢?首先让ESP8266的wifi工作在softAP模式,手机进入softAP区域,自动建立连接,softAP上有客户连接意味着有上网要求,此时打开路由器电源,把softAP转换成STATION模式,手机失去和softAP连接后会自动和路由器连接,自动上网。
      ESP8266在STATION模式下同样连接上路由器,此时周期扫描是否有上网设备连接到路由器,如果所有的上网设备都断开和路由器的连接,此时就可以断开路由器的电源了,然后再转换回softAP模式等待下一次上网手机的进入,系统状态转换如下图所示:



      这样在不增加设备的情况下,利用手机识别上网需求,就可以自动开关路由器电源了,看着路由器电源在不经意中为我们打开或关闭,是不是很爽啊!!!

      由于lua API的限制,只能建立TCP连接来判断设备是否在网,所以需要给需要上网的设备增加一个web server的服务或APP来等待连接测试。如果lua能增加一个检测API实现起来就更加简单方便了。

      整个系统代码如下,功能实现了但是结构和容错性还需要进一步调整。

--Created @ 2015/18/18 by taiditek
ap_power=0
ap_power1=0

gpio.write(1,gpio.HIGH)
gpio.write(2,gpio.HIGH)
gpio.write(5,gpio.HIGH)
tmr.delay(1000000)
gpio.write(1,gpio.LOW)
gpio.write(2,gpio.LOW)
gpio.write(5,gpio.LOW)

cnt=0
is_busy=0

function count_sta()
      is_busy=0
      --sk=net.createConnection(net.TCP, 0)
      --sk:on("receive", function(sck, c) print(c) end )
      print("start check ...")
      cnt=0
tmr.alarm(2,3000,1,function()--10秒
      sk=net.createConnection(net.TCP, 0)
    sk:on("receive", function(sck, c) print(c) end )
      ip_adr="192.168.1." .. tostring(100+cnt)
      print("check..." , ip_adr)
      sk:connect(8080,ip_adr)
    sk:on("connection", function(sck,c)
                print("connection on!!")
                print(sck)
                print(c)
                sk:close()
                is_busy=1
    end)
      cnt=cnt+1
      if cnt>5 then
                --tmr.stop(2)
                print()
                if is_busy==0 then
                        print("Turn it off")
                        ap_power=0;
                        gpio.write(2,gpio.LOW)
                        tmr.stop(2)
                        check_ap()
                end
                is_busy=0
                cnt=0
      end
end)
end

function check_ap()
      print("Ready to start soft ap")
      local str=wifi.ap.getmac();
      local ssidTemp=string.format("%s%s%s",string.sub(str,10,11),string.sub(str,13,14),string.sub(str,16,17));
      wifi.setmode(wifi.SOFTAP)      
      local cfg={}
      cfg.ssid="ESP8266_"..ssidTemp;
      cfg.pwd="12345678"
      wifi.ap.config(cfg)
      cfg={}
      cfg.ip="192.168.2.1";
      cfg.netmask="255.255.255.0";
      cfg.gateway="192.168.2.1";
      wifi.ap.setip(cfg);
      tmr.alarm(1,10000,1,function()--10秒
                print("test...")
                sta_list={}
                sta_list=wifi.ap.getclient()
                cnt=0
                for mac,ip in pairs(sta_list) do
                        print(mac,ip)
                        cnt=cnt+1
                end
                if cnt>0 then
                        print("turn it on")
                        ap_power=1
                        gpio.write(2,gpio.HIGH)
                        tmr.stop(1)
                        check_sta()
                end
      end)
end

function check_sta()
      print("Ready to start station")
      wifi.setmode(wifi.STATION)
      wifi.sta.config("xxxxxxxxxx","xxxxxxx")--路由的名称和登陆密码
      tmr.delay(20000000)
      wifi.sta.connect()
      local cnt = 0
      tmr.alarm(0, 1000, 1, function()
                if (wifi.sta.getip() == nil) and (cnt < 500) then
                        print("Trying Connect to Router, Waiting...")
                else
                        print("Conected to Router\r\nMAC:"..wifi.sta.getmac().."\r\nIP:"..wifi.sta.getip())
                        tmr.stop(0);
                        count_sta()
                end
      end)

end

check_ap()



      不要忘记了,运行一段时间后可以到乐联网看看路由器都是什么时候开什么时候关的,这些数据或许还有什么作用呢?比如宽带要不要改成包小时的账号啊... ...

DIY插排
http://www.geek-workshop.com/thread-24907-1-1.html

页: [1]
查看完整版本: 用DIY智能插排自动开关路由器电源