wifi智能插座 一鍵掃描局域網內插座Ip及其它信息 Python源代碼API

轉載請保留原地址. 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插座開啓

 

操作成功!

 

以上是在局域網內控制的代碼。

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