Esempio n. 1
0
    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
Esempio n. 2
0
    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()))