用Blinker-py和树莓派做一个局域网自动关机工具
本帖最后由 kylinpoet 于 2019-4-15 20:57 编辑最近正在学习python.
惊闻Blinker开放了树莓派的接入,正好可以用来练练手。
想起自己每次回家都要手动开机,这次准备解放下思想,所以准备用家里吃灰的树莓派发挥下余热,做个自动开机的工具。
一、准备工作
1、Linux设备/树莓派/香蕉派 MQTT接入(点击:查看官方文档)
2、网络唤醒(WOL)全解指南:原理篇3、设置电脑允许网络唤醒(不同主板设置稍有不同,这里不演示了)
二、操刀下手
总结下blinker的操作流程,应该是这样的:
1.安装手机app
android下载:点击下载
IOS下载:app store中搜索“blinker”下载
2.安装树莓派mqtt接入相关依赖
git clone https://github.com/blinker-iot/blinker-py
cd blinker-py
sudo python3 setup.py install
sudo pip3 install -r requirements.txt
3.在手机app里添加树莓派设备,并记下Secret Key
4.DIY手机app里的树莓派设备操作界面。
三、编写程序
from Blinker import Blinker, BlinkerButton, BlinkerText
from Blinker.BlinkerDebug import *
auth = '' # 修改为获取到的Secret Key
BLINKER_DEBUG.debugAll()
Blinker.mode("BLINKER_WIFI")
Blinker.begin(auth)
import re
import socket
import struct
from time import sleep
# 检查mac地址
def check_mac(mac_addr):
# 长度检查
if len(mac_addr) == 12:
pass
elif len(mac_addr) == 17:
mac_addr = mac_addr.replace(':', '')
else:
return False
# 正则检查
pattern = re.compile(r'{12}')
result = pattern.match(mac_addr)
if result is not None:
return True
else:
return False
def wake_on_lan(mac):
if len(mac) == 12:
pass
elif len(mac) == 17:
mac = mac.replace(':', '')
mac = mac.replace('-', '')
else:
raise ValueError('mac地址有误')
if check_mac(mac):
data = 'FFFFFFFFFFFF' + mac * 16
byte_data = b''
for i in range(0, len(data), 2):
byte_dat = struct.pack('B', int(data, 16))
byte_data = byte_data + byte_dat
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(byte_data, ('192.168.1.255', 7))
sock.close()
else:
raise ValueError('mac地址有误')
button1 = BlinkerButton("btn-abc")
text1 = BlinkerText("tex-abc")
counter = 0
state_tmp = ''
def button1_callback(state):
""" """
BLINKER_LOG('get button state: ', state)
if state=='on':
button1.icon('icon_1')
button1.color('#FF0000')
button1.text('',_text2='正在开机...')
button1.print(state='on')
wake_on_lan('50-9A-4C-57-2C-BD')
if state=='off':
button1.text('已经开机',_text2='请勿重复')
button1.print(state='off')
def data_callback(data):
BLINKER_LOG('read:', data)
button1.attach(button1_callback)
Blinker.attachData(data_callback)
if __name__ == '__main__':
while True:
Blinker.run()
几点思考:
1.Blinker进行界面DIY的时候,能否改变组件大小?
2.在测试的时候,在手机里,按钮点击后,不能改变状态吗?升级到最新版本
3.按钮图标用 button1.icon('icon_1')貌似修改不了
4.虽然有定时模块,但能提供自动化接口就更好了。比如说连上网络等事件。
不能改变组件大小
定时可以自己解析指令,然后编写对应的实现代码
页:
[1]