Connecting to multiple LTE carriers

  • I'm using Things Mobile, which uses multiple roaming carriers. In the US that includes AT&T (Cingular), T-Mobile, Sprint, and Verizon. I'm not specifying any particular band or carrier in my connection. But so far I've only seen connections to AT&T and (possibly 1 or 2 times out of hundreds) Sprint, when I know Verizon has a signal (as reported by the GPy with AT+COPS=?) sometimes twice as strong. Things Mobile does not use steering, so it will use the best available carrier. It's also interesting that AT+COPS=? fails most of the time, and occasionally I will see it return results, and when it does I see that at least Verizon and AT&T are available, usually with Verizon having a much higher signal strength. When AT+COPS=? succeeds and the GPy tries to connect (showing again signal strength I'd expect from Verizon and not AT&T) the modem never attaches. The watchdog timer eventually resets the device and it will connect on the next boot, always to AT&T.

    I have several questions:

    • Are any others seeing similar behavior, or have a way to automatically connect using multiple possible carriers?

    • What LTE initialization and connection code do you use? I'm using a combination of AT commands and LTE.attach(). i do not call LTE.init(). I found code snippets on this forum and used what seemed to work. Regardless of whether you're using multiple carriers, I'd like to see some "correct" code people are actually using in the field.

    • Are there special requirements for connecting to Verizon?

    • If automatic carrier selection like this is not possible out of the box, how would I go about accomplishing this?

    My connection code, shortened to just the AT commands and attach():


    Then in a while loop I show the result of AT+CSQ and wait for LTE.isattached() to return True.

  • @reidfo I've put more time than I would like into the lte here in oz too Steve. Stumbled across some bizarre current draws after modem reset in my battery powered application. On the upside I can now finish an lte connection & get into micropower deepsleep in 3s whereas the disconnect/detach sequence used to take more like 7s. These gems are hard won by those of us who go down these rabbit holes & I'd be happy to share on a wiki. I also think pycom HQ could post some material too, like exactly what lte.init() does for instance.

  • Per ThingsMobile site, in the US they only provide service with T-Mobile, Sprint and AT&T. Verizon is noticeably missing. I am in the same situation, where Verizon is only service available in the area I need to run the gateway.

  • @reidfo A "Known Config" list of working carrier setup details is already on my todo list as I agree Its a very good idea.

    Happy to take community vetted configs to as I sadly cant travel to every country with every available networks simcard despite my wishes :(

    pm them over if you have configs you'd like to share.

  • @reidfo It took me more time than I ever expected to get my prototype with GPY, set up with all the correct AT commands for LTE-M here in Oz so it will run consistently and repeatedly.. :-(

  • @stevo52 Thank you. I didn't show it, but I do a modem reset if lte.isattached() returns true on boot. I do have the Sequans manual and have been poring over it, but unfortunately I don't have the background to understand all of it. That's helped answer some of my questions.

    Can anyone post the connection commands they've used with Verizon, T-Mobile, and others? @Paul-Thornton I believe it's been suggested here before that there be a wiki-like repository of connection notes for various carriers. This would be very helpful.

  • @reidfo Have you got the SEQUANS Monarch Platform LR5.1.1.0 AT Commands Reference Manual? I found it invaluable when sorting out LTE AT command set for here in OZ. You might find a solution in there? With a lot of trial and error, I found connection to be much more stable and consistent if I reset the modem before trying the connect sequence. I also found that the CGDCONT register survives resets but other configuration info doesn't, so my code now sets the full config up every time a connection is made for reliable connections but that could be just an OZ issue..

    I keep my AT commands as a function in a config file (same with WLAN info), then call that function to return (as a tuple/list) the relevant carrier/WLAN info I want to use. I don't have the luxury of multiple carriers to choose from with LTE really, but for your situation I would try to get the list of available services returned as a tuple or list, then loop through all the services and find the best RSSI and try to connect to that - the AT commands for each carrier could then be looked up. Hope that makes sense.

Pycom on Twitter