您的位置:首页 > 编程语言 > Python开发

DIY个人智能家庭网关——python篇之门磁触发后自动点亮WIFI灯带

2017-02-27 23:38 423 查看
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
import socket
import threading
from time import sleep
import json
import subprocess

UDP_BROCAST_HOST = '192.168.1.255'  # UDP广播发送地址
UDP_BROCAST_PORT = 1235   # UDP广播发送端口
RECV_PORT = 1234  # UDP接收端口
UDP_ADDR = (UDP_BROCAST_HOST, UDP_BROCAST_PORT)

# 打开串口
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=0.5)

# 门磁的地址码
door_sensor_addr = "0x5555"
# WIFI灯带的MAC地址作为设备的唯一ID
wifi_light_id = "5c:cf:7f:d5:06:d3"

# UDP 收发器
class UdpTransceiver(threading.Thread):
run = False

def __init__(self,addr,port):
threading.Thread.__init__(self)
self.socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
address = (addr, port)
self.socket.bind(address)

def set_recv_cb(self,cb):
self.recv_cb = cb

def close(self):
self.socket.close()

def run(self):
run = True
while self.run:
data,addr = self.socket.recvfrom(1024)
self.recv_cb(self,TransceiverType.udp, addr,data)

def send(self,addr,data):
self.socket.sendto(data,addr)

def stop(self):
self.run = False

def recv(serial):
while True:
data =serial.read(64)
if data == '':
continue
else:
break
sleep(0.02)
return data

if __name__ == "__main__":
# 创建UDP接口
udpTrans = UdpTransceiver(UDP_BROCAST_HOST, RECV_PORT)

while True:
data =recv(ser)
if data != '':
print "receive %s"%data
s = json.loads(data)
if s["addr"] == door_sensor_addr:
# 命令为:设置工作模式 params有3个参数,1表示渐亮模式,10和80表示10秒从灭渐变到80%的亮度
cmd = {"cmd":"set_mode","id":wifi_light_id,"params":["1","10","80"]}
# 转换成json
json_str = json.dumps(cmd)
# 发送命令
udpTrans.send(UDP_ADDR, json_str.encode())
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: