def getPacket(self):
		"""
		Adds start token, header and CRC to payload. Escapes bytes.
		"""
		# Construct the packet for CRC calculation
		packet = []
		packet.append(self.protocolMajor)
		packet.append(self.protocolMinor)
		packet.append(int(self.messageType))
		packet += self.payload

		# Calculate the CRC of the packet
		packetCrc = crc16ccitt(packet)

		# Append the CRC to the base packet to escape the entire thing
		packet += Conversion.uint16_to_uint8_array(packetCrc)

		# Prepend the size field.
		sizeField = len(packet)
		packet = Conversion.uint16_to_uint8_array(sizeField) + packet

		# Escape everything except the start token
		packet = self.escapeCharacters(packet)

		# Prepend the start token.
		packet = [START_TOKEN] + packet
		return packet
    def process(self):
        """
        Process a buffer.

        Check CRC, and emit a uart packet.

        Buffer starts after size header, and includes wrapper header and tail (CRC).

        Return: processing success
        """

        # Check size
        bufferSize = len(self.buffer)
        wrapperSize = WRAPPER_HEADER_SIZE + CRC_SIZE
        if bufferSize < wrapperSize:
            _LOGGER.warning("Buffer too small")
            return False

        # Get the buffer between size field and CRC:
        baseBuffer = self.buffer[0 : bufferSize - CRC_SIZE]

        # Check CRC
        calculatedCrc = crc16ccitt(baseBuffer)
        sourceCrc = Conversion.uint8_array_to_uint16(self.buffer[bufferSize - CRC_SIZE : ])

        if calculatedCrc != sourceCrc:
            _LOGGER.warning("Failed CRC: {0} != {1} (data: {2})".format(calculatedCrc, sourceCrc, baseBuffer))
            UartEventBus.emit(DevTopics.uartNoise, "crc mismatch")
            return False

        wrapperPacket = UartWrapperPacket()
        if wrapperPacket.parse(baseBuffer):
            UartEventBus.emit(SystemTopics.uartNewPackage, wrapperPacket)
            return True
示例#3
0
    def filterhash(self):
        """
        Flatten the filter settings and the uint16 array of fingerprints
        to a uint8 array in little endian and return a crc16 of the result.

        Must match firmware.

        returns: FingerprintType
        """
        return crc16ccitt(self.serialize())
示例#4
0
    def process(self):
        """
        Process a buffer.

        Check CRC, and emit a uart packet.

        Buffer starts after size header, and includes wrapper header and tail (CRC).
        """

        # Check size
        bufferSize = len(self.buffer)
        wrapperSize = WRAPPER_HEADER_SIZE + CRC_SIZE
        if bufferSize < wrapperSize:
            _LOGGER.warning("Buffer too small")
            UartEventBus.emit(DevTopics.uartNoise, "buffer too small")
            return

        # Get the buffer between size field and CRC:
        baseBuffer = self.buffer[0:bufferSize - CRC_SIZE]

        # Check CRC
        calculatedCrc = crc16ccitt(baseBuffer)
        sourceCrc = Conversion.uint8_array_to_uint16(self.buffer[bufferSize -
                                                                 CRC_SIZE:])

        if calculatedCrc != sourceCrc:
            _LOGGER.warning("Failed CRC")
            _LOGGER.debug(
                f"Failed CRC: sourceCrc={sourceCrc} calculatedCrc={calculatedCrc} bufSize={len(self.buffer)} buffer={self.buffer}"
            )
            UartEventBus.emit(DevTopics.uartNoise, "crc mismatch")
            return

        wrapperPacket = UartWrapperPacket()
        if wrapperPacket.parse(baseBuffer):
            UartEventBus.emit(SystemTopics.uartNewPackage, wrapperPacket)
示例#5
0
 def calculateChecksum(self):
     self.checksum = crc16ccitt(self.buffer)
     print(f"CRC: used: {hex(self.checksum)}")
示例#6
0
 def calculateChecksum(self):
     self.checksum = crc16ccitt(self.chunk)
     print(f"Chunk CRC: {hex(self.checksum)}")
示例#7
0
def test_crc16_ccitt():
    assert (crc16ccitt([1, 2, 3, 4, 5]) == 37636)
    assert (crc16ccitt([63, 63]) == 53016)
    assert (crc16ccitt([99, 51]) == 17734)
    assert (crc16ccitt([170, 251]) == 45518)
示例#8
0
 def hash_to_fingerprint(self, key):
     """
     key: ByteArrayType
     returns: FingerprintType
     """
     return crc16ccitt(key)