nRF9161-DK SMS sample. message not receiving to controller on time

Hello all smart people.

Currently I am working with SMS sample and I want to toggle LED with pwm after receiving message, but I can not get sms on the "live" only after restart I see that message is received on terminal.

What did I wrong or how to get sms on controller live time?

Thank you, fizz drink on me

/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */
 
#include <stdio.h>
#include <zephyr/kernel.h>
#include <string.h>
#include <modem/sms.h>
#include <modem/nrf_modem_lib.h>
#include <modem/lte_lc.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/pwm.h>
 
static struct k_work sms_workk;
 
static const struct pwm_dt_spec pwm_led0 = PWM_DT_SPEC_GET(DT_ALIAS(pwm_led0));
 
/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS   2500
 
/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)
 
/*
 * A build error on this line means your board is unsupported.
 * See the sample documentation for information on how to fix this.
 */
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
 
 
static void sms_callback(struct sms_data *const data, void *context)
{
    if (data == NULL) {
        printk("%s with NULL data\n", __func__);
        return;
    }
 
    if (data->type == SMS_TYPE_DELIVER) {
        gpio_pin_toggle_dt(&led);//
        /* When SMS message is received, print information */
        struct sms_deliver_header *header = &data->header.deliver;
 
        printk("\nSMS received:\n");
        printk("\tTime:   %02d-%02d-%02d %02d:%02d:%02d\n",
            header->time.year,
            header->time.month,
            header->time.day,
            header->time.hour,
            header->time.minute,
            header->time.second);
 
        printk("\tText:   '%s'\n", data->payload);
        printk("\tLength: %d\n", data->payload_len);
 
        if (header->app_port.present) {
            printk("\tApplication port addressing scheme: dest_port=%d, src_port=%d\n",
                header->app_port.dest_port,
                header->app_port.src_port);
        }
        if (header->concatenated.present) {
            printk("\tConcatenated short message: ref_number=%d, msg %d/%d\n",
                header->concatenated.ref_number,
                header->concatenated.seq_number,
                header->concatenated.total_msgs);
        }
    } else if (data->type == SMS_TYPE_STATUS_REPORT) {
        printk("SMS status report received\n");
    } else {
        printk("SMS protocol message with unknown type received\n");
    }
}
 
int main(void)
{
    int handle = 0;
    int ret = 0;
    uint32_t period = 1000000U;
    uint32_t pulse_width = period/100*100;
    uint32_t dummy =0;
 
    printk("\nSMS sample starting\n");
 
    ret = nrf_modem_lib_init();
    if (ret) {
        printk("Modem library initialization failed, error: %d\n", ret);
        return 0;
    }
 
    ret = lte_lc_connect();
    if (ret) {
        printk("Lte_lc failed to initialize and connect, err %d", ret);
        return 0;
    }
 
    handle = sms_register_listener(sms_callback, NULL);
    if (handle) {
        printk("sms_register_listener returned err: %d\n", handle);
        return 0;
    }
 
    printk("SMS sample is ready for receiving messages\n");
 
    /* Sending is done to the phone number specified in the configuration,
     * or if it's left empty, an information text is printed.
     */
    if (strcmp(CONFIG_SMS_SEND_PHONE_NUMBER, "")) {
        printk("Sending SMS: number=%s, text=\"SMS sample: testing\"\n",
            CONFIG_SMS_SEND_PHONE_NUMBER);
        ret = sms_send_text(CONFIG_SMS_SEND_PHONE_NUMBER, "SMS sample: testing");
        if (ret) {
            printk("Sending SMS failed with error: %d\n", ret);
        }
    } else {
        printk("\nSMS sending is skipped but receiving will still work.\n"
            "If you wish to send SMS, please configure CONFIG_SMS_SEND_PHONE_NUMBER\n");
    }
 
    if (!gpio_is_ready_dt(&led)) {
        return 0;
    }
 
    ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
    if (ret < 0) {
        return 0;
    }
 
    /* if (!pwm_is_ready_dt(&pwm_led0)) {
        printk("Error: PWM device %s is not ready\n",
               pwm_led0.dev->name);
        return 0;
    }  
 
    ret = pwm_set_dt(&pwm_led0, period, pulse_width);
    if (ret) {
        printk("Error %d: failed to set pulse width\n", ret);
        return 0;
    } */
 
    for(;;)
    {      
        //ret = pwm_set_pulse_dt(&pwm_led0, pulse_width);
        k_msleep(SLEEP_TIME_MS);
        dummy++;
    }
 
    /* In our application, we should unregister SMS in some conditions with:
     *   sms_unregister_listener(handle);
     * However, this sample will continue to be registered for
     * received SMS messages and they can be seen in serial port log.
     */
    return 0;
}

Parents Reply Children
  • How long do you wait until you reset the device?

    Towards the end of both logs I can see the device reveices some pages from the network, but none of them are for the device. So to me, it looks like the problem is somewhere in the network.

  • from a minute to 10. Does not seem to be the network as the modem seems to be receiving at the right time but the callback is only triggered after device reset (this is my conclusion after debugging and checking the "received" time):

    In the above screenshot I sent sms to initialized device at 10:13, callback was not triggered.

    I waited for 5 mins, and at 10:18 I reset the device. Callback was triggered and gave the above result.

    I checked with a debugger, MCU was not crashed, operated normally. As you mentioned, PSM is not enabled. Any other ideas?

  • As I said, I couldn't see any incoming pages for the device from the network, so to me, it looks like the network doesn't forward the SMSes other than immediately after the attach.

    Also, I noticed that you are using a pre-release version of the modem FW. Just to be sure, could you try to upgrade to mfw v2.0.1?

  • I upgraded the modem FW. Situation did not change. After some additional testing / debugging I conclude that indeed the network provider does not forward the SMSes reliably. I need to provide a demo to the customer showcasing remote control of the device. I saw that there are no examples with nRF Cloud and this SMS does not work for me as mentioned above. Do you have any other examples which could be useful to me?

Related