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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3938|回复: 1

[分享] 用Blinker-py和树莓派做一个局域网自动关机工具

[复制链接]
发表于 2019-4-15 19:56 | 显示全部楼层 |阅读模式
本帖最后由 kylinpoet 于 2019-4-15 20:57 编辑

最近正在学习python.
惊闻Blinker开放了树莓派的接入,正好可以用来练练手。
想起自己每次回家都要手动开机,这次准备解放下思想,所以准备用家里吃灰的树莓派发挥下余热,做个自动开机的工具。
一、准备工作
1、Linux设备/树莓派/香蕉派 MQTT接入(点击:查看官方文档)
2、网络唤醒(WOL)全解指南:原理篇3、设置电脑允许网络唤醒(不同主板设置稍有不同,这里不演示了)
二、操刀下手
总结下blinker的操作流程,应该是这样的:
1.安装手机app
android下载:点击下载
IOS下载:app store中搜索“blinker”下载
2.安装树莓派mqtt接入相关依赖
[mw_shl_code=bash,true]git clone https://github.com/blinker-iot/blinker-py
cd blinker-py
sudo python3 setup.py install
sudo pip3 install -r requirements.txt[/mw_shl_code]

3.在手机app里添加树莓派设备,并记下Secret Key 40b16311d1edeb278e7c6aa7f1b5908.jpg

c0245d04b3ddaf3e351f628c77086de.jpg
4.DIY手机app里的树莓派设备操作界面。
f4263e26f71406f232609db08ef3b12.jpg
三、编写程序
[mw_shl_code=python,true]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'[0-9A-Fa-f]{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[i: i + 2], 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()

[/mw_shl_code]

几点思考:
1.Blinker进行界面DIY的时候,能否改变组件大小?
2.在测试的时候,在手机里,按钮点击后,不能改变状态吗?升级到最新版本
3.按钮图标用 button1.icon('icon_1')貌似修改不了
4.虽然有定时模块,但能提供自动化接口就更好了。比如说连上网络等事件。








发表于 2019-4-16 00:03 | 显示全部楼层
不能改变组件大小
定时可以自己解析指令,然后编写对应的实现代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 20:55 , Processed in 0.109129 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表