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

    LoPy to LoPy: Raw LoRa sf

    Scheduled Pinned Locked Moved Getting Started
    loramacraw loraspreading facto
    2 Posts 2 Posters 137 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.
    • G Offline
      GMB124
      last edited by

      Hi everyone!

      I'm working with raw LoRa (LoRaMAC) and I use two LoPy-4 board: one transmits whereas the second one receives.
      I've been working using spreading factor (sf) 7, and now I want to test other spreading factor values using the command lora.sf([value]). However, when I change the sf of the transmitted packet, my nanogateway doesn't see the packets anymore.

      Node code:

      import os
      import socket
      import time
      import struct
      from network import LoRa
      
      # A basic package header, B: 1 byte for the deviceId, B: 1 byte for the pkg size
      _LORA_PKG_FORMAT = "BB%ds"
      _LORA_PKG_ACK_FORMAT = "BBB"
      DEVICE_ID = 0x01
      
      
      # Open a Lora Socket, use tx_iq to avoid listening to our own messages
      # Please pick the region that matches where you are using the device:
      # Asia = LoRa.AS923
      # Australia = LoRa.AU915
      # Europe = LoRa.EU868
      # United States = LoRa.US915
      lora = LoRa(mode=LoRa.LORA, tx_iq=True, region=LoRa.EU868)
      lora_sock = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
      lora_sock.setblocking(False)
      lora.sf(8)
      
      while(True):
          # Package send containing a simple string
          msg = "Device 1 Here"
          pkg = struct.pack(_LORA_PKG_FORMAT % len(msg), DEVICE_ID, len(msg), msg)
          lora_sock.send(pkg)
      
          # Wait for the response from the gateway. NOTE: For this demo the device does an infinite loop for while waiting the response. Introduce a max_time_waiting for you application
          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)
      
      

      Receiver code:

      import socket
      import struct
      from network import LoRa
      
      # A basic package header, B: 1 byte for the deviceId, B: 1 byte for the pkg size, %ds: Formatted string for string
      _LORA_PKG_FORMAT = "!BB%ds"
      # A basic ack package, B: 1 byte for the deviceId, B: 1 byte for the pkg size, B: 1 byte for the Ok (200) or error messages
      _LORA_PKG_ACK_FORMAT = "BBB"
      
      # Open a LoRa Socket, use rx_iq to avoid listening to our own messages
      # Please pick the region that matches where you are using the device:
      # Asia = LoRa.AS923
      # Australia = LoRa.AU915
      # Europe = LoRa.EU868
      # United States = LoRa.US915
      lora = LoRa(mode=LoRa.LORA, rx_iq=True, region=LoRa.EU868)
      lora_sock = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
      lora_sock.setblocking(False)
      
      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)
      
      # 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('Device: %d - Pkg:  %s' % (device_id, msg))
              print(lora.stats)
              ack_pkg = struct.pack(_LORA_PKG_ACK_FORMAT, device_id, 1, 200)
              lora_sock.send(ack_pkg)
      
      

      I think I have to change some receiver settings, but I don't know how.

      Thank you for your help!

      1 Reply Last reply Reply Quote 0
      • L Offline
        lmo
        last edited by

        Just guessing, but you should probably set the same spreading factor on the receiver also?

        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