Пример #1
0
class WsServer(threading.Thread):
    def __init__(self, conf=None, controller=None):
        threading.Thread.__init__(self)
        if conf == None:
            self.conf = dict(port=4000, host='127.0.0.1')
        else:
            self.conf = conf
        self.server = WebsocketServer(self.conf["port"],
                                      host=self.conf["host"])
        self.server.set_fn_new_client(self.new_client)
        self.server.set_fn_client_left(self.client_left)
        self.server.set_fn_message_received(self.message_received)

    def run(self):
        self.server.run_forever()

    def new_client(client, server):
        logging.info("WS: New Client")
        self.server.send_message_to_all("Hey all, a new client has joined us")

    def client_left(client, server):
        logging.info("WS: Client left")
        self.server.send_message_to_all("Hey all, a new client has joined us")

    def message_received(client, server, message):
        logging.info("WS: New message " + message)

    def disconnect(self):
        logging.info("WS:Disconnect")
        self.server.shutdown()
Пример #2
0
class WebsocketThread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.websocket = Websocket_Server()
        self.server = WebsocketServer(config.WS_PORT,loglevel=logging.INFO)
        self.client = self.websocket.new_client
        self.server.set_fn_new_client(self.client)
        self.server.set_fn_message_received(self.websocket.message_received)

    def run(self):
        self.server.run_forever()

    def shutdown(self):
        self.server.shutdown()
Пример #3
0
class WSServer:
    def __init__(self):
        self.serv = None
        self.clients = []
        self.previous_messages = []

    def start(self):
        port = 4001
        self.serv = WebsocketServer(port, "0.0.0.0")
        self.serv.set_fn_new_client(self.client_joined)
        self.serv.set_fn_message_received(self.message_received)
        self.serv.set_fn_client_left(self.client_left)
        thr = Thread(target=lambda: self.serv.run_forever())
        thr.start()

    def stop(self):
        self.serv.shutdown()
        self.serv.server_close()

    def send_ws_message(self, msg):
        if not self.is_enabled():
            return
        self.previous_messages.append(msg)
        self.serv.send_message_to_all(msg)

    def is_enabled(self):
        return self.serv is not None

    def client_joined(self, client, server):
        if len(self.previous_messages) == 0:
            return
        server.send_message(client, "payload-start")
        for prev_msg in self.previous_messages:
            server.send_message(client, prev_msg)
        server.send_message(client, "payload-end")

    def message_received(self, client, server):
        pass

    def client_left(self, client, server):
        pass
Пример #4
0
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

    return ch


def startServer(server):
    print("HMI signals listener was started\r")
    server.set_fn_new_client(new_client)
    server.set_fn_client_left(client_left)
    server.set_fn_message_received(message_received)
    server.run_forever()


def keyBoardEvent():
    global server
    char = ' '
    while char != 'q':
        char = getch()


server = WebsocketServer(8081)
serverThread = Thread(target=startServer, args=(server, ))
keyBoardThread = Thread(target=keyBoardEvent)
keyBoardThread.start()
serverThread.start()

keyBoardThread.join()
print("Closing server...")
server.shutdown()
server.server_close()
Пример #5
0
class WBmessenger(object):
    def __init__(self, viewerparent):
        self.parent = viewerparent
        self.ProcessMessage = self.parent.ProcessMessage
        self.websockport = self.parent.websockport
        self.sleeptime = self.parent.sleeptime
        self.mprint = self.parent.mprint
        self.parent.lastviewmtrx
        self.browserisopen = False
        self.msgqueue = []
        self.msgdelim = ":\n"
        self.ishandling = False
        self.websockclient = None
        self.isterminating = False
        self.was_disconnected = None
        self.mywebsock = None
        self.websockeventloop = None

    def Sleep(self, t):
        time.sleep(t)

    def OnWebsocketClientMessage(self, client, server, message):
        self.ProcessMessage(message)

    def StartWebsocket(self):
        self.server = WebsocketServer(self.websockport, host='127.0.0.1')
        if not self.server:
            raise Sorry("Could not connect to web browser")
        self.server.set_fn_new_client(self.OnConnectWebsocketClient)
        self.server.set_fn_client_left(self.OnDisconnectWebsocketClient)
        self.server.set_fn_message_received(self.OnWebsocketClientMessage)
        self.wst = threading.Thread(target=self.server.run_forever)
        self.wst.daemon = True
        self.wst.start()
        self.msgqueuethrd = threading.Thread(target=self.WebBrowserMsgQueue)
        self.msgqueuethrd.daemon = True
        self.msgqueuethrd.start()

    def StopWebsocket(self):
        try:
            if self.websockclient:  # might not have been created if program is closed before a data set is shown
                self.websockclient['handler'].send_text(u"", opcode=0x8)
        except Exception as e:
            self.mprint(to_str(e) + "\n" + traceback.format_exc(limit=10),
                        verbose=0)
        self.mprint("Shutting down Websocket listening thread", verbose=1)
        self.server.shutdown()
        self.parent.javascriptcleaned = True
        self.msgqueuethrd.join()
        self.mprint("Shutting down WebsocketServer", verbose=1)
        self.wst.join()
        self.isterminating = True

    def AddToBrowserMsgQueue(self, msgtype, msg=""):
        self.msgqueue.append((msgtype, msg))

    def WebBrowserMsgQueue(self):
        try:
            while True:
                nwait = 0.0
                time.sleep(self.sleeptime)
                if self.parent.javascriptcleaned:
                    self.mprint("Shutting down WebBrowser message queue",
                                verbose=1)
                    return
                if len(self.msgqueue):
                    pendingmessagetype, pendingmessage = self.msgqueue[0]
                    gotsent = self.send_msg_to_browser(pendingmessagetype,
                                                       pendingmessage)
                    while not self.browserisopen:  #self.websockclient:
                        time.sleep(self.sleeptime)
                        nwait += self.sleeptime
                        if nwait > self.parent.handshakewait or self.parent.javascriptcleaned or not self.viewerparams.scene_id is not None:
                            return
                    if gotsent:
                        self.msgqueue.remove(self.msgqueue[0])
                    #if self.was_disconnected:
                    #  nwait2 = 0.0
                    #  while nwait2 < self.parent.handshakewait:
                    #    nwait2 += self.sleeptime
                    #  self.ReloadNGL()


# if the html content is huge the browser will be unresponsive until it has finished
# reading the html content. This may crash this thread. So try restarting this thread until
# browser is ready
        except Exception as e:
            self.mprint( str(e) + ", Restarting WebBrowserMsgQueue\n" \
                                + traceback.format_exc(limit=10), verbose=2)
            self.websockclient = None
            self.WebBrowserMsgQueue()

    def OnConnectWebsocketClient(self, client, server):
        self.websockclient = client
        self.mprint("Browser connected:" + str(self.websockclient), verbose=1)
        if self.was_disconnected:
            self.was_disconnected = False
        if self.parent.lastviewmtrx and self.parent.viewerparams.scene_id is not None:
            self.parent.set_volatile_params()
            self.mprint("Reorienting client after refresh:" +
                        str(self.websockclient),
                        verbose=2)
            self.AddToBrowserMsgQueue("ReOrient", self.parent.lastviewmtrx)
        else:
            self.parent.SetAutoView()

    def OnDisconnectWebsocketClient(self, client, server):
        self.mprint("Browser disconnected:" + str(client), verbose=1)
        self.was_disconnected = True

    def send_msg_to_browser(self, msgtype, msg=""):
        message = u"" + msgtype + self.msgdelim + str(msg)
        if self.websockclient:
            nwait = 0.0
            while not ("Ready" in self.parent.lastmsg or "tooltip_id" in self.parent.lastmsg \
              or "CurrentViewOrientation" in self.parent.lastmsg or "AutoViewSet" in self.parent.lastmsg \
              or "ReOrient" in self.parent.lastmsg or "JavaScriptCleanUp" in self.parent.lastmsg or self.websockclient is None):
                time.sleep(self.sleeptime)
                nwait += self.sleeptime
                if nwait > 2.0 and self.browserisopen:
                    self.mprint("ERROR: No handshake from browser!", verbose=0)
                    self.mprint("failed sending " + msgtype, verbose=1)
                    self.mprint("Reopening webpage again", verbose=0)
                    break
        if self.browserisopen and self.websockclient is not None:
            try:
                self.server.send_message(self.websockclient, message)
                return True
            except Exception as e:
                self.mprint(str(e) + "\n" + traceback.format_exc(limit=10),
                            verbose=1)
                self.websockclient = None
                return False
        else:
            return self.parent.OpenBrowser()
Пример #6
0
class FakeGWServer(threading.Thread):
    """
	Creates an FakeGWServer.

	Arguments:
	port -- port of WebSocket connection.
	config -- configuration of behaviour, could contain following parameters:
		'autoRegister' -- automatic registration accepting
		'autoResponse' -- automatic response for requests
		'autoData' -- automatic data messages processing
		'prePaired' -- list of paired devices for device_list requests.
		'autoNewDevice' -- automatic new device reqests handling
	"""
    def __init__(self, port, config, host='127.0.0.1'):
        self.autoRegister = config['autoRegister']
        self.autoResponse = config['autoResponse']
        self.autoData = config['autoData']
        self.prePaired = config['prePaired']
        self.autoNewDevice = config['autoNewDevice']

        self.WSServer = WebsocketServer(port, host, loglevel=logging.DEBUG)
        self.WSServer.set_fn_message_received(self.message_received)
        self.WSServer.set_fn_client_left(self.client_left)
        self.WSServer.set_fn_new_client(self.new_client)

        self.messages = []
        self.dataMessages = []
        self.responseMessages = []
        self.newDevices = []
        self.client = None
        self.clientLock = threading.Lock()
        self.newConnection = threading.Condition(self.clientLock)
        self.disconnect = threading.Condition(self.clientLock)
        self.newMessage = threading.Condition(self.clientLock)
        self.newDataMessage = threading.Condition(self.clientLock)
        self.newResponseMessage = threading.Condition(self.clientLock)
        self.newDeviceMessage = threading.Condition(self.clientLock)
        self.connected = False
        self.resetEnable = False
        super().__init__()

    def run(self):
        self.WSServer.run_forever()
        self.WSServer.socket.close()

    def stop(self):
        self.WSServer.shutdown()

    def enableReset(self):
        with self.clientLock:
            self.resetEnable = True

    def new_client(self, client, server):
        with self.clientLock:
            if self.connected:
                logging.debug("Unknown client refused")
                client['handler'].send_text("",
                                            websocket_server.OPCODE_CLOSE_CONN)
            elif self.client is None or self.resetEnable:
                self.client = client
                if not self.autoRegister:
                    self.connected = True
                    self.newConnection.notify_all()
                self.resetEnable = False
                logging.debug("connection established")
            else:
                logging.debug("dropping completely")
                client['handler'].send_text("",
                                            websocket_server.OPCODE_CLOSE_CONN)

    def client_left(self, client, server):
        with self.clientLock:
            if client == self.client:
                logging.debug("client disconnected")
                self.connected = False
                self.messages = []
                self.disconnect.notify_all()
            else:
                logging.debug("unknown client disconnected")

    def message_received(self, client, server, message):
        logging.debug("received: " + message)
        with self.clientLock:
            if self.client != client:
                logging.debug("dropping message from unknown client")
                return
            try:
                jsonMessage = json.loads(message)
                if self.autoRegister:
                    if jsonMessage['message_type'] == "gateway_register":
                        self.WSServer.send_message(
                            self.client,
                            '{ "message_type" : "gateway_accepted" }')
                        self.connected = True
                        self.newConnection.notify_all()
                        return
                if self.autoData:
                    if jsonMessage['message_type'] == "sensor_data_export":
                        sensorData = SensorData.SensorData()
                        sensorData.fromJSON(jsonMessage['data'][0])
                        self.dataMessages.append(sensorData)
                        self.newDataMessage.notify_all()
                        response = {}
                        response['message_type'] = "sensor_data_confirm"
                        response['id'] = jsonMessage['id']
                        logging.debug("sending message: " +
                                      json.dumps(response))
                        self.WSServer.send_message(self.client,
                                                   json.dumps(response))
                        return
                if self.prePaired is not None:
                    if jsonMessage['message_type'] == "device_list_request":
                        if jsonMessage['device_prefix'] in self.prePaired:
                            response = {}
                            response['message_type'] = "device_list_response"
                            response['id'] = jsonMessage['id']
                            response['status'] = 1
                            response['devices'] = self.prePaired[
                                jsonMessage['device_prefix']]
                            logging.debug("sending message: " +
                                          json.dumps(response))
                            self.WSServer.send_message(self.client,
                                                       json.dumps(response))
                        return
                if self.autoResponse:
                    if jsonMessage['message_type'] == "response_with_ack":
                        self.responseMessages.append(jsonMessage)
                        self.newResponseMessage.notify_all()
                        response = {}
                        response['message_type'] = "generic_ack"
                        response['id'] = jsonMessage['id']
                        response['status'] = jsonMessage['status']
                        logging.debug("sending message: " +
                                      json.dumps(response))
                        self.WSServer.send_message(self.client,
                                                   json.dumps(response))
                        return
                    if jsonMessage['message_type'] == "generic_response":
                        self.responseMessages.append(jsonMessage)
                        self.newResponseMessage.notify_all()
                        return

                if self.autoNewDevice:
                    if jsonMessage['message_type'] == "new_device_request":
                        device = Device.Device(jsonMessage)
                        self.newDevices.append(device)
                        self.newDeviceMessage.notify_all()
                        response = {}
                        response['message_type'] = "generic_ack"
                        response['id'] = jsonMessage['id']
                        response['status'] = 1
                        logging.debug("sending message: " +
                                      json.dumps(response))
                        self.WSServer.send_message(self.client,
                                                   json.dumps(response))
                        return

            except Exception as ex:
                logging.error("Exception: " + str(ex))
                pass

            self.messages.append(message)
            self.newMessage.notify_all()

    def nextNewDevice(self, timeout=10):
        with self.clientLock:
            if not self.newDevices:
                self.newDeviceMessage.wait(timeout)
            if self.newDevices:
                return self.newDevices.pop(0)

    def nextResponse(self, timeout=10):
        with self.clientLock:
            if not self.responseMessages:
                self.newResponseMessage.wait(timeout)
            if self.responseMessages:
                return self.responseMessages.pop(0)

    def nextData(self, timeout=10):
        with self.clientLock:
            if not self.dataMessages:
                self.newDataMessage.wait(timeout)
            if self.dataMessages:
                return self.dataMessages.pop(0)

    def clearData(self):
        with self.clientLock:
            self.dataMessages = []

    def nextMessage(self, timeout=10):
        with self.clientLock:
            if not self.messages:
                self.newMessage.wait(timeout)
            if self.messages:
                return self.messages.pop(0)

    def waitForDisconnect(self, timeout=10):
        with self.clientLock:
            if not self.connected:
                return True
            self.disconnect.wait(timeout)
            return not self.connected

    def waitForConnection(self, timeout=10):
        with self.clientLock:
            if self.connected:
                return True
            self.newConnection.wait(timeout)
            return self.connected

    def sendMessage(self, message):
        with self.clientLock:
            if self.connected:
                logging.debug("sending message: " + message)
                self.WSServer.send_message(self.client, message)
            else:
                raise Exception("client is not connected")
Пример #7
0
class WebsocketServerModule(ModuleProcess):
    def __init__(self, baseConfig, pInBoundQueue, pOutBoundQueue,
                 loggingQueue):

        # super(WebsocketServerModule, self).__init__()
        ModuleProcess.__init__(self, baseConfig, pInBoundQueue, pOutBoundQueue,
                               loggingQueue)
        self.alive = False
        self.config = baseConfig
        self.inQueue = pInBoundQueue  # inQueue are messages from the main process to websocket clients
        self.outQueue = pOutBoundQueue  # outQueue are messages from clients to main process
        self.websocketServer = None
        self.loggingQueue = loggingQueue
        self.threadProcessQueue = None

        # Configs
        self.moduleConfig = configLoader.load(self.loggingQueue, __name__)

        # Constants
        self._port = self.moduleConfig['WebsocketPort']
        self._host = self.moduleConfig['WebsocketHost']

        # logging setup
        self.logger = ThreadsafeLogger(loggingQueue, __name__)

    def run(self):
        if not self.check_ss_version():
            #cant run with wrong version so we return early
            return False
        """ Main thread entry point.

        Sets up websocket server and event callbacks.
        Starts thread to monitor inbound message queue.
        """

        self.logger.info("Starting websocket server")
        self.alive = True
        self.listen()

        self.websocketServer = WebsocketServer(self._port, host=self._host)
        self.websocketServer.set_fn_new_client(self.new_websocket_client)
        self.websocketServer.set_fn_message_received(
            self.websocket_message_received)
        self.websocketServer.run_forever()

    def check_ss_version(self):
        #check for min version met
        self.logger.info('Module version %s' % (__version__))
        if LooseVersion(self.config['ss_version']) < LooseVersion(
                self.moduleConfig['MinSimpleSensorVersion']):
            self.logger.error(
                'This module requires a min SimpleSensor %s version.  This instance is running version %s'
                % (self.moduleConfig['MinSimpleSensorVersion'],
                   self.config['ss_version']))
            return False
        return True

    def new_websocket_client(self, client, server):
        """ Client joined callback - called whenever a new client joins. """

        self.logger.debug("Client joined")

    def websocket_message_received(self, client, server, message):
        """ Message received callback - called whenever a new message is received. """

        self.logger.debug('Message received: %s' % message)
        message = json.loads(message)
        self.logger.info("message jsond: %s" % message)
        _msg = Message(topic=message['topic'], sender_id=message['sender_id'])
        if 'sender_type' in message:
            _msg.sender_type = message['sender_type']
        if 'recipients' in message:
            _msg.recipients = message['recipients']
        if 'extended_data' in message:
            _msg.extended_data = message['extended_data']

        self.put_message(_msg)

    def listen(self):
        self.threadProcessQueue = Thread(target=self.process_queue)
        self.threadProcessQueue.setDaemon(True)
        self.threadProcessQueue.start()

    def shutdown(self):
        """ Handle shutdown message. 
        Close and shutdown websocket server.
        Join queue processing thread.
        """

        self.logger.info("Shutting down websocket server")

        try:
            self.logger.info("Closing websocket")
            self.websocketServer.server_close()
        except Exception as e:
            self.logger.error("Websocket close error : %s " % e)

        try:
            self.logger.info("Shutdown websocket")
            self.websocketServer.shutdown()
        except Exception as e:
            self.logger.error("Websocket shutdown error : %s " % e)

        self.alive = False

        self.threadProcessQueue.join()

        time.sleep(1)
        self.exit = True

    def handle_message(self, message):
        """ Send message to listening clients. """
        self.websocketServer.send_message_to_all(json.dumps(message.__dict__))

    def process_queue(self):
        """ Monitor queue of messages from main process to this thread. """

        while self.alive:
            if (self.inQueue.empty() == False):
                try:
                    message = self.inQueue.get(block=False, timeout=1)
                    if message is not None:
                        if message.topic.upper() == "SHUTDOWN":
                            self.logger.debug("SHUTDOWN handled")
                            self.shutdown()
                        else:
                            self.handle_message(message)
                except Exception as e:
                    self.logger.error("Websocket unable to read queue : %s " %
                                      e)
            else:
                time.sleep(.25)
Пример #8
0
def test_websocket():
    """
    Start a ws.Client and check basic functionality.
    """
    serverQ = Queue(1)
    clientQ = Queue(1)
    errorQ = Queue(1)

    def receive(client, server, message):
        if message == HELLO:
            server.send_message(client, YO)
        elif message == QUIT:
            client["handler"].request.send(CLOSE_HANDSHAKE)
            server.shutdown()
        serverQ.put(message)

    server = WebsocketServer(PORT, HOST)
    server.set_fn_message_received(receive)
    serverThread = threading.Thread(None, server.run_forever)
    serverThread.start()
    time.sleep(1)

    class test:
        was_opened = False
        was_closed = False

    def on_open(ws):
        test.was_opened = True

    def on_message(ws, msg):
        clientQ.put(msg, timeout=1)

    def on_close(ws):
        test.was_closed = True

    def on_error(ws, error):
        errorQ.put(error, timeout=1)

    def client(url):
        return ws.Client(
            url=url,
            on_open=on_open,
            on_message=on_message,
            on_close=on_close,
            on_error=on_error,
        )

    try:
        # Send a hello and make sure it is received.
        cl = client(URL)
        assert test.was_opened

        cl.send(HELLO)
        msg = serverQ.get(timeout=1)
        assert msg == HELLO

        # Make sure we got the response.
        msg = clientQ.get(timeout=1)
        assert msg == YO

        # Trigger a server shutdown.
        cl.send(QUIT)
        serverQ.get(timeout=1)

        # Make sure the close callback was called.
        assert test.was_closed

        # Make sure a send fails.
        with pytest.raises(websocket.WebSocketConnectionClosedException):
            cl.send("should be closed")

        # Force a client error and ensure it comes through the callback.
        assert errorQ.empty()
        cl = client("notaurl")
        errorQ.get(timeout=1)

    except Exception as e:
        server.shutdown()
        raise e
    finally:
        cl.close()

    serverThread.join()
Пример #9
0
            time.sleep(1.0)
        print("Data post thread stopped")

    is_active = True

    mainView = UIMainView() if no_lcd is False else UIConsoleView()

    dataThread = threading.Thread(target=dataThreadFunc)
    dataThread.start()

    websocket = WebsocketServer(PORT_NUMBER_WS, host="0.0.0.0")
    weThread = threading.Thread(target=websocketThreadFunc)
    weThread.start()

    httpd = HTTPServer(('', PORT_NUMBER), HTTPHandler)
    serverThread = threading.Thread(target=httpServerFunc)
    serverThread.start()

    postThread = threading.Thread(target=postThreadFunc)
    postThread.start()

    # Run UI
    mainView.mainloop()

    is_active = False
    httpd.shutdown()
    websocket.shutdown()

    print("App done")
Пример #10
0
class WebTunnel(threading.Thread):
    def __init__(self, controller, port):
        threading.Thread.__init__(self)

        self.port = port

        self.outboundPackets = {
            "SET_VALUE_BOUNDS": "svb",
            "FEEDBACK_VALUE": "fv"  #aka true value
        }

        self.inboundPackets = {"USER_VALUE": "uv"}

        self.positionSuffix = "0"
        self.maxVelocitySuffix = "1"
        self.stiffnessSuffix = "2"

        self.jointNoToWidgetPrefix = ["joint0_", "joint1_"]

        self.controller = controller
        self.queue = []

        self.server = WebsocketServer(self.port)

        self.server.set_fn_new_client(self.new_client)
        self.server.set_fn_client_left(self.client_left)
        self.server.set_fn_message_received(self.message_received)

        self.positionFeedback = {}
        self.stiffnessFeedback = {}

        self.positionBounds = {}
        self.stiffnessBounds = {}
        self.maxVelocityBounds = {}

    def run(self):
        print("Tunnel now running!")
        self.server.run_forever()

    def shutdown(self):
        print("Shutting down")
        try:
            self.server.shutdown()
        except:
            exit(1)

    # Called for every client connecting (after handshake)
    def new_client(self, client, server):
        print("New client connected and was given id %d" % client['id'])
        print("Filling in client with latest data")

        #send latest position bounds
        for k in self.positionBounds:
            self.server.send_message(
                client,
                self.getPositionBoundsPacket(k, str(self.positionBounds[k][0]),
                                             self.positionBounds[k][1]))

        #send latest position feedbacks
        for k in self.positionFeedback:
            self.server.send_message(
                client,
                self.getPositionFeedbackPacket(k, self.positionFeedback[k]))

        #send latest max velocity bounds
        for k in self.maxVelocityBounds:
            self.server.send_message(
                client,
                self.getMaxVelocityBoundsPacket(
                    k, str(self.maxVelocityBounds[k][0]),
                    self.maxVelocityBounds[k][1]))

        #send latest stiffness bounds
        for k in self.stiffnessBounds:
            self.server.send_message(
                client,
                self.getStiffnessBoundsPacket(k,
                                              str(self.stiffnessBounds[k][0]),
                                              self.stiffnessBounds[k][1]))

        #send latest applied force feedbacks
        #for k in self.stiffnessFeedback:
        #    self.server.send_message(client, self.getStiffnessFeedbackPacket(k,
        #    self.stiffnessFeedback[k]))

    def client_left(self, client, server):
        print("Client(%d) disconnected" % client['id'])

    def message_received(self, client, server, message):
        print("Client %d said: %s", client['id'], message)

        if '%' in message:
            tokens = message.split('%')
            if tokens[0] == self.inboundPackets['USER_VALUE']:
                if tokens[1] and tokens[2]:
                    jointType = tokens[1].split("_")
                    jointType = jointType[len(jointType) - 1]

                    jointPrefix = tokens[1].split("_")[0] + "_"
                    #jointNo = jointPrefix.split("joint")
                    #jointNo = jointNo[len(jointNo) - 1]

                    print "jointPrefix: " + jointPrefix + "\n"
                    print "joint type: " + jointType + "\n"

                    if jointPrefix in self.jointNoToWidgetPrefix:
                        index = self.jointNoToWidgetPrefix.index(jointPrefix)

                        if self.controller:
                            if jointType == self.positionSuffix:
                                self.controller.setPosition(index, tokens[2])
                            elif jointType == self.maxVelocitySuffix:
                                self.controller.setMaxVelocity(
                                    index, tokens[2])
                            elif jointType == self.stiffnessSuffix:
                                self.controller.setStiffness(index, tokens[2])
                        else:
                            print(
                                'Undefined controller -- tried calling setPosition('
                                + str(index) + ', ' + str(tokens[2]) + ')')
                    else:
                        print('Could not find target with prefix: ' +
                              jointPrefix)
                else:
                    print('Corrupt USER_VALUE packet')
            else:
                print('Unhandled packet: ' + tokens[0])
        elif message == 'PING':
            self.server.send_message_to_all('PONG')
        else:
            print('Invalid packet')

    def sendPositionBoundsPacket(self, no, lower, upper):
        self.server.send_message_to_all(
            self.getPositionBoundsPacket(no, lower, upper))
        self.positionBounds[no] = [lower, upper]

    def sendPositionFeedbackPacket(self, no, val):
        self.server.send_message_to_all(self.getPositionFeedbackPacket(
            no, val))
        self.positionFeedback[no] = val

    def sendStiffnessBoundsPacket(self, no, lower, upper):
        print "SENDING STIFFNESS BOUNDS: " + str(no) + " " + str(
            lower) + " " + str(upper)
        self.server.send_message_to_all(
            self.getStiffnessBoundsPacket(no, lower, upper))
        self.stiffnessBounds[no] = [lower, upper]

    def sendStiffnessFeedbackPacket(self, no, val):
        self.server.send_message_to_all(
            self.getStiffnessFeedbackPacket(no, val))
        self.stiffnessFeedback[no] = val

    def sendMaxVelocityBoundsPacket(self, no, lower, upper):
        self.server.send_message_to_all(
            self.getMaxVelocityBoundsPacket(no, lower, upper))
        self.maxVelocityBounds[no] = [lower, upper]

    def getPositionBoundsPacket(self, no, lower, upper):
        if self.jointNoToWidgetPrefix[no]:
            return (self.outboundPackets["SET_VALUE_BOUNDS"] + "%" +
                    self.jointNoToWidgetPrefix[no] + self.positionSuffix +
                    "%" + str(lower) + "%" + str(upper))
        else:
            print("Could not find widget prefix for no = " + no)
            return None

    def getStiffnessBoundsPacket(self, no, lower, upper):
        if self.jointNoToWidgetPrefix[no]:
            return (self.outboundPackets["SET_VALUE_BOUNDS"] + "%" +
                    self.jointNoToWidgetPrefix[no] + self.stiffnessSuffix +
                    "%" + str(lower) + "%" + str(upper))
        else:
            print("Could not find widget prefix for no = " + no)
            return None

    def getPositionFeedbackPacket(self, no, val):
        if self.jointNoToWidgetPrefix[no]:
            return (self.outboundPackets["FEEDBACK_VALUE"] + "%" +
                    self.jointNoToWidgetPrefix[no] + str(self.positionSuffix) +
                    "%" + str(val))
        else:
            print("Could not find widget prefix for no = " + no)
            return None

    def getStiffnessFeedbackPacket(self, no, val):
        if self.jointNoToWidgetPrefix[no]:
            return (self.outboundPackets["FEEDBACK_VALUE"] + "%" +
                    self.jointNoToWidgetPrefix[no] +
                    str(self.stiffnessSuffix) + "%" + str(val))
        else:
            print("Could not find widget prefix for no = " + no)
            return None

    def getMaxVelocityBoundsPacket(self, no, lower, upper):
        if self.jointNoToWidgetPrefix[no]:
            return (self.outboundPackets["SET_VALUE_BOUNDS"] + "%" +
                    self.jointNoToWidgetPrefix[no] + self.maxVelocitySuffix +
                    "%" + str(lower) + "%" + str(upper))
        else:
            print("Could not find widget prefix for no = " + no)
            return None
Пример #11
0
            print(config)
            print('config updated!')
    except Exception as e:
        pass


class WSThread(threading.Thread):
    def __init__(self, server):
        threading.Thread.__init__(self)
        self.server = server

    def run(self):
        self.server.run_forever()



PORT = 12758
cfg_server = WebsocketServer(PORT)
cfg_server.set_fn_message_received(message_received)
t_ws = WSThread(cfg_server)
t_ws.start()
print('SLEEP')
time.sleep(10)
cfg_server.shutdown()
t_ws.join()
print('SHUTDOWN')




Пример #12
0
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

        return ch

def startServer(server):
	print("HMI signals listener was started\r")
	server.set_fn_new_client(new_client)
	server.set_fn_client_left(client_left)
	server.set_fn_message_received(message_received)
	server.run_forever()

def keyBoardEvent():
	global server
	char = ' '
	while char != 'q':
		char = getch()

server = WebsocketServer(8081)
serverThread = Thread(target = startServer, args = (server, ))
keyBoardThread = Thread(target = keyBoardEvent)
keyBoardThread.start()
serverThread.start()

keyBoardThread.join()
print("Closing server...")
server.shutdown()
server.server_close()
Пример #13
0
class RTC_Spider2020_Info(OpenRTM_aist.DataFlowComponentBase):

    ##
    # @brief constructor
    # @param manager Maneger Object
    #
    def __init__(self, manager):
        OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)

        self._d_GCCapacityRatio_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedDouble)
        """
		ゲームコントローラのバッテリ残容量比
		 - Unit: [%]
		"""
        self._GCCapacityRatio_InIn = OpenRTM_aist.InPort(
            "GCCapacityRatio_In", self._d_GCCapacityRatio_In)
        self._d_MainCapacityRatio_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedDouble)
        """
		メインバッテリのバッテリ残容量比
		 - Unit: [%]
		"""
        self._MainCapacityRatio_InIn = OpenRTM_aist.InPort(
            "MainCapacityRatio_In", self._d_MainCapacityRatio_In)
        self._d_Mode_In = OpenRTM_aist.instantiateDataType(RTC.TimedLongSeq)
        """
		動作指令の状態
		 - Number: 6
		 - Semantics: [0]: 操作モード
		              [1]: 走行操作 速度レベル
		              [2]: 走行操作 最大速度フラグ
		              [3]: 走行モード フリッパーの選択状態
		              [4]: 走行モード フリッパーの動作状態
		              [5]: 走行モード 台車の位置姿勢のクリア
		"""
        self._Mode_InIn = OpenRTM_aist.InPort("Mode_In", self._d_Mode_In)
        self._d_Pose3D_In = OpenRTM_aist.instantiateDataType(RTC.TimedPose3D)
        """
		3次元の位置・姿勢
		 - Unit: 位置:[m], 姿勢:[rad]
		"""
        self._Pose3D_InIn = OpenRTM_aist.InPort("Pose3D_In", self._d_Pose3D_In)
        self._d_Velocity2D_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedVelocity2D)
        """
		メインクローラの速度
		 - Unit: [m/s]
		"""
        self._Velocity2D_InIn = OpenRTM_aist.InPort("Velocity2D_In",
                                                    self._d_Velocity2D_In)
        self._d_FlipperAngle_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedDoubleSeq)
        """
		フリッパーの角度
		 - Number: 4
		 - Semantics: [0]: 右前方フリッパー
		              [1]: 左前方フリッパー
		              [2]: 右後方フリッパー
		              [3]: 左後方フリッパー
		 - Unit: [rad]
		"""
        self._FlipperAngle_InIn = OpenRTM_aist.InPort("FlipperAngle_In",
                                                      self._d_FlipperAngle_In)
        self._d_MotorLoad_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedDoubleSeq)
        """
		モータの負荷
		 - Number: 6
		 - Semantics: [0]: 右メインモータ
		              [1]: 左メインモータ
		              [2]: 右前方サブモータ
		              [3]: 左前方サブモータ
		              [4]: 右後方サブモータ
		              [5]: 左後方サブモータ
		 - Unit: [A]
		"""
        self._MotorLoad_InIn = OpenRTM_aist.InPort("MotorLoad_In",
                                                   self._d_MotorLoad_In)
        self._d_Arm1Pose3D_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedPose3D)
        """
		アーム1の3次元の位置・姿勢
		(ロボット座標系)
		 - Unit: 位置:[m], 姿勢:[rad]
		"""
        self._Arm1Pose3D_InIn = OpenRTM_aist.InPort("Arm1Pose3D_In",
                                                    self._d_Arm1Pose3D_In)
        self._d_Arm1Angular_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedDoubleSeq)
        """
		アーム1の腕の角度
		 - Semantics: [0]: 1軸目
		              [1]: 2軸目
		              [2]: 3軸目
		              [3]: 4軸目
		              [4]: 5軸目
		              [5]: 6軸目
		 - Unit: [rad]
		"""
        self._Arm1Angular_InIn = OpenRTM_aist.InPort("Arm1Angular_In",
                                                     self._d_Arm1Angular_In)
        self._d_Arm1Finger_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedLongSeq)
        """
		アーム1の指の開閉具合
		 - Semantics: [0]: 親指
		              [1]: 差指
		              [2]: 中指
		 - Unit: [u] (独自単位)
		"""
        self._Arm1Finger_InIn = OpenRTM_aist.InPort("Arm1Finger_In",
                                                    self._d_Arm1Finger_In)
        self._d_Arm1Current_In = OpenRTM_aist.instantiateDataType(
            RTC.TimedDoubleSeq)
        """
		アーム1のモータ負荷
		 - Semantics: [0]: 1軸目
		              [1]: 2軸目
		              [2]: 3軸目
		              [3]: 4軸目
		              [4]: 5軸目
		              [5]: 6軸目
		              [6]: 親指
		              [7]: 差指
		              [8]: 中指
		 - Unit: [A]
		"""
        self._Arm1Current_InIn = OpenRTM_aist.InPort("Arm1Current_In",
                                                     self._d_Arm1Current_In)

        # initialize of configuration-data.
        # <rtc-template block="init_conf_param">
        """
		WebSocket 待受ポート番号
		 - Name:  WEBSOCKET_PORT
		 - DefaultValue: 8080
		"""
        self._WEBSOCKET_PORT = [8080]
        """
		WebSocket 待受アドレス
		 - Name:  WEBSOCKET_HOST
		 - DefaultValue: 0.0.0.0
		"""
        self._WEBSOCKET_HOST = ['0.0.0.0']

        # </rtc-template>

    ##
    #
    # The initialize action (on CREATED->ALIVE transition)
    # formaer rtc_init_entry()
    #
    # @return RTC::ReturnCode_t
    #
    #
    def onInitialize(self):
        # Bind variables and configuration variable
        self.bindParameter("WEBSOCKET_PORT", self._WEBSOCKET_PORT, "8080")
        self.bindParameter("WEBSOCKET_HOST", self._WEBSOCKET_HOST, "0.0.0.0")

        # Set InPort buffers
        self.addInPort("GCCapacityRatio_In", self._GCCapacityRatio_InIn)
        self.addInPort("MainCapacityRatio_In", self._MainCapacityRatio_InIn)
        self.addInPort("Mode_In", self._Mode_InIn)
        self.addInPort("Pose3D_In", self._Pose3D_InIn)
        self.addInPort("Velocity2D_In", self._Velocity2D_InIn)
        self.addInPort("FlipperAngle_In", self._FlipperAngle_InIn)
        self.addInPort("MotorLoad_In", self._MotorLoad_InIn)
        self.addInPort("Arm1Pose3D_In", self._Arm1Pose3D_InIn)
        self.addInPort("Arm1Angular_In", self._Arm1Angular_InIn)
        self.addInPort("Arm1Finger_In", self._Arm1Finger_InIn)
        self.addInPort("Arm1Current_In", self._Arm1Current_InIn)

        # Set OutPort buffers

        # Set service provider to Ports

        # Set service consumers to Ports

        # Set CORBA Service Ports

        return RTC.RTC_OK

    ##
    #
    # The finalize action (on ALIVE->END transition)
    # formaer rtc_exiting_entry()
    #
    # @return RTC::ReturnCode_t

    #
    def onFinalize(self):

        return RTC.RTC_OK

    ###
    ##
    ## The startup action when ExecutionContext startup
    ## former rtc_starting_entry()
    ##
    ## @param ec_id target ExecutionContext Id
    ##
    ## @return RTC::ReturnCode_t
    ##
    ##
    #def onStartup(self, ec_id):
    #
    #	return RTC.RTC_OK

    ###
    ##
    ## The shutdown action when ExecutionContext stop
    ## former rtc_stopping_entry()
    ##
    ## @param ec_id target ExecutionContext Id
    ##
    ## @return RTC::ReturnCode_t
    ##
    ##
    #def onShutdown(self, ec_id):
    #
    #	return RTC.RTC_OK

    ##
    #
    # The activated action (Active state entry action)
    # former rtc_active_entry()
    #
    # @param ec_id target ExecutionContext Id
    #
    # @return RTC::ReturnCode_t
    #
    #
    def onActivated(self, ec_id):
        # ビューアーの設定ファイルを生成
        config = {
            "WEBSOCKET_PORT": self._WEBSOCKET_PORT[0],
        }
        with open(VIEWER_CONFIG_FILE, mode="w") as f:
            json.dump(config,
                      f,
                      ensure_ascii=False,
                      indent=2,
                      separators=(",", ": "))

        #def ws_on_message(client, server, message):
        #	server.send_message_to_all(message)
        #	return

        # WebSocket サーバーを起動
        self.ws_server = WebsocketServer(self._WEBSOCKET_PORT[0],
                                         host=self._WEBSOCKET_HOST[0])
        #self.ws_server.set_fn_message_received(ws_on_message)
        self.ws_thread = threading.Thread(target=self.ws_server.run_forever)
        self.ws_thread.start()

        return RTC.RTC_OK

    ##
    #
    # The deactivated action (Active state exit action)
    # former rtc_active_exit()
    #
    # @param ec_id target ExecutionContext Id
    #
    # @return RTC::ReturnCode_t
    #
    #
    def onDeactivated(self, ec_id):
        # WebSocket サーバーを終了
        self.ws_server.shutdown()
        self.ws_server.server_close()

        return RTC.RTC_OK

    ##
    #
    # The execution action that is invoked periodically
    # former rtc_active_do()
    #
    # @param ec_id target ExecutionContext Id
    #
    # @return RTC::ReturnCode_t
    #
    #
    def onExecute(self, ec_id):
        # 入力ポートに入ってきたデータを WebSocket クライアントに転送する
        for port in self._inports:
            port_name = port._name
            port_type = port._value.__class__.__name__

            if port.isNew():
                port_in = port.read()
                time = port_in.tm.sec + port_in.tm.nsec * (10**-9)

                if port_type in [
                        "TimedDouble", "TimedLongSeq", "TimedDoubleSeq"
                ]:
                    data = port_in.data
                elif port_type == "TimedPose3D":
                    position = port_in.data.position
                    orientation = port_in.data.orientation
                    data = {
                        "position": {
                            "x": position.x,
                            "y": position.y,
                            "z": position.z
                        },
                        "orientation": {
                            "r": orientation.r,
                            "p": orientation.p,
                            "y": orientation.y
                        },
                    }
                elif port_type == "TimedVelocity2D":
                    velocity = port_in.data
                    data = {
                        "vx": velocity.vx,
                        "vy": velocity.vy,
                        "va": velocity.va
                    }

                js_data = json.dumps({port_name: {"tm": time, "data": data}})
                self.ws_server.send_message_to_all(js_data)
                #print(js_data)

        return RTC.RTC_OK