Esempio n. 1
0
class Device:
    def __init__(self):
        deviceControllerAddr = 'localhost'

        deviceControllerPort = '5555'
        clientPort = ''

        print("Device Starting\n")

        self.context = zmq.Context()   # get context

        self.loop = IOLoop.instance()

        self.clientSetup = ClientSetup(self.context)  # instantiate the ClientSetup object
#serverSetup = ServerSetup(context) # instantiate the ServerSetup object

# set up separate server and client sockets

        self.clientSocket = self.clientSetup.createClientSocket() # get a client socket



        # NOTE: setIdentity() MUST BE CALLED BEFORE clientConnect or the identity will
        # not take effect
        self.clientSetup.setIdentity(MasterId().getDevId(), self.clientSocket) # get the device id

        self.clientSetup.clientConnect(deviceControllerAddr, deviceControllerPort, self.clientSocket) # connect to server using clientSocket

        self.clientSocket = ZMQStream(self.clientSocket)
        self.clientSocket.on_recv(self.onClientRecv)
        self.messages = Messages() # instantiate a Messages object

    def onClientRecv(self,msg):
        print("on_recv, msg=", msg)
        self.cmdFrmServer = msg[0]
        self.data = msg[1]
        print("Received from DeviceController: cmd=", self.cmdFrmServer, "data=", self.data)

        self.dataList = self.messages.bufferToDict(self.data) # create a list

        print("internal list, devType={}, cmd={}, data={}, returnList={}"
        .format(self.dataList['devType'], self.dataList['cmd'], self.dataList['data'], self.dataList['returnList']))


        self.clientDevId = MasterId().getDevId()
        print("Device's id=", self.clientDevId)

    def start(self):
    #        self.periodic.start()
        cmdToServer = "001".encode()
        outDict = self.messages.createMessageDict('00', '001', 'Hello HostServer', [])
        print("initial state, sending this dictionary:", outDict)
        dataToServer = self.messages.dictToBuffer(outDict).encode()
        print('sending this output message:\n', dataToServer)
        self.clientSocket.send_multipart([cmdToServer, dataToServer])
        try:
            self.loop.start()

        except KeyboardInterrupt:
            pass
Esempio n. 2
0
class HostController:
    def __init__(self):
        #procControllerAddr = '165.227.24.226'  # I am client to HostController
        #procControllerPort = '5557'
        hostControllerPort = '5556' # I server to device

        print("Host Controller Starting\n")

        self.context = zmq.Context()   # get context
        self.loop = IOLoop.instance()

#       self.clientSetup = ClientSetup(context)  # instantiate the ClientSetup object
        self.serverSetup = ServerSetup(self.context) # instantiate the ServerSetup object


        # set up separate server and client sockets
        self.serverSocket = self.serverSetup.createServerSocket() # get a server socket
        self.serverSetup.serverBind(hostControllerPort, self.serverSocket) # bind to an address

#       self.clientSocket = self.clientSetup.createClientSocket() # get a client socket

# NOTE: setIdentity() MUST BE CALLED BEFORE clientConnect or the identity will
# not take effect
#       self.clientSetup.setIdentity(MasterId().getDevId()) # get the device id
#       self.clientSetup.clientConnect(hostControllerAddr, hostControllerPort, self.clientSocket) # connect to server using clientSocket
        self.serverSocket = ZMQStream(self.serverSocket)
        self.serverSocket.on_recv(self.onServerRecv)
        self.messages = Messages() # instantiate a Messages object

        self.inDict = {}
        self.outDict = {}

    def onServerRecv(self,msg):
        print("msg=", msg)
        print("length of msg=", len(msg))
        ident = msg[0]
        cmdFrmClient = msg[1]
        data = msg[2]
        # is it a message from a client?
        if (len(msg) == 3):
            print("Message received from device controller: ident=", ident,"cmd=", cmdFrmClient, "data=", data)
            self.inDict = self.messages.bufferToDict(data) # create a list from the message
            print("Internal list, devType={}, cmd={}, data={}, returnList={}\n"
                    .format(self.inDict['devType'], self.inDict['cmd'], self.inDict['data'], self.inDict['returnList']))

            # For testing purposes, now send the message back down the line
            self.inDict['data'] += ' host controller got it'
            self.outIdent = self.messages.popLastReturnId(self.inDict).encode() # get the device controller id
            print("Ident poped from returnId", self.outIdent)
            dataToClient = self.messages.dictToBuffer(self.inDict).encode() # create a buffer
            print("Data to Device Controller=", dataToClient)
            cmdToClient = self.inDict['cmd'].encode()
            print("Cmd to Device Controller=", cmdToClient)
            print("Sending to outIdent =", self.outIdent)
            self.serverSocket.send_multipart([self.outIdent, cmdToClient, dataToClient])

        else:
            print("Message received from host proc: cmd=", cmdFrmClient, "data=", data)


    def start(self):
    #        self.periodic.start()
        try:
            self.loop.start()

        except KeyboardInterrupt:
            pass
Esempio n. 3
0
class DeviceController:
    def __init__(self):
        #        hostControllerAddr = '165.227.24.226'  # I am client to HostController
        hostControllerAddr = 'localhost'  # I am client to HostController

        hostControllerPort = '5556'
        deviceControllerPort = '5555'  # I server to device

        print("Device Controller Starting\n")

        self.context = zmq.Context()  # get context

        self.loop = IOLoop.instance()

        self.clientSetup = ClientSetup(
            self.context)  # instantiate the ClientSetup object
        self.serverSetup = ServerSetup(
            self.context)  # instantiate the ServerSetup object

        # set up separate server and client sockets
        self.serverSocket = self.serverSetup.createServerSocket(
        )  # get a server socket
        self.serverSetup.serverBind(deviceControllerPort,
                                    self.serverSocket)  # bind to an address
        self.clientSocket = self.clientSetup.createClientSocket(
        )  # get a client socket

        # NOTE: setIdentity() MUST BE CALLED BEFORE clientConnect or the identity will
        # not take effect
        self.clientSetup.setIdentity(MasterId().getDevId(),
                                     self.clientSocket)  # get the device id
        self.clientSetup.clientConnect(
            hostControllerAddr, hostControllerPort,
            self.clientSocket)  # connect to server using clientSocket
        self.messages = Messages()  # instantiate a Messages object

        self.serverSocket = ZMQStream(self.serverSocket)
        self.clientSocket = ZMQStream(self.clientSocket)

        self.serverSocket.on_recv(self.onServerRecv)
        self.clientSocket.on_recv(self.onClientRecv)

        self.inDict = {}

    # Receive from Host Controller
    def onClientRecv(self, msg):
        print("onClientRecv() msg=", msg)
        print("length of msg=", len(msg))
        cmdFrmHostController = msg[0]
        data = msg[1]
        print("Message received from host controller: cmd=",
              cmdFrmHostController, "data=", data)

        # Create a dictionary from the Json msg from Host Controller
        self.inDict = self.messages.bufferToDict(
            data)  # create a list from the message
        print("Internal list, devType={}, cmd={}, data={}, returnList={}\n".
              format(self.inDict['devType'], self.inDict['cmd'],
                     self.inDict['data'], self.inDict['returnList']))
        # For testing purposes, send the message back to the device

        # Get the last return identity
        self.outIdent = (self.messages.popLastReturnId(
            self.inDict)).encode()  # get the device controller id
        dataToClient = (self.messages.dictToBuffer(self.inDict)).encode()
        cmdToClient = (self.inDict['cmd']).encode()
        print("Sending to device with cmd={}, data={} \n".format(
            cmdToClient, dataToClient))
        self.serverSocket.send_multipart(
            [self.outIdent, cmdToClient, dataToClient])

    # Receive from Device
    def onServerRecv(self, msg):
        print("onServerRecv msg=", msg)
        print("length of msg=", len(msg))
        ident = msg[0]
        cmdFrmDevice = msg[1]
        data = msg[2]
        # Create a dictionary from the incoming msg from Device
        self.inDict = self.messages.bufferToDict(
            data)  # create a list from the message

        print("Internal list, devType={}, cmd={}, data={}, returnList={}\n".
              format(self.inDict['devType'], self.inDict['cmd'],
                     self.inDict['data'], self.inDict['returnList']))

        print("Message received from device: ident=", ident, "cmd=",
              cmdFrmDevice, "data=", data)
        self.processEvent(cmdFrmDevice, self.indict)

        #For testing purposes only, relay the message upstream

        self.messages.appendMyIdToReturnList(self.inDict)
        print("Sending this dictionary to HostController:", self.inDict)
        self.dataToServer = self.messages.dictToBuffer(self.inDict).encode()
        print('Sending this output message:', self.dataToServer)
        self.clientSocket.send_multipart([cmdFrmDevice, self.dataToServer])
        print("Sent to HostController, ident={}, cmd={}, data={}\n".format(
            ident, cmdFrmDevice, self.dataToServer))

    def processEvent(self, cmd, dict):
        print("processEvent cmd={}, dict={}".format(cmd, dict))

    def start(self):
        #        self.periodic.start()
        try:
            self.loop.start()

        except KeyboardInterrupt:
            pass
Esempio n. 4
0
class DeviceController:
    def __init__(self):
        #        hostControllerAddr = '165.227.24.226'  # I am client to HostController
        hostControllerAddr = 'localhost'  # I am client to HostController

        hostControllerPort = '5556'
        deviceControllerPort = '5555'  # I server to device

        print("Device Controller Starting\n")

        self.context = zmq.Context()  # get context

        self.clientSetup = ClientSetup(
            self.context)  # instantiate the ClientSetup object
        self.serverSetup = ServerSetup(
            self.context)  # instantiate the ServerSetup object

        # set up separate server and client sockets
        self.serverSocket = self.serverSetup.createServerSocket(
        )  # get a server socket
        self.serverSetup.serverBind(deviceControllerPort,
                                    self.serverSocket)  # bind to an address
        self.clientSocket = self.clientSetup.createClientSocket(
        )  # get a client socket

        # NOTE: setIdentity() MUST BE CALLED BEFORE clientConnect or the identity will
        # not take effect
        self.clientSetup.setIdentity(MasterId().getDevId(),
                                     self.clientSocket)  # get the device id
        self.clientSetup.clientConnect(
            hostControllerAddr, hostControllerPort,
            self.clientSocket)  # connect to server using clientSocket
        self.messages = Messages()  # instantiate a Messages object

        #        self.serverSocket = ZMQStream(self.serverSocket)
        #        self.clientSocket = ZMQStream(self.clientSocket)

        #        self.serverSocket.on_recv(self.onServerRecv)
        #        self.clientSocket.on_recv(self.onClientRecv)

        self.inDict = {}

    # Receive from Host Controller
    async def onClientRecv(self):
        clientMsg = []
        print("1.onClientRecv")
        await asyncio.sleep(.01)

        def clientRecv():
            nonlocal clientMsg
            clientMsg = self.clientSocket.recv_multipart()

        await clientRecv()
        print("onClientRecv() msg=", clientMsg)
        print("length of msg=", len(clientMsg))
        cmdFrmHostController = clientMsg[0]
        data = clientMsg[1]
        print("Message received from host controller: cmd=",
              cmdFrmHostController, "data=", data)

        # Create a dictionary from the Json msg from Host Controller
        self.inDict = self.messages.bufferToDict(
            data)  # create a list from the message
        print("Internal list, devType={}, cmd={}, data={}, returnList={}\n".
              format(self.inDict['devType'], self.inDict['cmd'],
                     self.inDict['data'], self.inDict['returnList']))
        # For testing purposes, send the message back to the device

        # Get the last return identity
        self.outIdent = (self.messages.popLastReturnId(
            self.inDict)).encode()  # get the device controller id
        dataToClient = (self.messages.dictToBuffer(self.inDict)).encode()
        cmdToClient = (self.inDict['cmd']).encode()
        print("Sending to device with cmd={}, data={} \n".format(
            cmdToClient, dataToClient))
        self.serverSocket.send_multipart(
            [self.outIdent, cmdToClient, dataToClient])

    # Receive from Device

    async def onServerRecv(self):
        print("1.onServerRecv")
        #        await asyncio.sleep(.01)

        #        serverMsg = self.serverSocket.recv_multipart()
        serverMsg = []
        part = await self.serverSocket.recv()
        serverMsg.append(part)
        print("onServerRecv, part=", part)
        # have first part already, only loop while more to receive
        while self.serverSocket.getsockopt(zmq.RCVMORE):
            part = self.serverSocket.recv()
            self.serverMsg.append(part)

        print("onServerRecv msg=", serverMsg)
        print("length of msg=", len(serverMsg))
        ident = serverMsg[0]
        cmdFrmDevice = serverMsg[1]
        data = serverMsg[2]
        # Create a dictionary from the incoming msg from Device
        self.inDict = self.messages.bufferToDict(
            data)  # create a list from the message

        print("Internal list, devType={}, cmd={}, data={}, returnList={}\n".
              format(self.inDict['devType'], self.inDict['cmd'],
                     self.inDict['data'], self.inDict['returnList']))

        print("Message received from device: ident=", ident, "cmd=",
              cmdFrmDevice, "data=", data)
        #For testing purposes only, relay the message upstream

        self.messages.appendMyIdToReturnList(self.inDict)
        print("Sending this dictionary to HostController:", self.inDict)
        self.dataToServer = self.messages.dictToBuffer(self.inDict).encode()
        print('Sending this output message:', self.dataToServer)
        self.clientSocket.send_multipart([cmdFrmDevice, self.dataToServer])
        print("Sent to HostController, ident={}, cmd={}, data={}\n".format(
            ident, cmdFrmDevice, self.dataToServer))

    async def start(self):
        while 1:
            pass