NTN Support and Application Feasibility on nRF9151

Inquiry: NTN Support and Application Feasibility on nRF9151

I would like to seek clarification regarding Non-Terrestrial Network (NTN) support on the nRF9151.

There have been discussions and references suggesting NTN capability on the nRF9151, and I would like to better understand the current level of support and practical limitations.

Specifically, I am interested in the following:

1. Resource Availability

  • Which nRF Connect SDK versions include sample applications or support for NTN on nRF9151?

  • Are there example projects, reference code, or documentation demonstrating NTN connectivity in practice?

  • If official samples are not yet available, is there a roadmap or expected timeline for when they might be provided?

  • What type of antenna is required or recommended for NTN operation on the nRF9151?

2. Application Feasibility

We are currently using the nRF9151 with a Hologram eSIM in India, and our solution is working reliably:

  • connectivity

  • Cellular IoT stack

  • Data transmission to a CoAP server

Given this setup:

  • Is a similar application architecture feasible over NTN?

  • Can CoAP-based data transmission be supported over NTN in a comparable manner?

3. SDK Support and Examples

  • I could not find any nRF Connect SDK samples, documentation, or application notes specifically related to NTN on nRF9151

  • Are there any example applications, experimental features, or recommended references available?

  • If not, could you please advise on the current status and roadmap for NTN support on nRF9151?

Any guidance, documentation links, or clarification would be greatly appreciated.

Thank you for your support.

Parents
  • Hi Priyesh,
    To fill out some more information not already answered by Achim:

    Which nRF Connect SDK versions include sample applications or support for NTN on nRF9151?

    The NCS version you need is v3.2.0. 

    We recommend starting with either of this two options:

    • The Serial Modem Application (modem only apporach, AT commands)
    • Asset Tracker Template configured for satellite connectivity.

    Note: To ensure NTN support is correctly implemented, please refer to our dedicated NTN use case doc and NTN and TN use case doc, as the standard template is not configured for NTN by default.

    If official samples are not yet available, is there a roadmap or expected timeline for when they might be provided?

    Please reach out to the regional sales manager for your area as we cannot talk about roadmap on DevZone.

    What type of antenna is required or recommended for NTN operation on the nRF9151?

    We recommend reaching out to our antenna solution partners. They are equipped to provide detailed guidance on the most suitable antenna for your specific application.

    NTN NB-IoT require optimal link conditions, and the choice of antenna depends on multiple factors, including whether the application supports both LTE and NTN or NTN alone, as well as the physical constraints of the product.

    For applications targeting both LTE and NTN, it is essential to select a wideband antenna that can meet the performance and form factor requirements of both technologies. The antenna must support a broad frequency range to satisfy the performance criteria of LTE networks and the relevant satellite operators.

    The nRF9151 SMA DK includes Taoglas (LTE/NTN/NR+) and Kyocera (GNSS) antennas.

    If not, could you please advise on the current status and roadmap for NTN support on nRF9151?

    The alpha version of the NTN modem FW is now public and can be downloaded here. This firmware is only for nRF9151 LACA A1 SiP.

    Regards,
    Benjamin

  • Hi Benjamin,

    Thanks for the info.

    Quick question:


    Can we connect to a CoAP server over NTN like we do on cellular, or is NTN only for location updates?
    Is custom payload upload supported beyond basic asset tracking?

    Regards ,
    Priyesh

  • CoAP in general assumes a default timeout, which is based on constrained networks.

    But NTN is even "more constraint". In my experience, at least the first message exchange (request/response) takes up to 30s (sometimes even 50s) after the device is RRC active and registered in the network. Follow-up message may be faster (10-15s) but there will be also cases, where more time is needed. I use in the meantime 50s ACK timeout.

  •  I will address CoAP timing later. In this case, the issue appears earlier, as the device does not seem to reach a connected state in NTN mode. The modem keeps requesting location updates, but the application does not progress beyond this, unlike in LTE mode where the same sample works. Therefore, this seems related to NTN attachment or modem state rather than CoAP behavior.

    is there anything that I should change so that it connects to network.

  • is there anything that I should change so that it connects to network.

    I'm not sure, but I don't see, that you select band 256 and 255, do you?

    AT%XBANDLOCK=2,,\"255,256\"

  • > at
    OK
    > at+cfun=0
    OK
    > at%xfactoryreset=0
    OK
    > at%xsystemmode=0,0,0,0,1
    OK
    > at%xbandlock=2,,"255,256"
    OK
    > at%location=2,"36.331449","-119.292130","0",0,0
    OK
    > at+cgdcont=0,"IP","data.mono"
    OK
    > at%mdmev=2
    OK
    > at+cscon=3
    OK
    > at+cnec=24
    OK
    > at+cereg=5
    OK
    > at+cfun=1
    OK
    %MDMEV: SEARCH STATUS 1
    +CEREG: 91,,,14
    +CEREG: 4
    %MDMEV: SEARCH STATUS 2
    > at#xping="8.8.8.8",32,30000,4,1000
    "EAI_SYSTEM"
    ERROR
    
    > at
    OK
    > at+cfun=0
    OK
    > at%xfactoryreset=0
    OK
    > at%xsystemmode=0,0,0,0,1
    OK
    > at%xbandlock=2,,"255,256"
    OK
    > at%location=2,"36.331449","-119.292130","0",10,0
    OK
    > at+cgdcont=0,"ip","data.mono"
    OK
    > at%mdmev=2
    OK
    > at+cscon=3
    OK
    > at+cereg=5
    OK
    > at+cnec=24
    OK
    > at+cfun=1
    OK
    %MDMEV: SEARCH STATUS 1
    +CEREG: 91,,,14
    +CEREG: 4
    %MDMEV: SEARCH STATUS 2
    

    earlier i was able to ping with these commands, but now even that is failing.

  • I also tried with at monitor sample, where i modified commands.

    /*
     * Copyright (c) 2021 Nordic Semiconductor ASA
     *
     * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
     */
    
    #include <string.h>
    #include <zephyr/kernel.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <nrf_modem_at.h>
    #include <modem/nrf_modem_lib.h>
    #include <modem/at_monitor.h>
    #include <modem/modem_info.h>
    
    AT_MONITOR(cmd_rsp, ANY, cmd_mon, ACTIVE);
    
    uint8_t response[128] = {0};
    
    static void cmd_mon(const char *notif)
    {
    
    	printk("%s\n", notif);
    }
    
    int main(void)
    {
    	int err;
    
    	printk("AT Monitor sample started\n");
    
    	err = nrf_modem_lib_init();
    	if (err)
    	{
    		printk("Modem library initialization failed, error: %d\n", err);
    		return 0;
    	}
    
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CFUN=0");
    	if (err)
    	{
    		printk("Failed to read AT+CFUN=0, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%%XFACTORYRESET=0");
    	if (err)
    	{
    		printk("Failed to read xfactoryreset, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%%XSYSTEMMODE=0,0,0,0,1");
    	if (err)
    	{
    		printk("Failed to read XSYSTEMMODE, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%%XBANDLOCK=2,,\"255,256\"");
    	if (err)
    	{
    		printk("Failed to read XBANDLOCK, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%%LOCATION=2,\"36.33144938\",\"-119.292130\",\"0\",0,0");
    	if (err)
    	{
    		printk("Failed to read LOCATION, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CGDCONT=0,\"IP\",\"data.mono\"");
    	if (err)
    	{
    		printk("Failed to read CGDCONT, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%MDMEV=2");
    	if (err)
    	{
    		printk("Failed to read MDMEV, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CSCON=3");
    	if (err)
    	{
    		printk("Failed to read CSCON, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CNEC=24");
    	if (err)
    	{
    		printk("Failed to read CEREG, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CEREG=5");
    	if (err)
    	{
    		printk("Failed to read CEREG, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CFUN=1");
    	if (err)
    	{
    		printk("Failed to read CEREG, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(200000);
    
    	// err = nrf_modem_at_cmd(response, sizeof(response), "AT#XPING=\"8.8.8.8\",32,30000,4,1000");
    	// if (err)
    	// {
    	// 	printk("Failed to read XPING, err %d\n", err);
    	// }
    
    	// printk("%s\n", response);
    
    	while (true)
    	{
    		/* code */
    		k_msleep(10000);
    		err = nrf_modem_at_cmd(response, sizeof(response), "AT%%XMONITOR");
    		if (err)
    		{
    			printk("Failed to read CEREG, err %d\n", err);
    			return 0;
    		}
    
    		printk("%s\n", response);
    	}
    }
    

Reply
  • I also tried with at monitor sample, where i modified commands.

    /*
     * Copyright (c) 2021 Nordic Semiconductor ASA
     *
     * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
     */
    
    #include <string.h>
    #include <zephyr/kernel.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <nrf_modem_at.h>
    #include <modem/nrf_modem_lib.h>
    #include <modem/at_monitor.h>
    #include <modem/modem_info.h>
    
    AT_MONITOR(cmd_rsp, ANY, cmd_mon, ACTIVE);
    
    uint8_t response[128] = {0};
    
    static void cmd_mon(const char *notif)
    {
    
    	printk("%s\n", notif);
    }
    
    int main(void)
    {
    	int err;
    
    	printk("AT Monitor sample started\n");
    
    	err = nrf_modem_lib_init();
    	if (err)
    	{
    		printk("Modem library initialization failed, error: %d\n", err);
    		return 0;
    	}
    
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CFUN=0");
    	if (err)
    	{
    		printk("Failed to read AT+CFUN=0, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%%XFACTORYRESET=0");
    	if (err)
    	{
    		printk("Failed to read xfactoryreset, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%%XSYSTEMMODE=0,0,0,0,1");
    	if (err)
    	{
    		printk("Failed to read XSYSTEMMODE, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%%XBANDLOCK=2,,\"255,256\"");
    	if (err)
    	{
    		printk("Failed to read XBANDLOCK, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%%LOCATION=2,\"36.33144938\",\"-119.292130\",\"0\",0,0");
    	if (err)
    	{
    		printk("Failed to read LOCATION, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CGDCONT=0,\"IP\",\"data.mono\"");
    	if (err)
    	{
    		printk("Failed to read CGDCONT, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT%MDMEV=2");
    	if (err)
    	{
    		printk("Failed to read MDMEV, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CSCON=3");
    	if (err)
    	{
    		printk("Failed to read CSCON, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CNEC=24");
    	if (err)
    	{
    		printk("Failed to read CEREG, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CEREG=5");
    	if (err)
    	{
    		printk("Failed to read CEREG, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(1000);
    
    	err = nrf_modem_at_cmd(response, sizeof(response), "AT+CFUN=1");
    	if (err)
    	{
    		printk("Failed to read CEREG, err %d\n", err);
    		return 0;
    	}
    
    	printk("%s\n", response);
    	k_msleep(200000);
    
    	// err = nrf_modem_at_cmd(response, sizeof(response), "AT#XPING=\"8.8.8.8\",32,30000,4,1000");
    	// if (err)
    	// {
    	// 	printk("Failed to read XPING, err %d\n", err);
    	// }
    
    	// printk("%s\n", response);
    
    	while (true)
    	{
    		/* code */
    		k_msleep(10000);
    		err = nrf_modem_at_cmd(response, sizeof(response), "AT%%XMONITOR");
    		if (err)
    		{
    			printk("Failed to read CEREG, err %d\n", err);
    			return 0;
    		}
    
    		printk("%s\n", response);
    	}
    }
    

Children
No Data
Related