轉載請保留原地址. http://www.cnblogs.com/lsqandzy
最近買了幾個智能插座玩,插座安裝在家里,連接好wifi,不管你人在哪里,通過手機,一鍵開啟或關閉插座電源,想象一下,馬上要下班了,天好熱,先把空調打開,等回到家已經涼颼颼的。哈~
閑暇時間用python3寫了 局域網內一鍵掃描和控制插座開關的代碼。
一鍵掃描:
import socket import threading,time class UdpServer: def __init__(self): self.DeviceList={} self.thread_server=threading.Thread(target=self.start) self.thread_server.start() def start(self): address = ('', 48899) self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.s.bind(address) try: while True: data, addr = self.s.recvfrom(1024) if not data: print("exist") break data=str(data) d_list=data.replace("b'","").replace("'","").split(',') if str(addr[0]) in d_list[0]: temp_device={} temp_device['IP']=d_list[0] temp_device['MAC']=d_list[1] temp_device['SN']=d_list[2] temp_device['RES']=d_list[3] temp_device['STATUS']=d_list[4] self.DeviceList[addr[0]]=temp_device self.s.close() except: self.s.close() print("Thread Wrong") def stop(self): self.s.close() del self.thread_server def getDevice(self): return self.DeviceList try: ss=UdpServer() address = ('192.168.1.255', 48899) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) msg = b"""YZ-RECOSCAN""" s.sendto(msg, address) s.close() time.sleep(1) DeviceList=ss.getDevice() ss.stop() for item in DeviceList: print(DeviceList[item]) except: print("wrong") del ss
貼圖:
接了3個插座,ip分別是 128、123、121
Status表示開關狀態 0關閉 1開啟
Mac是網卡mac不解釋
Res是插座的工作狀態 0異常(正在啟動、正在恢復、等等) 1正常
Sn是插座的序列號
一鍵控制:
from socket import * HOST='192.168.1.121' PORT=8899 tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect((HOST,PORT)) data2 =b"""AT+YZSWITCH=1,ON,201604151533""" tcpCliSock.send(data2) data1 = tcpCliSock.recv(1024) print (data1)
控制121插座開啟
操作成功!
以上是在局域網內控制的代碼。