kappa8086 发表于 2017-5-15 14:38:47

wifi + DHCP 实现基本的入户感知

本帖最后由 kappa8086 于 2017-5-15 15:40 编辑

说到智能家居入口,之前脑中先闪现了一堆协议名词比如 zigbee, ibeacon
然而除了特定的单个应用,似乎根本没有可扩展性的成熟产品出现
而我这里只是想开始做一个最简单的功能:主人进门后自动放一段音乐

经过了很多绕弯子的想法后(连 NFC 都用上了,甚至还要给手机专门写 app),头脑终于才清灵过来。

这个事情很简单,回家后手机必然自动连接 wifi (如果这个也不靠谱蓝牙类应用就更难说了),AP 端一般不能进行二次开发,何况很多人家里不只一个无线 AP;但 DHCP 服.务通常有且只有一个,而 wifi 也要靠这个来分配 IP。这就是切入点。

DHCP如何触发到我们自己的应用?当然首先要看家中网络的DHCP是什么具体服.务提供的,其有没有扩展能力。
一般来说,这个服.务都由路由器来提供,如果你的路由器可以刷机且系统是基于 openwrt 的或者是 tomato 的某个改版(我这里用的是 shibby),那么就天然的具体扩展能力,而其 DHCP 服.务通常是 dnsmasq;这个前提并不重要,如果你的路由器或 DHCP server 本身没有扩展能力,你大可以关掉路由的 DHCP 功能,在任一个 linux 开发板上如 ct 自己部署一个 dnsmasq,这样 DNS 和 DHCP 就都可以自己折腾着玩儿了。

于是这就以 dnsmasq 为例。其打开 DHCP 功能后,有一个配置项叫 dhcp-script:dhcp-script=/tmp/home/root/dhcp-register.sh在 tomato 系统当中,最好是把这项从管理界面上配置到 DHCP/DNS 的自定义配置中去,这样存在 nvram 里不会丢失。

然后 ssh 进入,创建该脚本
vi /tmp/home/root/dhcp-register.sh
内容为#!/bin/sh

wget -T 2 "http://192.168.1.23:1024/entry?action=$1&mac=$2&ip=$3&host=$4" > /dev/nulltomato 下没有 curl,以 wget 代劳,无论如何,这只是一个引线,当一个设备以 DHCP 注册一个 IP 的时候,该脚本触发,参数含义分别为:$1 - 动作类型 (add/old/del/...),$2 - MAC 地址,$3 - 分配IP地址, $4 - 设备主机名

如果 dnsmasq 是被部署在开发板上并且和目标应用在一块,那这里甚至可以直接执行目标应用,但注意异步,否则执行不完卡死 dnsmasq 就不好玩了。我这里三部分分开,dnsmasq 这里的脚本只做触发端,于是还需要一个接收端和一个应用脚本。





kappa8086 发表于 2017-5-15 14:59:45

本帖最后由 kappa8086 于 2017-5-15 15:23 编辑

老办法,python + Flask 写一个简单的 webserver 并用 service 文件包装一下成为 systemd 服.务。#!/bin/python

from flask import Flask,request
import subprocess

app = Flask(__name__)
ctrlscript = os.path.expanduser('~/bin/homectrl.sh')

@app.route('/')
def index():
    return ''

@app.route('/entry', methods=['GET', 'POST'])
def entry():
    subprocess.Popen([ctrlscript, request.args.get('action'),
      request.args.get('mac'), request.args.get('ip')])
    return 'ok'

if __name__ == '__main__':
    app.run(host= '0.0.0.0', port=1024)执行脚本,在一个mpd的曲库列表里随机抽三首播放。这里的关键是执行条件,除了要判断手机的MAC地址,还需要有个时间限定,以及执行次数限定,这个场景一天只应该出现一次#!/bin/bash

action=$1
mac=$2
ipaddr=$3

ts_file=/var/tmp/homectrl.ts
tm_start=1800
tm_end=2200
music_list_file=~/welcome-music.list

function mpcfadein {
    #mpd音量渐入过程,进门被突然出现的高音吓一跳绝对不是一种好的体验
    ((steps=($2-$1)/5))
    ((interval=$3/$steps))
    c=0
    while [ $c -lt $steps ]; do
      ((cvol=$1+5*$c))
    ((c=$c+1))
      mpc volume $cvol
      usleep $interval
    done
    mpc volume $2
}

if [ "$mac" == "01:23:45:67:89:ab" ] && [ "$action" == "old" ]; then    #除第一次注册时是add,之后都是old...
    dt=`date +%Y%m%d`
    ts=`date +%H%M`
    saved_dt=""
    [ -f $ts_file ] && saved_dt=`cat $ts_file`
    if [ "$dt" != "$saved_dt" ] && [ $ts -gt $tm_start ] && [ $ts -lt $tm_end ]; then
      randomsongs=`sort -R $music_list_file | head -n 3`
      mpc clear
      IFS=
\n'
      for song in $randomsongs; do
            mpc add "$song"
            mpc volume 10
            mpc play
            mpcfadein 10 60 2000000
      done
      echo $dt > $ts_file
    fi
fi

gancubieboard 发表于 2019-4-9 23:11:59

路过,发几张美女图片
https://aff.sexsex2.com/img/xiong_leg1.jpg?from=bbs
https://aff.sexsex2.com/img/beauty_sexy_no.jpg?from=bbs
https://aff.sexsex2.com/img/luoli1.jpg?from=bbs
页: [1]
查看完整版本: wifi + DHCP 实现基本的入户感知