grovepi/Software/Scratch/wstosgh.py
2025-03-21 16:04:17 +01:00

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()