Today, location is everything. From asset trackers to smart meters, millions of devices rely on positioning, but GNSS modules aren’t always ideal. They’re relatively expensive, require large antennas, and need open sky to work reliably. For many IoT applications, especially indoors or in urban environments, precise GNSS isn’t necessary — and it’s often overkill.
That’s where cellular modules with Wi‑Fi scanning come in. What most people don’t realize is that you can get location without GNSS by combining Wi‑Fi access point data and LTE cell tower info, then submitting it to a cloud geolocation service.
In this project, I’ll show a simple demo using the Fibocom LE270 and the Google Geolocation API to get device location without any GNSS hardware. It’s a great starting point for anyone building low‑power, cost‑sensitive IoT solutions — and a practical alternative for indoor or urban deployments.
Even though I’m using the Fibocom LE270 for this demo, the same geolocation method works on any cellular module that supports Wi‑Fi scanning. The AT commands may differ between manufacturers, but the overall principle—scan nearby Wi‑Fi access points, format the results into JSON, and send them to the Google Geolocation API—remains exactly the same.
You can even use ESP32, which has built‑in Wi‑Fi scanning, to obtain location using the same approach.
#FibocomLE270 #FibocomLE200 #FibocomL610 #QuectelBG95 #QuectelBG77 #QuectelEC200U #SIMComA7670 #ESP32 #IoTLocation #WiFiPositioning #GoogleGeolocationAPI
Let’s explore how to unlock location without satellites.
Step 1: Hardware connectionConnect LE270-ADP board to PC using USB cable
Connect antenna cable to RF ANT port (Number 30 in above image).Inseart sim card to Sim slot 1 (Number 27)Set Power switch to VUSB side. (Number 2)Now LE270 board should turn on and ready to send AT commands.
Check device manager and you should see ports like below image.
if you do not see ports, please request USB drivers from Fibocom FAE and install in the system. If you can't contact Fibocom and get drivers, You can also use second USB port which is coming with USB to UART bridge so no need Fibocom drivers. Just PL2303 drivers are enough. You can download and install PL2303 drivers and communicate with module.
Open the serial monitor tool or any serial command tool you would like to use. Example: Putty
Now select the port called "at (COM X).Send "ATI" command to test the communication.
[14:17:33] > ATI // Get module identification information
[14:17:33] < ATI
[14:17:33] < Fibocom Wireless Inc.
[14:17:33] < LE270-EU
[14:17:33] < 12007.7000.00.05.37.04
[14:17:33] < V1.2
[14:17:33] < OKYou should see something like above response.
Step 2: Check the network registration and internet connectivity> AT+CREG? // Check cellular network registration status
< AT+CREG?
< +CREG: 0,1
< OK
> AT+COPS? // Query current network operator
< AT+COPS?
< +COPS: 0,0,"Telstra Mobile",7
< OK
//Initiate mobile data connection
> AT+MIPCALL=1
> AT+MIPCALL=1
< OK
< +MIPCALL: 100.106.71.63
//Query current status of data connection
> AT+MIPCALL?
> AT+MIPCALL?
< +MIPCALL: 1,100.106.71.63
< OKStep 3: Scan for Wi-Fi hotspots nearbyAT+GTWIFISCAN is the AT command used to scan Wi-Fi hotspots nearby.
the module performs a Wi‑Fi scan and reports all nearby access points.Each result includes:
- MAC address of the Wi‑Fi access point
- Signal strength (RSSI)
- SSID (hotspot name)
Example Output:
> AT+GTWIFISCAN
< OK
< +GTWIFISCAN:
< 2C:AB:33:D1:B2:20,-60,"",
< 04:17:B6:20:75:48,-87,"",
< 3C:78:95:23:FB:68,-91,"sezjayliam",
< 80:3F:5D:3C:DC:C7,-92,"WiFi-6155_EXT",
< 98:D8:63:0D:31:01,-95,"Solar-WiFi188W1639",
< END_GTWIFISCANThese Wi‑Fi scan details (MAC + RSSI + SSID) can be used as input for Wi‑Fi‑based geolocation services, allowing the device to estimate its physical location even without GNSS.
Step 4: Setup Google Geolocation APITo use Wi‑Fi–based positioning with the LE270, you need to enable the Google Geolocation API in your Google Cloud project. This API accepts Wi‑Fi MAC addresses and signal strengths (from AT+GTWIFISCAN) and returns the estimated latitude/longitude.
Below are the steps to set it up.
1. Create a Google Cloud Project
Go to the Google Cloud Console and create a new project.
This project will contain your API key and billing settings.
if you have to add billing info to your account, you will have to add a debit or credit card. However, Google provides $300 free credits which is way more than enough for this task.
Now you should see something like below screenshot.
Press Ctrl + O on this page, which will open dialog as below. Click on new project.
Give a name to the project and create the project.
Now project is created. Press Ctrl+O again and from the dialog box opened, select the newly created project.
Now new page will show you API key, copy and paste that key to a notepad. We need that later.
Now Geo location API is set.
4.Install Certificates on LE270 for HTTPS (Google Geolocation API)The cellular modules require you to install the SSL root certificates manually if you want to use HTTPS‑based APIs like Google Geolocation.Unlike a PC or phone, the module does not come with a built‑in CA trust store. This is common for any cellular module like Fibocom, Quectel, Simcom, Telit etc.
4.1 Get the correct Google CA certificateDownload the appropriate certificate from Google Trust Services:
- Visit Google’s official PKI repository:https://pki.goog/repository/
- Look for the GTS Root R1 certificate
- Download it in PEM format (usually named
GTS1O1.crtorGTS Root R1.pem) - right click on the.pem file downloaded, and open with notepad. You should see something like this.
-----BEGIN CERTIFICATE-----
xxxx
-----END CERTIFICATE-----Now right click on the.pem file and go to properties window and find out the size of certificate.
The size is 1911 bytes. This value is important as we should notify the size of certificate before we upload the certificate to module via AT commands.
4.2 Upload the CA certificate to modulelook at the steps below. first we send AT+GTSSLFILE? to check for any exiting certificate files.
Then we send AT+GTSSLFILE="CERTFILE", 1911 command to module. Here 1911 is the size of certificate file.
after sending this command, you should copy and paste your certificate file content to serial tool and send it. There is a timeout for this step so send the certificate file quickly.
//check for certificate files
> AT+GTSSLFILE?
> AT+GTSSLFILE?
< +GTSSLFILE: CERTFILE,0
< +GTSSLFILE: KEYFILE,0
< +GTSSLFILE: TRUSTFILE,0
< OK
//load certificate file downloaded from Google : athulassc google account
> AT+GTSSLFILE="CERTFILE",1911
> AT+GTSSLFILE="CERTFILE",1911
< >
//sending the certificate file
> -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo 27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT 6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ 0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm 2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c -----END CERTIFICATE-----
< OK
//check for certificate files
> AT+GTSSLFILE?
> AT+GTSSLFILE?
< +GTSSLFILE: CERTFILE,1
< +GTSSLFILE: KEYFILE,0
< +GTSSLFILE: TRUSTFILE,0
< OKNow you can see when we again check for exiting certificate files, it shows 1, which means certificate file is successfully added to module. Now module can establish HTTPS connections to google services.
Step 5: Get Location5.1 Setup HTTPS URL
Remember, in step 3 we did wifi scan, and saw the available wifi hotspots. Now we can send those values to google geo location api and get the location.
first the URL you send these data is this.
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR API KEYWhen you set up the Google Cloud project, you generated an API key. I asked you to save that key in a notepad because you must insert it into the Geolocation API URL to create your own unique request link.
This API key is what Google uses to authenticate your module’s HTTPS request. Without the key in the URL, Google will reject the connection.
5.2 Setup data in json format
Google Geolocation API requires the Wi‑Fi or cellular scan results to be sent in a specific JSON structure.This JSON must include an array of Wi‑Fi access points or cell tower information.
Below is the official JSON format for Wi‑Fi‑based geolocation.
{
"wifiAccessPoints": [
{
"macAddress": "2C:AB:33:D1:B2:20",
"signalStrength": -60,
"ssid": ""
},
{
"macAddress": "3C:78:95:23:FB:68",
"signalStrength": -91,
"ssid": "sezjayliam"
}
]
}Field descriptions
- macAddress – Wi‑Fi AP MAC address (from
AT+GTWIFISCAN) - signalStrength – RSSI in dBm (negative value)
- ssid – Optional; Google accepts it but does not require it
Wi-fi Scan AT command is AT+GTWIFISCAN
Below is the official JSON format for cell tower based geolocation.
{
"cellTowers": [
{
"cellId": 12345678,
"locationAreaCode": 12345,
"mobileCountryCode": 505,
"mobileNetworkCode": 02,
"signalStrength": -85
}
]
}Cell tower Scan AT command is AT+GTCCINFO?
> AT+GTCCINFO? // Get current cell information
< +GTCCINFO:
< LTE service cell:
< 1,4,505,01,3061,0818B021,C4C,81,7,100,0,127,127,34
< LTE neighbor cell:
< 2,4,505,01,3061,0818B00D,24C2,63,100,42,42,10
< 2,4,505,01,3061,0818B003,4FB,F6,75,35,35,10
< 2,4,505,01,3061,082D9615,1C2,168,50,29,29,18
< OKAfter you perform a Wi‑Fi scan or a cell‑tower scan on the module, copy the results exactly as the module prints them. Then convert those values into the required Google Geolocation API JSON structure shown above. This means taking each MAC address and RSSI (or each cell parameter) and placing them into the correct JSON fields so the API can process the location request.
5.3 Get the location
Yes! You are in the final step. Lets do the magic and get the location. Send following AT commands to module.
🌐 Activate PDP context to establish IP session
AT+MIPCALL=1🌐 Set the target URL or IP with port for the HTTP connection
AT+HTTPSET="URL","https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR API KEY HERE"🌐 change http content type to json
AT+HTTPSET="CONTYPE","application/json"📝 Prepare to upload of POST data, payload length is the value (waits for payload)
AT+HTTPDATA=135In last command, 135 means the size of JSON object. You should change your number according to your JSON object. Below is a example JSON object with exactly 135 bytes if you want to try quickly.
{"wifiAccessPoints":[{"macAddress":"ac:1f:09:02:3a:46","signalStrength":-92},{"macAddress":"34:bc:5e:9f:e8:83","signalStrength":-80}]}After sending the final AT+HTTPDATA command, you must paste your JSON object exactly as it is and send it to the module. The module will only accept and forward the JSON correctly if the byte length you provide matches the actual size of your JSON object.
If the length is wrong—even by a single byte—the module will:
- cut off part of your JSON, or
- include extra characters, or
- send corrupted data to Google
When this happens, Google cannot parse the JSON payload, and the Geolocation API will return an error or an invalid response.Providing the exact byte size ensures the JSON is transmitted correctly and the Google Geolocation API can process it properly.
🚀 Initiate the HTTP POST action with 30-second timeout
AT+HTTPACT=1,30Example output for successful response
> AT+HTTPACT=1,30
> AT+HTTPACT=1,30
< OK
< +HTTPS: 1
< +HTTPRES: 1,200,530📥 read back the HTTP response content
AT+HTTPREADExample response from Google Geo Location API
> AT+HTTPREAD
> AT+HTTPREAD
< OK
< +HTTPREAD: 530
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=UTF-8
< Vary: X-Origin
< Vary: Referer
< Date: Mon, 30 Mar 2026 05:57:49 GMT
< Server: scaffolding on HTTPServer2
< X-XSS-Protection: 0
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< Server-Timing: gfet4t7; dur=186
< Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
< Accept-Ranges: none
< Vary: Origin,Accept-Encoding
< Connection: close
< Transfer-Encoding: chunked
< {
< "location": {
< "lat": -38.0828042,
< "lng": 145.2934483
< },
< "accuracy": 60
< }You can see API respond with longitude, latitude and accuracy.
"location": {
"lat": -38.0828042,
"lng": 145.2934483
},
"accuracy": 60You can verify the results by creating Google map link like this. In below link, replace <lat> and <lng> with values.
https://www.google.com/maps?q=<lat>,<lng>Thank you for watching my Huckster project. If you’d like to connect or discuss anything further, feel free to reach out.






Comments