C030-R412m: MQTT with CellularContext don't connects

Hi!

I have read some docs and example codes how to connect my target with MQTT. A simple example to make a HTTP request works fine now (like described here: C030-R412m: Cellular device program). But now I want to test a simple MQTT example. What I’m doing wrong? Here what I have done:

Setup

  • Mbed v5.15.6
  • Target C030-R412m
  • Libs
    • mbed-os 5.15.6
    • mbed-mqtt (master)

File mbed_app.json

{
    "target_overrides": {
        "*": {
            "nsapi.default-cellular-apn": null, // or defined APN
            "nsapi.default-cellular-plmn": null, // or defined PLMN
            "nsapi.default-cellular-sim-pin": null, // no pin configured
            "nsapi.default-cellular-username": null, // not required
            "nsapi.default-cellular-password": null, // not required
            "mbed-trace.enable": true,
            "cellular.debug-at": true,
            "cellular.use-apn-lookup": true,
            "lwip.ethernet-enabled": false
        },
        "UBLOX_C030_R412M": {
            "target.network-default-interface-type": "CELLULAR"
        }
    }
}

File main.cpp

#include "MQTTClientMbedOs.h"
#include "CellularContext.h"
#include "mbed.h"

const char* hostname = "test.mosquitto.org";
uint16_t port = 1883;
SocketAddress addr;

int main() {
    printf("MQTT test on %s", hostname);

    NetworkInterface *net = CellularContext::get_default_instance();
    net->set_default_parameters();

    while (true) {
        ThisThread::sleep_for(3000);
        if (net && net->get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
            break;
        } else {
            printf(".");
            fflush(stdout);
        }
    }
}

The target has attached USB and battery to have enough power.

Output on run

MQTT test on test.mosquitto.org...............................

So, endless tries to connect. Any help is very appreciated! :pensive:

Hello,

you can check the result (line 113) of net->get_connection_status() method.
But I not see any call of connect(...) method so that is probably the reason why the state of connection will never change.

BR, Jan

Hi Jan! Thx. Here a more correct code:

File mbed_app.json

{
    "target_overrides": {
        "*": {
            "platform.stdio-baud-rate": 115200,
            "mbed-trace.enable": true,
            "cellular.debug-at": true,
            "cellular.use-apn-lookup": true,
            "cellular.radio-access-technology": 8,
            "nsapi.default-cellular-apn": null,
            "nsapi.default-cellular-plmn": null,
            "nsapi.default-cellular-sim-pin": null,
            "nsapi.default-cellular-username": null,
            "nsapi.default-cellular-password": null,
            "lwip.ethernet-enabled": false,
            "lwip.ppp-enabled": true,
            "lwip.tcp-enabled": true,
            "lwip.ipv4-enabled": true,
            "ppp.ipv4-enabled": true,
            "lwip.ipv6-enabled": true,
            "ppp.ipv6-enabled": true
        },
        "UBLOX_C030_R412M": {
            "GENERIC_AT3GPP.provide-default": true,
            "GENERIC_AT3GPP.tx": "MDMTXD",
            "GENERIC_AT3GPP.rx": "MDMRXD",
            "target.network-default-interface-type": "CELLULAR"
        }
    }
}

File main.cpp

#include "MQTTClientMbedOs.h"
#include "NetworkInterface.h"
#include "cellular_demo_tracing.h"
#include "mbed.h"

#define RETRY_COUNT 10

const char* hostname = "test.mosquitto.org";
uint16_t port = 1883;
SocketAddress addr;
NetworkInterface *iface;

void print_function(const char *format, ...) {
    trace_mutex.lock();
    va_list arglist;
    va_start( arglist, format );
    vprintf(format, arglist);
    va_end( arglist );
    trace_mutex.unlock();
}

nsapi_error_t do_connect() {
    nsapi_error_t retcode = NSAPI_ERROR_OK;
    uint8_t retry_counter = 0;

    while (iface->get_connection_status() != NSAPI_STATUS_GLOBAL_UP) {
        retcode = iface->connect();
        if (retcode == NSAPI_ERROR_AUTH_FAILURE) {
            print_function("\n\nAuthentication Failure. Exiting application\n");
        } else if (retcode == NSAPI_ERROR_OK) {
            print_function("\n\nConnection Established.\n");
        } else if (retry_counter > RETRY_COUNT) {
            print_function("\n\nFatal connection failure: %d\n", retcode);
        } else {
            print_function("\n\nCouldn't connect: %d, will retry\n", retcode);
            retry_counter++;
            continue;
        }
        break;
    }
    return retcode;
}

int main() {
    trace_open();

    print_function("\n\nMQTT test on %s\n\n", hostname);

    iface = NetworkInterface::get_default_instance();
    MBED_ASSERT(iface);

    iface->set_default_parameters();
    nsapi_error_t retcode = NSAPI_ERROR_NO_CONNECTION;

    if (do_connect() == NSAPI_ERROR_OK) {
        print_function("\n\nConnected\n\n");
    }

    if (iface->disconnect() != NSAPI_ERROR_OK) {
        print_function("\n\n disconnect failed.\n\n");
    }

    if (retcode == NSAPI_ERROR_OK) {
        print_function("\n\nSuccess. Exiting \n\n");
    } else {
        print_function("\n\nFailure. Exiting \n\n");
    }

    trace_close();
}

This code output more details for debug. But it says:

[...][ERR ][CELL] Failed to activate network context! (-3004)

  1. Where can I set the URAT (Radio access technology) to 8 for e.g. NBIOT?
  2. Where can I set the MNO Profile?

I do not know about MNO but URAT you already have it

but according to this you probably need number 9 for NB1.

BR, Jan

1 Like

OK, changed to 9. Thx!

Do I need this?

{
    "target_overrides": {
        "UBLOX_C030_R412M": {
            ...
            "target.features_add": ["LWIP"] // <--
        }
    }
}

Now the targets starts and the output goes to part with AT+CGDCONT? and shows Vodafone APN with type IP but without IP address. After that:

...
[00024467ms][INFO][CELL]: AT RX (23): .0.0.0",0,0,0,0<cr><ln><cr><ln>OK<cr><ln>
[00024475ms][INFO][CELL]: Found PDP context 1
[00024480ms][INFO][CELL]: CellularContext PPP connect
[00024486ms][INFO][CELL]: AT TX (16): AT+CGDATA="PPP",
[00024492ms][INFO][CELL]: AT TX ( 1): 1
[00024497ms][INFO][CELL]: AT TX ( 1): <cr>
[00024503ms][INFO][CELL]: AT RX ( 5): <cr><ln>ERR
[00024508ms][INFO][CELL]: AT RX ( 4): OR<cr><ln>
[00024514ms][DBG ][CELL]: AT error -3012
[00024518ms][ERR ][CELL]: Failed to CONNECT
[00024523ms][DBG ][CELL]: SYNC do_connect failed with -3012, retry after 16 second

Do it have to do with PSM (power saving mode)? I have read it in this documentation (it has the same chip SARA-R412m) at paragraph Disable PSM and eDRX: Passthrough - SODAQ Support pages

Found this issue on Github: u-blox SARA-R412M with cellular PPP · Issue #10901 · ARMmbed/mbed-os · GitHub

This is strange, because mbed-os-5.15.6 has defined CGDATA to false here: https://github.com/ARMmbed/mbed-os/blob/1faaabb6fad9ce7a3b31553718f8acdb04330b40/features/cellular/framework/targets/UBLOX/AT/UBLOX_AT.cpp#L29

and UBX_MDM_SARA_R41XM is defined here: https://github.com/ARMmbed/mbed-os/blob/1faaabb6fad9ce7a3b31553718f8acdb04330b40/targets/targets.json#L5026

UPDATE

Found out that I need to set UBLOX_AT configs instead of GENERIC_AT3GPP in mbed_app.json.

File mbed_app.json:

{
    "target_overrides": {
        "*": {
            "mbed-trace.enable": true,
            "platform.stdio-baud-rate": 115200,
            "platform.stdio-convert-newlines": true,
            "cellular.debug-at": true,
            "cellular.clear-on-connect": true,
            "cellular.use-apn-lookup": true,
            "nsapi.default-cellular-apn": null,
            "nsapi.default-cellular-plmn": null,
            "nsapi.default-cellular-sim-pin": null,
            "nsapi.default-cellular-username": null,
            "nsapi.default-cellular-password": null,
            "lwip.ethernet-enabled": false,
            "lwip.ppp-enabled": false,
            "lwip.tcp-enabled": true,
            "lwip.ipv4-enabled": true,
            "lwip.ipv6-enabled": true,
            "ppp.ipv4-enabled": false,
            "ppp.ipv6-enabled": false
        },
        "UBLOX_C030_R412M": {
            "UBLOX_AT.provide-default": true,
            "UBLOX_AT.tx": "MDMTXD",
            "UBLOX_AT.rx": "MDMRXD",
            "UBLOX_AT.cts": "MDMCTS",
            "UBLOX_AT.rts": "MDMRTS",
            "target.network-default-interface-type": "CELLULAR"
        }
    }
}

File main.cpp:

#include "CellularContext.h"
#include "MQTTClientMbedOs.h"
#include "NetworkInterface.h"
#include "cellular_demo_tracing.h"
#include "mbed.h"

#define RETRY_COUNT 10

const char* hostname = "test.mosquitto.org";
uint16_t port = 1883;
NetworkInterface *iface;

void print_function(const char *format, ...) {
    trace_mutex.lock();
    va_list arglist;
    va_start( arglist, format );
    vprintf(format, arglist);
    va_end( arglist );
    trace_mutex.unlock();
}

nsapi_error_t do_connect() {
    nsapi_error_t retcode = NSAPI_ERROR_OK;
    uint8_t retry_counter = 0;

    while (iface->get_connection_status() != NSAPI_STATUS_GLOBAL_UP) {
        retcode = iface->connect();
        if (retcode == NSAPI_ERROR_AUTH_FAILURE) {
            print_function("\n\nAuthentication Failure. Exiting application\n");
        } else if (retcode == NSAPI_ERROR_OK) {
            print_function("\n\nConnection Established.\n");
        } else if (retry_counter > RETRY_COUNT) {
            print_function("\n\nFatal connection failure: %d\n", retcode);
        } else {
            print_function("\n\nCouldn't connect: %d, will retry\n", retcode);
            retry_counter++;
            continue;
        }
        break;
    }
    return retcode;
}

int main() {
    trace_open();

    print_function("\n\nMQTT test on %s\n\n", hostname);

    iface = CellularContext::get_default_instance();

    MBED_ASSERT(iface);

    iface->set_default_parameters();

    nsapi_error_t retcode = NSAPI_ERROR_NO_CONNECTION;

    if (do_connect() == NSAPI_ERROR_OK) {
        print_function("\n\nConnected\n\n");
    }

    if (iface->disconnect() != NSAPI_ERROR_OK) {
        print_function("\n\n disconnect failed.\n\n");
    }

    if (retcode == NSAPI_ERROR_OK) {
        print_function("\n\nSuccess. Exiting \n\n");
    } else {
        print_function("\n\nFailure. Exiting \n\n");
    }

    trace_close();
}

File cellular_demo_tracing.h

/*
 * Copyright (c) 2017 ARM Limited. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 * Licensed under the Apache License, Version 2.0 (the License); you may
 * not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "Kernel.h"
#include "mbed.h"
#include "CellularLog.h"
#include "chrono"

#ifndef CELLULAR_DEMO_TRACING_H_
#define CELLULAR_DEMO_TRACING_H_

#if MBED_CONF_MBED_TRACE_ENABLE
static PlatformMutex trace_mutex;

static void trace_wait()
{
    trace_mutex.lock();
}

static void trace_release()
{
    trace_mutex.unlock();
}

static char* trace_time(size_t ss)
{
    static char time_st[50];
    snprintf(time_st, 49, "[%08llums]", Kernel::get_ms_count());
    return time_st;
}

static void trace_open()
{
    mbed_trace_init();
    mbed_trace_prefix_function_set( &trace_time );

    mbed_trace_mutex_wait_function_set(trace_wait);
    mbed_trace_mutex_release_function_set(trace_release);

    mbed_cellular_trace::mutex_wait_function_set(trace_wait);
    mbed_cellular_trace::mutex_release_function_set(trace_release);

#ifdef MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN
    printf("\n\n[MAIN], plmn: %s\n", (MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN ? MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN : "NULL"));
#endif
}

static void trace_close()
{
    mbed_cellular_trace::mutex_wait_function_set(NULL);
    mbed_cellular_trace::mutex_release_function_set(NULL);

    mbed_trace_free();
}
#else
static void trace_open()
{
}

static void trace_close()
{
}
#endif // #if MBED_CONF_MBED_TRACE_ENABLE

#endif // CELLULAR_DEMO_TRACING_H_

Hello,

sorry for delay but anyway I am out of ideas for now, sorry.

BR, Jan

great