Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    Acknowledgment giving wrong value

    Scheduled Pinned Locked Moved LoPy
    lopylora
    6 Posts 2 Posters 1.5k Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • T Offline
      timeb
      last edited by

      I was trying to follow the LoRa Nano-Gateway example in the docs https://docs.pycom.io/pycom_esp32/pycom_esp32/tutorial/includes/lora-nano-gateway.html. In the gateway code there is ack_pkg = struct.pack(_LORA_PKG_ACK_FORMAT, device_id, 1, 200)
      lora_sock.send(ack_pkg). So, I should get an acknowledgment on the message sending node. I am not getting the acknowledgment. To debug I used a print statement and printed print(ack) on the node sending the data. Instead of getting 200, print(ack) produces 161. Why does the value of the ack change? I believe this problem is the cause for not receiving the acknowledgment.

      T 1 Reply Last reply Reply Quote 0
      • T Offline
        timeb @timeb
        last edited by

        I am focusing on this part which belongs to the Node code as given in the docs. The thing is once recv_ack is unpacked and the following two conditions should be tested for the arrival of an acknowledgment.
        if(device_id == DEVICE_ID):
        if(ack == 200)

        So, in my case I don't receive the acknowledgment and I tried to debug it using print after unpacking then I did print(ack) but the value I get is 161 which is not equal to 200 and then I don't receive the acknowledgment. What could have possibly happened?

        waiting_ack = True
        while(waiting_ack):
        recv_ack = lora_sock.recv(256)

            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")
                    else:
                        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("Message Failed")
        
        time.sleep(5)
        
        L 1 Reply Last reply Reply Quote 0
        • L Offline
          livius @timeb
          last edited by

          @timeb
          You must show more info, format used for pack and unpack
          Data used for call function arguments
          also data send and what you recived

          think about people first, then computers

          T 1 Reply Last reply Reply Quote 0
          • T Offline
            timeb @livius
            last edited by timeb

            @livius

            while True:
            pkg = struct.pack(_LORA_PKG_FORMAT %len(msg), DEST_MAC_ADDR,
            SRC_MAC_ADDR, SINK_MAC_ADDR,len(msg), msg)
            lora_sock.send(pkg)

                waiting_ack = True
                while(waiting_ack):
                    # if a message of the size of acknowledge message is received
                    if(len(recv_ack) > 0):
                        to_addr,  from_addr , pkg_len, ack = struct.unpack(_LORA_ACK_FORMAT, recv_ack)
                        if(to_addr == SRC_MAC_ADDR and from_addr == DEST_MAC_ADDR):
                            if(ack == 200):
                                waiting_ack=False
                                print("Ack Received from: %s"%DEST_MAC_ADDR)
                            else:             
                                waiting_ack = False
                                print("Message Failed")
                        elif(to_addr == SRC_MAC_ADDR and from_addr == SINK_MAC_ADDR):
                            if(ack == 200):
                                waiting_ack = False
                        
                        else:
                            waiting_ack = False
                            print("Ack Error") 
                time.sleep(5)
            
            T 1 Reply Last reply Reply Quote 0
            • T Offline
              timeb @timeb
              last edited by timeb

              while (True):
              recv_pkg = lora_sock.recv(512)
              time.sleep(0.2)

              if(len(recv_pkg) > 13):
                  recv_pkg_len = recv_pkg[12]
                  # unpack the message based on protocol definition
                  dest_addr,  src_addr, sink_addr, pkg_len, msg = struct.unpack(_LORA_PKG_FORMAT % recv_pkg_len,  recv_pkg) 
                  # Check whether it is final destination(Sink address) for message
                  if(dest_addr==SRC_ADDR and sink_addr == NULL_ADDR):
                      print("Src_addr: %s \t Pkg:  %s" %(src_addr,msg))
                      ack_pkg = struct.pack(_LORA_ACK_FORMAT, DST_ADDR,  SRC_ADDR,  1, 200)
                      lora_sock.send(ack_pkg)
                      waiting_ack = False
              
              T 1 Reply Last reply Reply Quote 0
              • T Offline
                timeb @timeb
                last edited by timeb

                while (True):
                recv_pkg = lora_sock.recv(512)
                time.sleep(0.2)

                if(len(recv_pkg) > 13):
                    print(recv_pkg)
                    recv_pkg_len = recv_pkg[12]
                    # unpack the message based on protocol definition
                    dest_addr,  src_addr, pkg_len, msg = struct.unpack(_LORA_PKG_FORMAT % recv_pkg_len,  recv_pkg) 
                    if(dest_addr==SRC_ADDR):
                        ack_pkg = struct.pack(_LORA_ACK_FORMAT, src_addr, SRC_ADDR, 1, 200)
                        lora_sock.send(ack_pkg)
                            else:
                                    print("Message lost")
                
                1 Reply Last reply Reply Quote 0

                Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                With your input, this post could be even better 💗

                Register Login
                • 1 / 1
                • First post
                  Last post

                Pycom on Twitter

                Pycom