How to determine if NTN connected?

I'm working on an nRF9151 application that periodically sends small UDP packets (20-40 bytes) over both terrestrial LTE and satellite NTN networks. The device uses PSM between transmissions to conserve power.

Current approach for LTE:
Before each transmission, I call lte_lc_conn_eval_params_get() which:
- Wakes the modem from PSM
- Verifies the connection is active
- Provides signal quality metrics

This works perfectly and ensures we don't send data when not connected.

Problem with NTN:
The same approach fails on NTN with error -77 (AT command failure). The connection evaluation API appears to be LTE-specific and doesn't support NTN mode.

The challenge:
Since we're using UDP, send() always succeeds regardless of actual connection status. Without proper verification before transmission, we risk sending data into a black hole when the modem isn't actually registered to the satellite
network.

Questions:
1. What's the recommended approach for verifying NTN connection status before transmission?
2. Is there an NTN equivalent to lte_lc_conn_eval_params_get() that wakes the modem and verifies connectivity?
3. Will lte_lc_nw_reg_status_get() return fresh status from PSM, or is it cached?
4. Are there plans to support connection evaluation APIs for NTN similar to LTE?

Thanks in advance for any guidance!

Environment:
- Board: Custom with nRF9151
- NCS version: v3.1.1
- Modem firmware: mfw_nrf9151-ntn_0.5.1

- Network: Skylo NTN (Monogoto SIM)

  • > What's the recommended approach for verifying NTN connection status before transmission?

    Just to be clear, this approach already spends a lot of energy, I'm not sure, why this is considered to be preferred instead of just sending the UDP message.

    > Since we're using UDP, send() always succeeds regardless of actual connection status. 

    That's not my experience. It succeeds, when sending from sleep-mode. But if the modem isn't sleeping and not registered in the network it will fail.

    > Without proper verification before transmission, we risk sending data into a black hole when the modem isn't actually registered to the satellite
    network.

    If you send the UDP message in "sleeping mode", the mode considers to be registered, therefore the success (otherwise it would be required to block, maybe for several seconds). The message wakes up the modem, and the modem tries to switch to RRC active and transmits the message. In the (rare) case this fails, the modem will report the lost registration (+CEREG). Therefore wait for "RRC active" and then a few seconds to check, if the modem reports the lost registration. If it stay registered, the message is sent.

  • Thanks for the reply Achim.

    This makes sense, I will change my code to monitor for the lost registration after sending and "RRC active" as you suggested.

Related