2222from digi .xbee .models .address import XBee64BitAddress , XBee16BitAddress
2323from digi .xbee .models .message import XBeeMessage , ExplicitXBeeMessage , IPMessage , \
2424 SMSMessage
25+ from digi .xbee .models .mode import OperatingMode
2526from digi .xbee .models .options import ReceiveOptions
2627from digi .xbee .models .protocol import XBeeProtocol
2728from digi .xbee .packets import factory
2829from digi .xbee .packets .aft import ApiFrameType
30+ from digi .xbee .packets .base import XBeePacket
2931from digi .xbee .packets .common import ReceivePacket
3032from digi .xbee .packets .raw import RX64Packet , RX16Packet
3133from digi .xbee .util import utils
@@ -294,7 +296,7 @@ def run(self):
294296 self .__stop = False
295297 while not self .__stop :
296298 # Try to read a packet.
297- raw_packet = self .__try_read_packet ()
299+ raw_packet = self .__try_read_packet (self . __xbee_device . operating_mode )
298300
299301 if raw_packet is not None :
300302 # If the current protocol is 802.15.4, the packet may have to be discarded.
@@ -623,7 +625,7 @@ def __execute_user_callbacks(self, xbee_packet, remote=None):
623625 sender = str (xbee_packet .phone_number ),
624626 more_data = xbee_packet .data ))
625627
626- def __try_read_packet (self ):
628+ def __try_read_packet (self , operating_mode = OperatingMode . API_MODE ):
627629 """
628630 Reads the next packet. Starts to read when finds the start delimiter.
629631 The last byte read is the checksum.
@@ -639,13 +641,22 @@ def __try_read_packet(self):
639641 """
640642 try :
641643 xbee_packet = bytearray (1 )
644+ # Add packet delimiter.
642645 xbee_packet [0 ] = self .__serial_port .read_byte ()
643646 while xbee_packet [0 ] != SpecialByte .HEADER_BYTE .value :
644647 xbee_packet [0 ] = self .__serial_port .read_byte ()
645648 packet_length = self .__serial_port .read_bytes (2 )
649+ # Add packet length.
646650 xbee_packet += packet_length
647651 length = utils .length_to_int (packet_length )
648- xbee_packet += self .__serial_port .read_bytes (length )
652+ # Add packet payload.
653+ for _ in range (0 , length ):
654+ read_byte = self .__serial_port .read_byte ()
655+ xbee_packet .append (read_byte )
656+ # Read escaped bytes in API escaped mode.
657+ if operating_mode == OperatingMode .ESCAPED_API_MODE and read_byte == XBeePacket .ESCAPE_BYTE :
658+ xbee_packet .append (self .__serial_port .read_byte ())
659+ # Add packet checksum.
649660 xbee_packet .append (self .__serial_port .read_byte ())
650661 return xbee_packet
651662 except TimeoutException :
0 commit comments