def __init__(self, host, port, timeout, stnaddr=1): """ host (string) = IP address of server. port (integer) = Port for server. timeout (float) = Time out in seconds. stnaddr (integer) = The desired SBus station address. """ self._host = host self._port = port self._timeout = timeout self._stnaddr = stnaddr self._msgsequence = 1 # Define the boolean values for 0 and 1. self._bitoff = ModbusDataStrLib.boollist2bin( [False, False, False, False, False, False, False, False]) self._biton = ModbusDataStrLib.boollist2bin( [True, False, False, False, False, False, False, False]) # Initialise the client connection. try: self._msg = SBusSimpleClient.SBusSimpleClient( self._host, self._port, self._timeout) except: self._msg = None print((_ErrorMsgs['connnecterror'])) # Raise the exception again so the next layer can deal with it. raise
def _handle(self): ReceivedData = self.rfile.read() if ReceivedData: # Decode message. try: (TelegramAttr, MsgSequence, StnAddr, CmdCode, DataAddr, DataCount, MsgData, MsgResult) = SBServerMsg.SBRequest(ReceivedData) # We can't decode this message at all, so just drop the request and stop here. # Can't decode the message, because the length is invalid. except SBusMsg.MessageLengthError: print('Server %d - Invalid message length. %s' % (CmdOpts.GetPort(), time.ctime())) MsgResult = False MsgSequence = 0 # Message had a CRC error. except SBusMsg.CRCError: print('Server %d - Bad CRC. %s' % (CmdOpts.GetPort(), time.ctime())) MsgResult = False MsgSequence = 0 # All other errors. except: print('Server %d - Request could not be decoded. %s' % (CmdOpts.GetPort(), time.ctime())) MsgResult = False MsgSequence = 0 ReplyData = '' # Handle the command, but only if know the parameters are valid. if (MsgResult): # Decode messages. If we get an error in reading/writing memory or # in constructing messages, we will consider this to be an SBus error. try: # Read Flags. if CmdCode == 2: MemData = MemMap.GetFlags(DataAddr, DataCount) MsgData = ModbusDataStrLib.boollist2bin(MemData) ReplyData = SBServerMsg.SBResponse( MsgSequence, CmdCode, 0, MsgData) # Read Inputs elif CmdCode == 3: MemData = MemMap.GetInputs(DataAddr, DataCount) MsgData = ModbusDataStrLib.boollist2bin(MemData) ReplyData = SBServerMsg.SBResponse( MsgSequence, CmdCode, 0, MsgData) # Read Outputs elif CmdCode == 5: MemData = MemMap.GetOutputs(DataAddr, DataCount) MsgData = ModbusDataStrLib.boollist2bin(MemData) ReplyData = SBServerMsg.SBResponse( MsgSequence, CmdCode, 0, MsgData) # Read Registers elif CmdCode == 6: MemData = MemMap.GetRegisters(DataAddr, DataCount) MsgData = SBusMsg.signedint32list2bin(MemData) ReplyData = SBServerMsg.SBResponse( MsgSequence, CmdCode, 0, MsgData) # Write flags elif CmdCode == 11: MemData = ModbusDataStrLib.bin2boollist(MsgData) MemMap.SetFlags(DataAddr, DataCount, MemData) ReplyData = SBServerMsg.SBResponse( MsgSequence, CmdCode, 0, '') # Write outputs elif CmdCode == 13: MemData = ModbusDataStrLib.bin2boollist(MsgData) MemMap.SetOutputs(DataAddr, DataCount, MemData) ReplyData = SBServerMsg.SBResponse( MsgSequence, CmdCode, 0, '') # Write Registers elif CmdCode == 14: MemData = SBusMsg.signedbin2int32list(MsgData) MemMap.SetRegisters(DataAddr, DataCount, MemData) ReplyData = SBServerMsg.SBResponse( MsgSequence, CmdCode, 0, '') # We don't understand this command code. else: print('Server %d - Unsupported command code' % CmdOpts.GetPort()) ReplyData = SBServerMsg.SBErrorResponse(MsgSequence) # We don't understand this message. except: ReplyData = SBServerMsg.SBErrorResponse(MsgSequence) # The message was bad, so we return a NAK response. else: ReplyData = SBServerMsg.SBErrorResponse(MsgSequence) # Send the reply. try: self.wfile.write(ReplyData) except: # If we have an error here, there's not much we can do about it. print('Server %d - Could not reply to request. %s' % (CmdOpts.GetPort(), time.ctime()))
def handle(self): ReceivedData = self.rfile.read() if ReceivedData: # Decode message. try: (TelegramAttr, MsgSequence, StnAddr, CmdCode, DataAddr, DataCount, MsgData, MsgResult) = SBServerMsg.SBRequest(ReceivedData) # We can't decode this message at all, so just drop the request and stop here. # Can't decode the message, because the length is invalid. except SBusMsg.MessageLengthError: print('Server %d - Invalid message length. %s' % (CmdOpts.GetPort(), time.ctime())) MsgResult = False MsgSequence = 0 # Message had a CRC error. except SBusMsg.CRCError: print('Server %d - Bad CRC. %s' % (CmdOpts.GetPort(), time.ctime())) MsgResult = False MsgSequence = 0 # All other errors. except: print('Server %d - Request could not be decoded. %s' % (CmdOpts.GetPort(), time.ctime())) MsgResult = False MsgSequence = 0 ReplyData = '' # Handle the command, but only if know the parameters are valid. if (MsgResult): # Decode messages. If we get an error in reading/writing memory or # in constructing messages, we will consider this to be an SBus error. try: # Read Flags. if CmdCode == 2: MemData = MemMap.GetFlags(DataAddr, DataCount) MsgData = ModbusDataStrLib.boollist2bin(MemData) ReplyData = SBServerMsg.SBResponse(MsgSequence, CmdCode, 0, MsgData) # Read Inputs elif CmdCode == 3: MemData = MemMap.GetInputs(DataAddr, DataCount) MsgData = ModbusDataStrLib.boollist2bin(MemData) ReplyData = SBServerMsg.SBResponse(MsgSequence, CmdCode, 0, MsgData) # Read Outputs elif CmdCode == 5: MemData = MemMap.GetOutputs(DataAddr, DataCount) MsgData = ModbusDataStrLib.boollist2bin(MemData) ReplyData = SBServerMsg.SBResponse(MsgSequence, CmdCode, 0, MsgData) # Read Registers elif CmdCode == 6: MemData = MemMap.GetRegisters(DataAddr, DataCount) MsgData = SBusMsg.signedint32list2bin(MemData) ReplyData = SBServerMsg.SBResponse(MsgSequence, CmdCode, 0, MsgData) # Write flags elif CmdCode == 11: MemData = ModbusDataStrLib.bin2boollist(MsgData) MemMap.SetFlags(DataAddr, DataCount, MemData) ReplyData = SBServerMsg.SBResponse(MsgSequence, CmdCode, 0, '') # Write outputs elif CmdCode == 13: MemData = ModbusDataStrLib.bin2boollist(MsgData) MemMap.SetOutputs(DataAddr, DataCount, MemData) ReplyData = SBServerMsg.SBResponse(MsgSequence, CmdCode, 0, '') # Write Registers elif CmdCode == 14: MemData = SBusMsg.signedbin2int32list(MsgData) MemMap.SetRegisters(DataAddr, DataCount, MemData) ReplyData = SBServerMsg.SBResponse(MsgSequence, CmdCode, 0, '') # We don't understand this command code. else: print('Server %d - Unsupported command code' % CmdOpts.GetPort()) ReplyData = SBServerMsg.SBErrorResponse(MsgSequence) # We don't understand this message. except: ReplyData = SBServerMsg.SBErrorResponse(MsgSequence) # The message was bad, so we return a NAK response. else: ReplyData = SBServerMsg.SBErrorResponse(MsgSequence) # Send the reply. try: self.wfile.write(ReplyData) except: # If we have an error here, there's not much we can do about it. print('Server %d - Could not reply to request. %s' % (CmdOpts.GetPort(), time.ctime()))