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

    Issues connecting internet over LTE on soracom network

    Scheduled Pinned Locked Moved Discussion
    2 Posts 2 Posters 221 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.
    • C Offline
      cdyrssen
      last edited by

      So I have developed an application to run on the pycom GPy module which is supposed to connect to an AWSIoTMQTT server. Everything works when I have internet access available over WiFi, but when I try the same program except using an LTE connection I get "OSError: Network card not available" error. The GPy attaches and connects to the soracom network each time and I can successfully sync the rtc via an ntp server. It's just anytime I try to create a connection via a socket I get that error. I am experiencing the same issue with the following uping module in attempts to ping google:

      # µPing (MicroPing) for MicroPython
      # copyright (c) 2018 Shawwwn <shawwwn1@gmail.com>
      # License: MIT
      
      # Internet Checksum Algorithm
      # Author: Olav Morken
      # https://github.com/olavmrk/python-ping/blob/master/ping.py
      # @data: bytes
      def checksum(data):
          if len(data) & 0x1: # Odd number of bytes
              data += b'\0'
          cs = 0
          for pos in range(0, len(data), 2):
              b1 = data[pos]
              b2 = data[pos + 1]
              cs += (b1 << 8) + b2
          while cs >= 0x10000:
              cs = (cs & 0xffff) + (cs >> 16)
          cs = ~cs & 0xffff
          return cs
      
      def ping(host, count=4, timeout=5000, interval=10, quiet=False, size=64):
          import utime
          import uselect
          import uctypes
          import usocket
          import ustruct
          import machine
      
          # prepare packet
          assert size >= 16, "pkt size too small"
          pkt = b'Q'*size
          pkt_desc = {
              "type": uctypes.UINT8 | 0,
              "code": uctypes.UINT8 | 1,
              "checksum": uctypes.UINT16 | 2,
              "id": uctypes.UINT16 | 4,
              "seq": uctypes.INT16 | 6,
              "timestamp": uctypes.UINT64 | 8,
          } # packet header descriptor
          h = uctypes.struct(uctypes.addressof(pkt), pkt_desc, uctypes.BIG_ENDIAN)
          h.type = 8 # ICMP_ECHO_REQUEST
          h.code = 0
          h.checksum = 0
          h.id = machine.rng() & 0xffff
          h.seq = 1
      
          # init socket
          sock = usocket.socket(usocket.AF_INET, 3, 1)
          sock.setblocking(0)
          sock.settimeout(timeout/1000)
          addr = usocket.getaddrinfo(host, 1)[0][-1][0] # ip address
          sock.connect((addr, 1))
          not quiet and print("PING %s (%s): %u data bytes" % (host, addr, len(pkt)))
      
          seqs = list(range(1, count+1)) # [1,2,...,count]
          c = 1
          t = 0
          n_trans = 0
          n_recv = 0
          finish = False
          while t < timeout:
              if t==interval and c<=count:
                  # send packet
                  h.checksum = 0
                  h.seq = c
                  h.timestamp = utime.ticks_us()
                  h.checksum = checksum(pkt)
                  if sock.send(pkt) == size:
                      n_trans += 1
                      t = 0 # reset timeout
                  else:
                      seqs.remove(c)
                  c += 1
      
              # recv packet
              while 1:
                  socks, _, _ = uselect.select([sock], [], [], 0)
                  if socks:
                      resp = socks[0].recv(4096)
                      resp_mv = memoryview(resp)
                      h2 = uctypes.struct(uctypes.addressof(resp_mv[20:]), pkt_desc, uctypes.BIG_ENDIAN)
                      # TODO: validate checksum (optional)
                      seq = h2.seq
                      if h2.type==0 and h2.id==h.id and (seq in seqs): # 0: ICMP_ECHO_REPLY
                          t_elasped =  abs(utime.ticks_diff(utime.ticks_us(), h2.timestamp)/ 1000)
                          ttl = ustruct.unpack('!B', resp_mv[8:9])[0] # time-to-live
                          n_recv += 1
                          not quiet and print("%u bytes from %s: icmp_seq=%u, ttl=%u, time=%f ms" % (len(resp), addr, seq, ttl, t_elasped))
                          seqs.remove(seq)
                          if len(seqs) == 0:
                              finish = True
                              break
                  else:
                      break
      
              if finish:
                  break
      
              utime.sleep_ms(1)
              t += 1
      
          # close
          sock.close()
          ret = (n_trans, n_recv)
          not quiet and print("%u packets transmitted, %u packets received" % (n_trans, n_recv))
          return (n_trans, n_recv)
      

      Has anyone experienced this issue or know if there is a setup step that I might be missing? My LTE modem setup procedure looks like this:

      lte = LTE()
      lte.reset()
      lte.send_at_cmd('AT\!="clearscanconfig"')
      lte.send_at_cmd('AT!="RRC::addScanBand band=26"')
      lte.send_at_cmd('AT!="RRC::addScanBand band=18"')
      lte.send_at_cmd('AT+CGDCONT=1,"IP","soracom.io"')
      lte.send_at_cmd('AT+CGAUTH=1,2,"sora","sora"')
      lte.send_at_cmd('AT+CFUN=1')
      sleep(3)```
      1 Reply Last reply Reply Quote 1
      • D Offline
        dexter12
        last edited by

        +1 to this issue.

        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