123 lines
No EOL
4.2 KiB
Python
Executable file
123 lines
No EOL
4.2 KiB
Python
Executable file
import array
|
|
import itertools
|
|
import socket
|
|
import struct
|
|
import sys
|
|
import threading
|
|
import time
|
|
from websocket_server import WebsocketServer
|
|
|
|
|
|
def rcv_from_sgh():
|
|
global s,c,server
|
|
dataPrevious = ""
|
|
while True:
|
|
print "listening for data from sgh"
|
|
# time.sleep(1)
|
|
data = dataPrevious + c.recv(8192)
|
|
print "data length" , len(data)
|
|
if data != "":
|
|
print "Data received from sgh", data
|
|
#print ("datalen: %s", len(data))
|
|
|
|
if len(data) > 0: # Connection still valid so process the data received
|
|
|
|
dataIn = data
|
|
|
|
datawithCAPS = data
|
|
# dataOut = ""
|
|
dataList = [] # used to hold series of broadcasts or sensor updates
|
|
dataPrefix = "" # data to be re-added onto front of incoming data
|
|
while len(dataIn) > 0: # loop thru data
|
|
if len(dataIn) < 4: # If whole length not received then break out of loop
|
|
# print "<4 chrs received"
|
|
dataPrevious = dataIn # store data and tag it onto next data read
|
|
break
|
|
sizeInfo = dataIn[0:4]
|
|
size = struct.unpack(">L", sizeInfo)[0] # get size of Scratch msg
|
|
# print "size:", size
|
|
if size > 0:
|
|
# print dataIn[4:size + 4]
|
|
dataMsg = dataIn[4:size + 4].lower() # turn msg into lower case
|
|
|
|
if len(dataMsg) < size: # if msg recieved is too small
|
|
# print "half msg found"
|
|
# print size, len(dataMsg)
|
|
dataPrevious = dataIn # store data and tag it onto next data read
|
|
break
|
|
#print "msg:",dataMsg
|
|
dataList.append(dataMsg)
|
|
dataIn = dataIn[size + 4:] # cut data down that's been processed
|
|
|
|
# print "previous:", dataPrevious
|
|
print "datalist:",dataList
|
|
for msg in dataList:
|
|
#print "msg:",msg[0:13]
|
|
if msg[0:13] == 'sensor-update':
|
|
msgsplit = msg[14:].replace('"','').split(' ')
|
|
print "split",msgsplit
|
|
#for loop in range(int(len(msgsplit) / 2)):
|
|
# server.send_message_to_all(msgsplit[loop * 2] + ':' + msgsplit[(loop * 2) + 1])
|
|
server.send_message_to_all(msgsplit[0] + ':' + msgsplit[1])
|
|
else:
|
|
time.sleep(0.1)
|
|
|
|
|
|
|
|
|
|
# Called for every client connecting (after handshake)
|
|
def new_client(client, server):
|
|
print("New client connected and was given id %d" % client['id'])
|
|
#server.send_message_to_all("Hey all, a new client has joined us")
|
|
|
|
|
|
# Called for every client disconnecting
|
|
def client_left(client, server):
|
|
print("Client(%d) disconnected" % client['id'])
|
|
|
|
|
|
# Called when a client sends a message
|
|
def message_received(client, server, message):
|
|
if len(message) > 200:
|
|
message = message[:200]+'..'
|
|
print("Client(%d) said: %s" % (client['id'], message))
|
|
dataOut = message
|
|
|
|
n = len(dataOut)
|
|
b = (chr((n >> 24) & 0xFF)) + (chr((n >> 16) & 0xFF)) + (chr((n >> 8) & 0xFF)) + (
|
|
chr(n & 0xFF))
|
|
c.send(b + dataOut)
|
|
print "Data sent to sgh", dataOut
|
|
|
|
|
|
|
|
|
|
# For Scratch 3 handle long as int
|
|
if sys.version > '3':
|
|
long = int
|
|
|
|
|
|
|
|
|
|
|
|
s = socket.socket() #Create a socket object
|
|
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
#host = socket.gethostname() #Get the local machine name
|
|
port = 42001 # Reserve a port for your service
|
|
s.bind(('127.0.0.1',port)) #Bind to the port
|
|
|
|
s.listen(5) #Wait for the client connection
|
|
print "wstosgh listening to scratchGPIO_handler"
|
|
c,addr = s.accept() #Establish a connection with the client
|
|
print "Got connection from ScratchGPIOHandler", addr
|
|
|
|
|
|
PORT=8000
|
|
server = WebsocketServer(PORT)
|
|
server.set_fn_new_client(new_client)
|
|
server.set_fn_client_left(client_left)
|
|
server.set_fn_message_received(message_received)
|
|
d = threading.Thread(name='rcv_from_sgh', target=rcv_from_sgh)
|
|
d.setDaemon(True)
|
|
d.start()
|
|
server.run_forever() |