用Blinker-py和树莓派做一个局域网自动关机工具-Arduino中文社区 - Powered by Discuz! Archiver

kylinpoet 发表于 2019-4-15 19:56

用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.虽然有定时模块,但能提供自动化接口就更好了。比如说连上网络等事件。








coloz 发表于 2019-4-16 00:03

不能改变组件大小
定时可以自己解析指令,然后编写对应的实现代码
页: [1]
查看完整版本: 用Blinker-py和树莓派做一个局域网自动关机工具