|
本帖最后由 快乐起航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实现起来就更加简单方便了。
整个系统代码如下,功能实现了但是结构和容错性还需要进一步调整。
[pre lang="lua" line="1"]--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)
--skn("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)
skn("receive", function(sck, c) print(c) end )
ip_adr="192.168.1." .. tostring(100+cnt)
print("check..." , ip_adr)
sk:connect(8080,ip_adr)
skn("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()
[/code]
不要忘记了,运行一段时间后可以到乐联网看看路由器都是什么时候开什么时候关的,这些数据或许还有什么作用呢?比如宽带要不要改成包小时的账号啊... ...
DIY插排
http://www.geek-workshop.com/thread-24907-1-1.html
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|