#!/usr/bin/env python# -*- coding: utf-8 -*- import serial import socketimport threadingfrom time import sleep import jsonimport subPRocessUDP_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地址作为设备的唯一IDwifi_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())
新闻热点
疑难解答