LoRaWAN Gateway using CatM1



  • Hello, I am trying to use the FiPy to be a LoRaWAN gateway and instead of being connected via WiFi, it is connected by CATM1.

    I am using a hologram SIM and I can establish a connection, everything looks fine and I even get a connection on The Things Network, however I get the following errors:

    [  9095.759] Attaching...
    [  9096.140] Attaching...
    [  9096.519] Attaching...
    [  9098.096] lte connected
    [  9098.104] Starting LoRaWAN nano gateway with id: b'CC50E3FFFEA5C304'
    [  9098.113] Syncing time with pool.ntp.org ...
    [  9099.473] RTC NTP sync complete
    [  9100.101] Opening UDP socket to router.au.thethings.network (52.62.83.250) port 1700...
    [  9100.123] Setting up the LoRa radio at 916.7999 Mhz using SF10BW125
    [  9100.135] LoRaWAN nano gateway online
    [  9100.142] You may now press ENTER to enter the REPL
    Unhandled exception in thread started by <bound_method>
    Traceback (most recent call last):
      File "nanogateway.py", line 458, in _udp_thread
      File "nanogateway.py", line 457, in _udp_thread
    AttributeError: 'OSError' object has no attribute 'errno'
    [  9175.124] Failed to ´┐Żets Jun  8 2016 00:22:57
    
    

    After this it will restart every minute or so.

    I have also tried using pybytes and have established a connection but can't see what is going wrong and then it will just reset as well.

    I have added these lines to my nanogateway.py code for the LTE connection:

        def start(self):
            """
            Starts the LoRaWAN nano gateway.
            """
            lte.reset()
            lte.send_at_cmd('AT+CGDCONT=1,"IP","hologram"')
            lte.send_at_cmd('AT!="addscanfreq band=28 dl-earfcn=9410"')
            lte.send_at_cmd('AT!=1')
            lte.send_at_cmd('AT+CEREG=2')
            lte.send_at_cmd('AT+CFUN=1')
            lte.attach()
            while not lte.isattached():
                time.sleep(0.25)
                self._log('Attaching...')
            lte.connect()
            while not lte.isconnected():
                utime.sleep_ms(50)
            self._log('lte connected')
            self._log('Starting LoRaWAN nano gateway with id: {}', self.id)
    

    and removed the wifi stuff from the config etc.

    I haven't changed anything here, but this is where the error happens:

    
        def _udp_thread(self):
            """
            UDP thread, reads data from the server and handles it.
            """
    
            while not self.udp_stop:
                try:
                    data, src = self.sock.recvfrom(1024)
                    _token = data[1:3]
                    _type = data[3]
                    if _type == PUSH_ACK:
                        self._log("Push ack")
                    elif _type == PULL_ACK:
                        self._log("Pull ack")
                    elif _type == PULL_RESP:
                        self.dwnb += 1
                        ack_error = TX_ERR_NONE
                        tx_pk = ujson.loads(data[4:])
                        if "tmst" in data:
                            tmst = tx_pk["txpk"]["tmst"]
                            t_us = tmst - utime.ticks_cpu() - 15000
                            if t_us < 0:
                                t_us += 0xFFFFFFFF
                            if t_us < 20000000:
        					    self.uplink_alarm = Timer.Alarm(
                                    handler=lambda x: self._send_down_link(
                                        ubinascii.a2b_base64(tx_pk["txpk"]["data"]),
                                        tx_pk["txpk"]["tmst"] - 50, tx_pk["txpk"]["datr"],
                                        int(tx_pk["txpk"]["freq"] * 1000) * 1000
                                    ),
                                    us=t_us
                                )
                            else:
                                ack_error = TX_ERR_TOO_LATE
                                self._log('Downlink timestamp error!, t_us: {}', t_us)
                        else:
                            self.uplink_alarm = Timer.Alarm(
                                handler=lambda x: self._send_down_link_class_c(
                                    ubinascii.a2b_base64(tx_pk["txpk"]["data"]),
                                    tx_pk["txpk"]["datr"],
                                    int(tx_pk["txpk"]["freq"] * 1000) * 1000
                                ),
                                us=50
                            )
                        self._ack_pull_rsp(_token, ack_error)
                        self._log("Pull rsp")
                except usocket.timeout:
                    pass
                except OSError as ex:
                    if ex.errno != errno.EAGAIN: #This is line 457
                        self._log('UDP recv OSError Exception: {}', ex)
                except Exception as ex:
                    self._log('UDP recv Exception: {}', ex)
    
                # wait before trying to receive again
                utime.sleep_ms(UDP_THREAD_CYCLE_MS)
    
            # we are to close the socket
            self.sock.close()
            self.udp_stop = False
            self._log('UDP thread stopped')
    
    

    Has anyone had success using a FiPy as a LoRaWAN Gateway with CATM1?

    Also I removed the wifi details from the init line:

        def __init__(self, id, frequency, datarate, server, port, ntp_server='pool.ntp.org', ntp_period=3600):
    
    


  • I now have a different crash occuring:

    [  3153.373] Pull ack
    [  3208.926] Push ack
    Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
    Core 1 register dump:
    PC      : 0x4010967f  PS      : 0x00060830  A0      : 0x800e07c0  A1      : 0x3ffd9270
    A2      : 0x00000001  A3      : 0x00000001  A4      : 0x00000000  A5      : 0x00000001
    A6      : 0x00000000  A7      : 0x00060023  A8      : 0x801084ca  A9      : 0x3ffe63e0
    A10     : 0x00000001  A11     : 0x00000001  A12     : 0x3f94fa00  A13     : 0x3f94fa00
    A14     : 0x3ffe6570  A15     : 0x3ffe64d0  SAR     : 0x00000016  EXCCAUSE: 0x0000001c
    EXCVADDR: 0x00000001  LBEG    : 0x4009846c  LEND    : 0x4009849a  LCOUNT  : 0xffffffff
    
    Backtrace: 0x4010967f:0x3ffd9270 0x400e07bd:0x3ffd9290 0x400e082e:0x3ffd92b0 0x400e0d4d:0x3ffd92e0 0x40107505:0x3ffd9300 0x40100e9a:0x3ffd9330 0x400fd269:0x3ffd9360 0x401091ed:0x3ffd9380 0x40100f34:0x3ffd9420 0x400fd269:0x3ffd9450 0x400fd296:0x3ffd9470 0x400e0e1d:0x3ffd9490 0x400e109d:0x3ffd9530 0x400df973:0x3ffd9550
    
    

    Also:

    [  5366.448] Failed to pull downlink packets from server: [Errno 118] EHOSTUNREACH
    


  • Cheers,

    That fixed the connection issue, it's connecting every time now.

    It is still resetting every 5-10 minutes for no particular reason even after using a keyboard reset, this seems like it's related to pybytes since none of my code is running. I have my pybytes json file as follows:

    {"wifi": {"ssid": "", "password": ""}, "wlan_antenna": 0, "dump_ca": false, "lora": {"abp": {"dev_addr": "undefined", "app_skey": "undefined", "nwk_skey": "undefined"}}, "server": "mqtt.pybytes.pycom.io", "ssl": false, "lte": {"apn": "hologram", "cid": 1, "reset": false, "carrier": "Verizon", "band": 28, "type": "IP"}, "device_id": "c4850280-85ab-4a84-b9aa-ded71a7cf2e8", "network_preferences": ["lte", "lora_abp"], "ota_server": {"port": 443, "domain": "18.195.202.40"}, "pybytes_autostart": false, "username": "*****"}
    
    

    I thought putting pybytes autostart as false would solve the problem, but it has not.

    Any ideas?

    Note: If I do the keyboard interrupt immediately after a reset it won't do its reset after 5-10mins, I'll have a look through the nanogateway code incase theres another timeout or something, I'll also try and figure out exactly how long it takes before a reset. I'll put a reception strength checker in for each ack so I know it's not reception and maybe a lte.isconnected() to see if it's connected too.



  • @Dylan See this PR and a fixx to the errno trouble: https://github.com/pycom/pycom-libraries/pull/107
    Especially: Change that line:

                    if ex.errno != errno.EAGAIN:
    

    into

                   if ex.args[0] != errno.EAGAIN:
    

    P.S.: PyCom has a lot of room for improvement when it comes to keeping the documentation correct and recent as well as responding to PR's from the community.


Log in to reply
 

Pycom on Twitter