Nano-Gateway Doubt
-
Hi there, i am trying to understand the code using in https://docs.pycom.io/chapter/tutorials/lora/lora-mac-nano-gateway.html which is for Gateway and Node. I not understand in the Gateway part :
while (True): recv_pkg = lora_sock.recv(512) if (len(recv_pkg) > 2): recv_pkg_len = recv_pkg[1] device_id, pkg_len, msg = struct.unpack(_LORA_PKG_FORMAT % recv_pkg_len, recv_pkg)What is it mean by "(len(recv_pkg) > 2)" , "recv_pkg_len = recv_pkg[1]" ?
In the node :
if (len(recv_ack) > 0): device_id, pkg_len, ack = struct.unpack(_LORA_PKG_ACK_FORMAT, recv_ack) if (device_id == DEVICE_ID): if (ack == 200): waiting_ack = False # If the uart = machine.UART(0, 115200) and os.dupterm(uart) are set in the boot.py this print should appear in the serial port print("ACK")How about this?
Anyone would explain how it works? Since i need to understand to implement my own code in it. Thank you
-
@mj both
recv_pkg_lenandpkg_lenare the same value, the second line could well have been written like this also:device_id, _, msg = struct.unpack(_LORA_PKG_FORMAT % recv_pkg_len, recv_pkg)
-
@robert-hh What is the intention on " recv_pkg_len = recv_pkg[1]" means the received package length is equal to the received package of the package length? Am i correct or wrong? Please do correct me, thank you.
device_id, pkg_len, msg = struct.unpack(_LORA_PKG_FORMAT % recv_pkg_len, recv_pkg)
-
@mj The answer is in any Python book: recv_pkg is a byte array, and the index [1] points to the second element of that array. In the data structure of the recv_pkg, this contains the intended length of the packet.
-
Can you explained more details on the
if (len(recv_pkg) > 2): recv_pkg_len = recv_pkg[1]what i understand is if the length of received package is more than 2byte as mentioned earlier " _LORA_PKG_FORMAT = "BB%ds" and how about "recv_pkg_len = recv_pkg[1] ? The number 1 indicate? Thankyou.
-
@mj said in Nano-Gateway Doubt:
Hi there, i am trying to understand the code using in https://docs.pycom.io/chapter/tutorials/lora/lora-mac-nano-gateway.html which is for Gateway and Node. I not understand in the Gateway part :
while (True): recv_pkg = lora_sock.recv(512) if (len(recv_pkg) > 2): recv_pkg_len = recv_pkg[1] device_id, pkg_len, msg = struct.unpack(_LORA_PKG_FORMAT % recv_pkg_len, recv_pkg)What is it mean by "(len(recv_pkg) > 2)" , "recv_pkg_len = recv_pkg[1]" ?
what's happening here is as follows:
if (len(recv_pkg) > 2):First it is checking if the received packet of data is at least 3 bytes big because in this example packets are expected to have the following format:
[Device ID (1 byte)] [Size of data in bytes (1 byte)] [Data (as many bytes as in the previous section)]
recv_pkg_len = recv_pkg[1]Now that we know the packet has enough data to be valid, we get the length of the data which is in the second byte of
recv_pkg(python array indexes start at zero)device_id, pkg_len, msg = struct.unpack(_LORA_PKG_FORMAT % recv_pkg_len, recv_pkg)This line is a bit complex so let me break it down, firstly
_LORA_PKG_FORMAT % recv_pkg_lencreates a format string that the struct.unpack understands. For example ifrecv_pkg_lenis4the format string will beBBB4s. Finally the struct is then unpacked such thatdevice_id= the first byte,pkg_len= the second byte andmsg= a string containing the rest of the bytes.If in your application you need to send something that is not a string you can modify this format string to match the datatypes you need to send as per: https://docs.python.org/3/library/struct.html#format-characters
In the node :
if (len(recv_ack) > 0): device_id, pkg_len, ack = struct.unpack(_LORA_PKG_ACK_FORMAT, recv_ack) if (device_id == DEVICE_ID): if (ack == 200): waiting_ack = False # If the uart = machine.UART(0, 115200) and os.dupterm(uart) are set in the boot.py this print should appear in the serial port print("ACK")How about this?
Anyone would explain how it works? Since i need to understand to implement my own code in it. Thank you
So this code is similar to the previous code. When the gateway successfully receives a packet, it sends back a "ack" (acknowledgement) to the node.
if (len(recv_ack) > 0): device_id, pkg_len, ack = struct.unpack(_LORA_PKG_ACK_FORMAT, recv_ack)This is the same as before, although the
> 0should probably be== 3because the ACK has a fixed formatif (device_id == DEVICE_ID):Now that we know we have received a packet we need to check if it was meant for this node if not ignore it
if (ack == 200): waiting_ack = FalseIf the packet was for this node, check if the ack byte has a value of
200. The actual value of200has no significance,200was picked to match the HTTP OK status code. Once we get a ACK we setwaiting_ackso the node will stop waiting for one.Hope this all makes sense