我希望通过一个无法发送RESTful消息的软件来控制Phillips色调灯,这样我就会尝试编写一些可以解释TCP消息的中间件传递对灯泡的适当要求。套接字服务器来自我在BinaryTides上找到的一个例子。
我使用qhue来处理Phillips的所有事情,但我的问题是使用python解释消息。当我启动套接字服务器并使用netcat从另一台笔记本电脑连接到它时,我似乎无法激活任何所需的颜色更改。
键入红色或绿色会导致发送qhue消息,但我总是以" UNKOWN COMMAND"结果
# Socket server in python using select function
import socket, select, requests
from qhue import Bridge
if __name__ == "__main__":
CONNECTION_LIST = [] # list of socket clients
RECV_BUFFER = 4096 # Advisable to keep it as an exponent of 2
PORT = 9999
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# this has no effect, why ?
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("0.0.0.0", PORT))
server_socket.listen(10)
# Add server socket to the list of readable connections
CONNECTION_LIST.append(server_socket)
# qhue setup
hueBridge = "172.16.17.73"
hueUsername = "hLaqm-dJZKabcdeTz1QwyMHqiLnzlFl3KKKM2x4o"
b = Bridge(hueBridge, hueUsername)
green = 25500
red = 0
print "Chat server started on port " + str(PORT)
while 1:
# Get the list sockets which are ready to be read through select
read_sockets,write_sockets,error_sockets = select.select(CONNECTION_LIST,[],[])
for sock in read_sockets:
#New connection
if sock == server_socket:
# Handle the case in which there is a new connection recieved through server_socket
sockfd, addr = server_socket.accept()
CONNECTION_LIST.append(sockfd)
print "Client (%s, %s) connected" % addr
#Some incoming message from a client
else:
# Data recieved from client, process it
try:
#In Windows, sometimes when a TCP program closes abruptly,
# a "Connection reset by peer" exception will be thrown
data = sock.recv(RECV_BUFFER)
# echo back the client message
if data:
sock.send('OK ... ' + data)
print data
if str(data) is "Red" :
b.lights[1].state(bri=254, hue=Red)
elif str(data) is "Green" :
b.lights[1].state(bri=254, hue=green)
else:
print "UNKNOWN COMMAND"
# client disconnected, so remove from socket list
except:
broadcast_data(sock, "Client (%s, %s) is offline" % addr)
print "Client (%s, %s) is offline" % addr
sock.close()
CONNECTION_LIST.remove(sock)
continue
server_socket.close()
更新:
我编写了一个简单的脚本,基于raw_input
根据需要执行相同的操作。所以看起来问题在于套接字服务器读取和存储数据的方式。 (以下脚本有效)
from qhue import Bridge
# qhue setup
hueBridge = "172.16.17.73"
hueUsername = "hLaqm-dJZKwMwO9Tz1QwyMHqiLnzlFl3KKKM2x4o"
b = Bridge(hueBridge, hueUsername)
green = 25653
red = 65527
while 1:
Colour = raw_input("Pick a Colour > ")
if str(Colour) == "Red":
b.lights[2].state(bri=254, hue=red)
elif str(Colour) == "Green":
b.lights[2].state(bri=254, hue=green)
else:
print "Unkown Colour"