コード例 #1
0
	def from_payload(cls, payload):
		"""
		Creates a ``Request`` object from a payload coming from the underlying protocols.
		This method is meant to be used by a UDS server

		:param payload: The payload of data to parse
		:type payload: bytes

		:return: A :ref:`Request<Request>` object with populated fields
		:rtype: :ref:`Request<Request>`
		"""
		req = cls()

		if len(payload) >= 1:
			req.service = services.cls_from_request_id(payload[0])
			if req.service is not None:		# Invalid service ID will make service None
				offset = 0
				if req.service.use_subfunction():
					offset += 1
					if len(payload) >= offset+1: 
						req.subfunction = int(payload[1]) & 0x7F
						req.suppress_positive_response = True if payload[1] & 0x80 > 0 else False
				if len(payload) > offset+1:
					req.data = payload[offset+1:]
		return req
コード例 #2
0
ファイル: Response.py プロジェクト: goodgrape/python-udsoncan
    def from_payload(cls, payload):
        from udsoncan import services
        response = cls()
        response.original_payload = payload  # may be useful for debugging

        if len(payload) < 1:
            response.valid = False
            response.invalid_reason = "Payload is empty"
            return response

        if payload[0] != 0x7F:  # Positive
            response.service = services.cls_from_response_id(payload[0])
            if response.service is None:
                response.valid = False
                response.invalid_reason = "Payload first byte is not a know service response ID."
                return response

            data_start = 1
            response.positive = True
            if len(payload) < 2 and response.service.has_response_data():
                response.valid = False
                response.positive = False
                response.invalid_reason = "Payload must be at least 2 bytes long (service and response)"
                return response

            response.code = Response.Code.PositiveResponse
            response.code_name = Response.Code.get_name(
                Response.Code.PositiveResponse)

        else:  # Negative response
            response.positive = False
            data_start = 3

            if len(payload) < 2:
                response.valid = False
                response.invalid_reason = "Incomplete invalid response service (7Fxx)"
                return response
            response.service = services.cls_from_request_id(
                payload[1])  #Request id, not response id

            if response.service is None:
                response.valid = False
                response.invalid_reason = "Payload second byte is not a known service request ID."
                return response

            if len(payload) < 3:
                response.valid = False
                response.invalid_reason = "Response code missing"
                return response

            response.code = int(payload[2])
            response.code_name = Response.Code.get_name(response.code)

        response.valid = True
        if len(payload) > data_start:
            response.data = payload[data_start:]
        return response
コード例 #3
0
ファイル: Request.py プロジェクト: goodgrape/python-udsoncan
	def from_payload(cls, payload):
		req = cls()

		if len(payload) >= 1:
			req.service = services.cls_from_request_id(payload[0])
			if req.service is not None:		# Invalid service ID will make service None
				offset = 0
				if req.service.use_subfunction():
					offset += 1
					if len(payload) >= offset+1: 
						req.subfunction = int(payload[1]) & 0x7F
						req.suppress_positive_response = True if payload[1] & 0x80 > 0 else False
				if len(payload) > offset+1:
					req.data = payload[offset+1:]
		return req
コード例 #4
0
    def from_payload(cls, payload):
        u"""
        Creates a ``Response`` object from a payload coming from the underlying protocol.
        This method is meant to be used by a UDS client

        :param payload: The payload of data to parse
        :type payload: bytes

        :return: A :ref:`Response<Response>` object with populated fields
        :rtype: :ref:`Response<Response>`
        """
        from udsoncan import services
        response = cls()
        response.original_payload = payload  # may be useful for debugging

        if len(payload) < 1:
            response.valid = False
            response.invalid_reason = u"Payload is empty"
            return response

        if ord(payload[0]) != 0x7F:  # Positive
            response.service = services.cls_from_response_id(ord(payload[0]))
            if response.service is None:
                response.valid = False
                response.invalid_reason = u"Payload first byte is not a know service response ID."
                return response

            data_start = 1
            response.positive = True
            if len(payload) < 2 and response.service.has_response_data():
                response.valid = False
                response.positive = False
                response.invalid_reason = u"Payload must be at least 2 bytes long (service and response)"
                return response

            response.code = Response.Code.PositiveResponse
            response.code_name = Response.Code.get_name(
                Response.Code.PositiveResponse)

        else:  # Negative response
            response.positive = False
            data_start = 3

            if len(payload) < 2:
                response.valid = False
                response.invalid_reason = u"Incomplete invalid response service (7Fxx)"
                return response
            response.service = services.cls_from_request_id(ord(
                payload[1]))  #Request id, not response id

            if response.service is None:
                response.valid = False
                response.invalid_reason = u"Payload second byte is not a known service request ID."
                return response

            if len(payload) < 3:
                response.valid = False
                response.invalid_reason = u"Response code missing"
                return response

            response.code = ord(payload[2])
            response.code_name = Response.Code.get_name(response.code)

        response.valid = True
        response.invalid_reason = u""
        if len(payload) > data_start:
            response.data = payload[data_start:]
        return response