Boron unsuccessful cellular despite 'good' signal values

Hi all,

My team and I have been using Particle Borons for a few years in order to communicate to the cloud in remote areas. Usually the signal strength and signal quality values are a good indicator of whether the boron is able to connect and publish to the cloud easily. Recently however, we’ve had two borons that have good signal but a lot of trouble connecting.

Our borons use the SARA-R410M-02B-01 modem with AT&T operator profile (LTE Cat M1). They try to connect once every 20 or 30 minutes. The connection process looks like this:

    Cellular.on();
    waitFor(Cellular.isOn, 10000);
    
    Cellular.connect();
    waitFor(Cellular.ready, 90000);
    
    Particle.connect();
    waitFor(Particle.connected, 180000);

For each connection attempt, I store information such as whether it was successful, how long the process took, what frequency band was used, which cellular tower it connected to, etc. (sample code below).

Here are some puzzling results (a blank column indicates failure, the number of seconds corresponds to how long it took to be successful):

'Bad' Results
          Time       |   Cellular   |  Particle   |     Signal    |            EARFCN        
                     |   connect    |  connect    |  strength     |                          
                     |              |             |      quality  |                          
2022-05-06T08:42:21  |              |             |               |  5035 (band=12, freq=700)
2022-05-06T08:22:21  |  41 seconds  |             |               |                          
2022-05-06T08:02:21  |              |             |               |  1125 (band=2, freq=1900)
2022-05-06T07:42:21  |              |             |               |                          
2022-05-06T07:22:21  |              |             |               |                          
2022-05-06T07:02:21  |              |             |               |                          
2022-05-06T06:42:21  |              |             |               |                          
2022-05-06T06:22:21  |              |             |               |                          
2022-05-06T06:02:21  |              |             |               |                          
2022-05-06T05:42:21  |              |             |               |                          
2022-05-06T05:22:21  |              |             |               |  1125 (band=2, freq=1900)
2022-05-06T05:02:21  |              |             |               |                          
2022-05-06T04:42:21  |  89 seconds  |             |               |                          
2022-05-06T04:22:21  |              |             |               |                          
2022-05-06T04:02:21  |  26 seconds  |  5 seconds  |   -103 / -12  |  1125 (band=2, freq=1900)
2022-05-06T03:42:21  |              |             |               |                          
2022-05-06T03:22:21  |              |             |               |                          
2022-05-06T03:02:21  |  62 seconds  |  5 seconds  |   -101 / -11  |  1125 (band=2, freq=1900)
2022-05-06T02:42:20  |              |             |               |                          
2022-05-06T02:22:20  |  62 seconds  |  5 seconds  |   -103 / -14  |  1125 (band=2, freq=1900)

As you can see, the signal is rather good, however the device has not been able to connect for almost 5 hours! Is there anything we can do to improve the connection process?

For comparison, normally, and even with worse signal numbers (about strength: -111 / quality: -13), the results would look like this:

'Normal' Results
          Time       |   Cellular   |  Particle   |     Signal    |            EARFCN        
                     |   connect    |  connect    |  strength     |                          
                     |              |             |      quality  |                          
2022-05-06T15:41:13  |  10 seconds  |  4 seconds  |    -92 / -11  |  5110 (band=12, freq=700)
2022-05-06T15:11:13  |  10 seconds  |  6 seconds  |    -93 / -12  |  5110 (band=12, freq=700)
2022-05-06T14:41:12  |  10 seconds  |  5 seconds  |    -94 / -12  |  5110 (band=12, freq=700)
2022-05-06T14:11:12  |  10 seconds  |  5 seconds  |    -94 / -11  |  5110 (band=12, freq=700)
2022-05-06T13:41:11  |  10 seconds  |  4 seconds  |    -96 / -11  |  5110 (band=12, freq=700)
2022-05-06T13:11:10  |  10 seconds  |  5 seconds  |    -96 / -12  |  5110 (band=12, freq=700)
2022-05-06T12:41:10  |  10 seconds  |  8 seconds  |    -97 / -14  |  5110 (band=12, freq=700)
2022-05-06T12:11:09  |  10 seconds  |  4 seconds  |    -97 / -13  |  5110 (band=12, freq=700)
2022-05-06T11:41:09  |   9 seconds  |  5 seconds  |    -97 / -12  |  5110 (band=12, freq=700)
2022-05-06T11:11:09  |  29 seconds  |  5 seconds  |    -97 / -13  |  5110 (band=12, freq=700)
2022-05-06T10:41:08  |   9 seconds  |  4 seconds  |    -97 / -11  |  5110 (band=12, freq=700)
2022-05-06T10:11:07  |   9 seconds  |  4 seconds  |    -97 / -12  |  5110 (band=12, freq=700)
2022-05-06T09:41:06  |  10 seconds  |  5 seconds  |    -96 / -12  |  5110 (band=12, freq=700)
2022-05-06T09:11:06  |  10 seconds  |  4 seconds  |    -96 / -11  |  5110 (band=12, freq=700)
2022-05-06T08:41:06  |   9 seconds  |  4 seconds  |    -96 / -11  |  5110 (band=12, freq=700)
2022-05-06T08:11:05  |  10 seconds  |  5 seconds  |    -96 / -11  |  5110 (band=12, freq=700)
2022-05-06T07:41:05  |   9 seconds  |  4 seconds  |    -96 / -11  |  5110 (band=12, freq=700)
2022-05-06T07:11:05  |   9 seconds  |  4 seconds  |    -96 / -12  |  5110 (band=12, freq=700)

This one is especially good but the point is they all eventually manage to connect once an hour at the very least.

We’re concerned it might have something to do with the modem not choosing the best frequency band, or some other similar reason, because the connection is perfect when it works. We’ve tried our luck with some AT commands, either with AT+UBANDMASK=… (to try each band one by one and compare), or AT+UCFSCAN=… (to scan for better bands). Both didn’t work, as the band mask seems to be ‘Locked’ according to the u-blox datasheet, and the scan didn’t respond either.

Has anyone managed to make these work for that modem and operator?

Furthermore, how come sometimes the cellular fails to connect (Cellular.ready() == false) but I can still retrieve the EARFCN?

Once Particle.connect() has finished or timed out, this is the code that I use to retrieve the cell id and EARFCN (thanks to @rickkas7):

Code
    CellularGlobalIdentity cgi = {0};
    cgi.size = sizeof(CellularGlobalIdentity);
    cgi.version = CGI_VERSION_LATEST;
    cellular_result_t result = cellular_global_identity(&cgi, NULL);
    if (result == SYSTEM_ERROR_NONE) {
        // Store cgi.cell_id,
        // cgi.mobile_country_code,
        // cgi.mobile_network_code,
        // cgi.location_area_code
    }

Using the CellularHelper library:

    CellularHelperUCGEDResponse ucgedResp;
    int result = ucgedResp.run();
    int bandNum, freq;
    String dummy;
    if (result == RESP_OK) {
        CellularHelper.getLTEBandInfo(ucgedResp.earfcn, bandNum, freq, dummy);
        // Store ucgedResp.earfcn,
        // bandNum,
        // freq
    }

Thanks in advance for the help!

Hi @BenjaminAW

Thanks for the information. Definitely you are on the right path.

I understand that you are an experienced user, I just like to share this guide with you: https://support.particle.io/hc/en-us/articles/360044518213-Cellular-Connectivity-Troubleshooting-Guide
As above, for the said cellular strength, it is viewable on the Console > Device Vitals.

Our modems have an algorithm which optimizes connectivity, in view of bands and frequency.

If you want to dig further, you can retrieve the Cloud Debug logs: Cloud Debug | Tools | Particle The instructions are also in the above link. These logs can reveal a lot about the in-situ connectivity issues.

If you like us to take another look, you can also log at ticket at support.particle.io with the Device IDs and Cloud Debug logs.