查看: 144|回复: 1

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

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

    2019-4-23 03:36
  • 签到天数: 513 天

    [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的每日心情
    擦汗
    2018-9-19 20:22
  • 签到天数: 47 天

    [LV.5]常住居民I

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

    本版积分规则

    热门推荐

    arduino温湿度串口监视器显示问题
    arduino温湿度串口监视器
    本人刚学arduino,遇到一些技术问题,希望大佬们帮我看一下程序,具体就是温湿度开始
    全过程展示:PWM自定义、测速、PID调速、PID自整定
    全过程展示:PWM自定义、
    有一天,电控小白在某宝上买来了一块Arduino Mega2560、一款直流电机。小白想:“这款
    关于数据同步遇到的问题
    关于数据同步遇到的问题
    首先,下载了DHT-sensor-library-master.zip 并解压到libraries文件夹中(图1) 其次
    blinker设备连接一会后自动断开
    blinker设备连接一会后自
    [mw_shl_code=arduino,true]#define BLINKER_WIFI #define BLINKER_PRINT Serial #
    学生智能打卡系统(接入blinker)
    学生智能打卡系统(接入bl
    【项目名称】学生智能打卡系统(接入blinker) 一.感谢各位大佬 首先感谢社区的管理员
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表