查看: 537|回复: 1

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

[复制链接]
  • TA的每日心情

    2019-8-26 10:10
  • 签到天数: 631 天

    [LV.9]以坛为家II

    发表于 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接入相关依赖

    kittenblock中小学创客名师推荐的图形化编程软件

    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 40b16311d1edeb278e7c6aa7f1b5908.jpg

    c0245d04b3ddaf3e351f628c77086de.jpg
    4.DIY手机app里的树莓派设备操作界面。
    f4263e26f71406f232609db08ef3b12.jpg
    三、编写程序

    kittenblock中小学创客名师推荐的图形化编程软件

    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()
    
    


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








  • TA的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2019-4-16 00:03 | 显示全部楼层
    不能改变组件大小
    定时可以自己解析指令,然后编写对应的实现代码
    如果你觉得以上内容帮到了你,你可以打赏支持作者
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    ArduinoJason6教程由ArduinoJson作者Benoit亲自出马一对一教学
    ArduinoJason6教程由Ardui
    这几天我觉得社区教学好像缺了点什么,呃呃~我想一想好像是缺少了ArduinoJson6的教学
    Arduino+L298N小车实例教程
    Arduino+L298N小车实例教
    (第一次写教程,如有错漏,敬请拍砖)Arduino+L298N小车实例教程Arduino小车是一个非
    零知开源分享-蓝牙模块与手机APP通信
    零知开源分享-蓝牙模块与
    本篇文章中将讲解蓝牙模块与安卓手机APP进行通信。1、说明MCU:零知开发板-标准板模
    DHT库无法被找到
    DHT库无法被找到
    今天在安装了DHT库之后在编译时却显示无法找到库,请问我是在哪里安装出错了,谢谢大
    (可远程)ESP8266读DHT11温湿度,APP inventor制作app实时显示
    (可远程)ESP8266读DHT11
    原理讲解 原理简述:利用发布订阅模式。第一步,先读取DHT11温湿度数值,第二步,新
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表