DIY個人智能家庭網關——python篇之門磁觸發後自動點亮WIFI燈帶

#!/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())

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章