For anyone interested, here is how I got past this issue. My goal was to use the Nova modem in Raspberian Stretch to access Amazon IoT web services, preferably from a tier-1 carrier like AT&T or Verizon. My application code is written in Python 3.5, but Iâm not a Linux expert, and I have never dealt with AT modems, so be warned that there may well be better ways to do this!
First, here are some sites that helped:
https://help.hologram.io/hologram-iot-sim-card/advanced-troubleshooting/modem-sim-annotated-diagnostic-test
https://help.hologram.io/hologram-nova/troubleshooting/sending-at-commands-to-your-nova
https://www.u-blox.com/sites/default/files/SARA-R4-SARA-N4_ATCommands_(UBX-17003787)_0.pdf
https://www.reddit.com/r/homelab/comments/7gywld/backup_remote_site_connectivity_with_cheap_3g/
I had an AT&T SIM, and after searching online I found the APN for AT&T is ânxtgenphoneâ.
With the modem plugged in, executing âifconfigâ shows an interface at wwan0, but it is set to an unroutable IP:
Using âls /dev/tty*â to list the tty devices shows:

In my case there are 2 USB interfaces associated with the modem, ttyUSB0 and ttyUSB1 with ttyUSB1 as the active modem port.
If I open a Screen to that interface, I can run a few diagnostics on the modem. I found the Hologram diagnostic-test listed at the links above to be pretty useful.
screen /dev/ttyUSB1
Check that the port is working by typing âatâ:
at
OK
Now check the current APN setting:
at+cgdcont?
+CGDCONT: 1,"IP","hologram","0.0.0.0",0,0,0,0
On a new modem this will display âhologramâ as the APN and in my case it needed to be changed to ânxtgenphoneâ.
Type:
at+cgdcont=1,"IP","nxtgenphone","0.0.0.0",0,0
Verify that the APN has changed by querying again:
at+cgdcont?
+CGDCONT: 1,"IP","nxtgenphone","0.0.0.0",0,0,0,0
Now, reset the modem:
at+cfun=15
At this point the blue and red lights should both be on and solid, assuming you are inside the network coverage area.
Type:
at+cops=?
This might take a few seconds to reply. When it does, you should see your chosen network in the list, similar to below:
+cops: (1,"AT&T","AT&T","310410",8),(3,"313 100","313 100","313100",8),(1,"310 260","310 260","310260",9),(0,1,2,3,4),(0,1,2)
Now we need to save the APN in non-volatile memory. To do that type:
at+cpwroff
The modem will switch off for a short period and then back on. Now you can unplug the modem and plug it back in and it will always come back up on the new APN.
Now we need to setup PPPD. Clone the scripts from the Hologram Git repo and copy them into correct folders under /etc/ as shown here:
git clone GitHub - hologram-io/hologram-tools: The client-side tools you need to help build your next cellular-connected product
cd hologram-tools
sudo cp ppp/chatscripts/* /etc/chatscripts/
sudo cp ppp/peers/* /etc/ppp/peers/
In my case Iâm using the ânova-mâ scripts, and since I really wanted eth0 interface to be primary and the cell modem to be secondary, I edited /etc/ppp/peers/nova-m and commented out the section setting the interface to defaultroute:
Use this connection as the default route.
#defaultroute
I left /etc/chatscripts/nova-m untouched.
At this point, if I execute âifconfigâ I see the wwan0 interface, shown here:
When I execute âsudo pon nova-mâ, and then re-execute âifconfigâ, I see a new ppp0 interface:
In my case the ppp0 interface is connecting to the AT&T gateway at 10.64.64.64. If I ping a site using the interface, I can see that it works:

So, I know the interface works, but if I turn off eth0 and try to connect my Python app to Amazon AWS, it fails. I guess this is because my default gateway is on the 192 address, so traffic from my app always tries to go through 192.
If I inspect the routing table using âroute -nâ, I see this:

I can add a new route entry, and by setting the Metric value to a number just a bit higher than the eth0 metric, my ppp0 interface will take a lower priority. This allows the traffic to go out eth0 if eth0 is up, and ppp0 if it is down. Here is how I add the route:
sudo route add default gw 10.64.64.64 metric 203 ppp0
Iâm weak on networking, so some sysadmin might point out a better way to set this up, but this accomplishes my goal, and now my python app can communicate with AWS via the cell network.
Adding the route in this manner does not live between resets, so it needs to be added each time the Pi powers up. In my case, thatâs okay because I really donât want the cell modem turned on unless my app is on. I can control this when my app initializes by sending the appropriate commands via Pythonâs âsubprocessâ API.