How do you send data over NB-IOT on a FiPy? What socket.XXX to use? or do it ia AT+Commands?



  • How do you send data over NB-IOT on a FiPy?

    I've tired all of the following socket-options ... and best I can mange is that get a HTTP Response of 47

    print('@ usocket.socket()')
    #s = usocket.socket()
    #s = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
    #s = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
    #s = usocket.socket(usocket.AF_INET, usocket.SOCK_RAW)
    #s = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.IPPROTO_TCP)
    #s = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM, usocket.IPPROTO_TCP)
    #s = usocket.socket(usocket.AF_INET, usocket.SOCK_RAW, usocket.IPPROTO_TCP)
    #s = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.IPPROTO_UDP)
    s = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM, usocket.IPPROTO_UDP)
    #s = usocket.socket(usocket.AF_INET, usocket.SOCK_RAW, usocket.IPPROTO_UDP)
    

    I do manage to connect to the Telia NB-IOT (Sweden, Lund):

    -----------------------------------------------------------------------------
    LOG: Initializing LTE NB-IOT
    LOG: define LTE()
    LOG: Reset LTE()
    LOG: Disonnecting LTE ... OK
    LOG: Detaching LTE ... OK
    LOG: LTE IMEI: 354346099263716
    LOG: AT CMD: AT+CEREG=2
    LOG: AT CMD: AT+CFUN=0
    LOG: AT CMD: AT!="clearscanconfig"
    LOG: AT CMD: AT!="addscanfreq band=20 dl-earfcn=6300"
    LOG: AT CMD: AT!="disablelog 1"
    LOG: AT CMD: AT+CGDCONT=1,"IP","lpwa.telia.iot"
    LOG: AT CMD: AT+CFUN=1
    
    DL SYNCHRO STATISTICS
    =====================
        Synchro state                         : IDLE
        PPU SIB1 ACQ watchdog                 : 0
        Frequency Hypothesis RF  (Hz)         : 0
        RSRP (dBm)                            : 0.00
        RSRQ  (dB)                            : 0.00
        Channel estimation state (Cell-spec.) : LOW CINR
        Channel estimation state (UE-spec.)   : LOW CINR
        Channel estimation state (MBSFN)      : LOW CINR
        Channel estimation CINR               : 0.00
        Channel length                        : SHORT
      AGC
        AGC RX gain (dB)                      : 0.00
        RX PSD BO (dBFs)                      : 0.00
        RX PSD (dBm)                          : 0.00
        Noise level RS (dBm)                  : 0.00
        Digital gain (dB)                     : 0.00
        CINR RS (dB)                          : 0.00
      NARROWBANDS
        Last DL NB                            : 0
        Last UL NB                            : 0
      AFC
        Frequency offset RF  (Hz)             : 0
        Frequency offset BB  (Hz)             : 0
      PBCH
        MIB received quantity                 : 0
        MIB timeout quantity                  : 0
    
    OK
    
    
    SYSTEM FSM
    ==========
        +--------------------------+--------------------+
        |            FSM           |        STATE       |
        +--------------------------+--------------------+
        | RRC TOP FSM              |STOPPED             |
        | RRC SEARCH FSM           |NULL                |
        | RRC ACTIVE FSM           |NULL                |
        | PMM PLMN FSM             |NULL                |
        | EMM MAIN FSM             |NULL                |
        | EMM AUTH FSM             |NULL                |
        | EMM CONN FSM             |NULL                |
        | EMM TAU FSM              |NULL                |
        | EMM TEST FSM             |NULL                |
        | ESM BEARER FSM           |BEARER_NULL         |
        | SMS MT FSM               |IDLE                |
        | SMS MO FSM               |IDLE                |
        | LPP FSM                  |IDLE                |
        | HP MAIN FSM              |IDLE                |
        | HP USIM FSM              |NULL                |
        | HP SMS MO FSM            |IDLE                |
        | HP SMS MT FSM            |IDLE                |
        | HP CAT FSM               |NULL                |
        +--------------------------+--------------------+
    
    OK
    
    LOG: Attaching to LTE network ......... OK
    LOG: Check LTE signal streanght (RSSI): +CSQ: 12,99OK
    LOG: Getting IP address: +CGPADDR: 1,"10.17.162.180"OK
    LOG: Connecting on LTE network  OK```
    
    

    But I cannot establish a socket or usocket connection to the Wia.io platform we use ... I have tested via Postman that the API is working properly and it all checks out ... so it's not a Platform issue ... and just a simple data connectivity issue of how to establish a connection ...via LTE NB-IOT



  • @combaindeft Hej! I have just started to play with he Telia IoT using fipy. But I guess I am having similar problem with the socket creation as you experienced. I got such an error OSError: [Errno 113] EHOSTUNREACH while connecting to sockets. So how is it working for you now? Thanks.



  • @danielm

    UPDATE - DNS over NB-IOT is now working!

    Please update to the latest 1.18.2 (stable):
    https://forum.pycom.io/topic/4361/new-stable-firmware-release-v1-18-2

    or to the latest 1.20.0.rc7 (development):
    https://forum.pycom.io/topic/4359/new-v1-20-0-release-candidate-v1-20-0-rc7

    Use the following to set your DNS Server to Google's DNS Servers ...

    usocket.dnsserver(0,'8.8.8.8')
    usocket.dnsserver(1,'4.4.4.4')
    usocket.dnsserver()
    ('8.8.8.8', '4.4.4.4')
    

    Then bring up your LTE Connection, and do:

    >>> print(usocket.getaddrinfo("www.google.com", 80)[0][-1])
    ('216.58.211.4', 80)


  • @combaindeft
    It's the same situation like with NB-IoT network of Slovak Telekom which I am using. It would help if it could be possible to set IP address of DNS server manually but I am not aware of such command.

    Another option is to implement DNS client directly in MicroPython.



  • @danielm

    Hi again,

    I have update to the latest development firmware 1.20.0.rc1

    >>> send_at_cmd_pretty('AT+CGPADDR')
    
    +CGPADDR: 1,"10.17.160.149"
    
    OK
    
    >>> 
    send_at_cmd_pretty('AT+CGCONTRDP=1')
    
    +CGCONTRDP: 1,5,"lpwa.telia.iot.mnc020.mcc238.gprs","10.17.160.149.255.255.255.255","","","","",""
    
    OK
    
    >>>
    

    And yes, it looks like we don't get any DNS_Prim_Server_IP from the DHCP :-( .. so doing DNS lookups doesn't work :-(



  • @combaindeft
    In my opinion it makes perfect sense to use the same socket family type for all IP based interfaces. It allows to use application-level protocol libraries (e.g. urequests, umqtt) over multiple types of IP interfaces without adaptation.

    Regarding DNS lookups - following fix was introduced in pre-release 1.18.1.r5:

    Another issue with DNS resolving using socket.getaddrinfo() seems to be the fact that according to Sequans AT command reference it is not possible to manually set IP addresses of DNS servers. They may be some undocumented command...

    You may check if IP addresses of DNS servers are provided by the network by command:
    PDP Context Read Dynamic Parameters: +CGCONTRDP
    Response format: <bearer_id>, <apn>, <local_addr and subnet_mask>, <gw_addr>, <DNS_prim_addr>, <DNS_sec_addr>, <P-CSCF_prim_addr>, <P-CSCF_sec_addr>, <IM_CN_Signalling_Flag>

    Some DNS-related fixed was introduced in Sequans firmware NB1-40343.

    However, my experience is that releases 1.18.1.r3 to 1.18.1.r5 do not work well with NB-IoT connections in "real" applications. 1.18.1.r2 seems to work best from available releases however there is a known issue of eternal LTE.init() hang. It does not happen after every reset but you will eventually encounter it.

    Check my post and the post following after it for code for testing of NB-IoT connection. Do not forget to adapt band number and APN.
    https://forum.pycom.io/topic/3985/new-lte-firmware-releases-v1-18-1-r4-stable-1-19-0-b5-development-nb-iot-firmware-40343/21

    I also see that @iwahdan just released 1.18.1.r6 so we should test this release asap as well :)



  • @shedaim Hi,

    as you can read in my post usocket getaddrinfo issues ... there is something not OK with how it get's it's ip.

    Also, how do you tell usocket to use the LTE connection to send the data through? ... kinda like you do with Sigfox ... it has it's own socket.AF_SIGFOX defined ... LTE NB-IOT should have it's own aswell ...

    Right now can create a socket ... but it doesn't send any data through NB-IOT ... big question is, how where does all the data that I send go?



  • @combaindeft said in How do you send data over NB-IOT on a FiPy? What socket.XXX to use? or do it ia AT+Commands?:

    and just a simple data connectivity issue of h

    I use the library socket for the GPy, but it probably works the same for the FiPy.

    import socket
    
    addr = socket.getaddrinfo(ip, port)[0][-1]
    s = socket.socket()
    s.connect(addr)
    s.send(bytes(message), 'utf8'))
    
    

    Check whether you are connecting to the right "cid" for the right APN.



Pycom on Twitter