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