Re: Tutorial: Query the Apple database with Python for your access point BSSID

Dec 18, 2025 Last reply: 6 months ago 7 Replies

Marian snipped-for-privacy@helpfulpeople.com posted both:



> Longitude: -93.81759643000001

...



> Longitude: -93.81759643000001

and:



Does anyone have any idea why the highly insecure Apple WPS database
> contains GPS entries to this illogically numerous set of decimal places?

Probably just the result of a 64-bit (double) floating point calculation that they didn't bother to round off. -WBE

It could be a closest-representable-number problem.

You should really code a thing like this up. Use the GMP library to do the multiply of mantissa and exponent part. I've only used this once, and not for floats. You can code for C or C++ and doing it in C++ is slower (for the temporary copies of numbers the code makes, and when there are a lot of digits in play). The C++ code is easier to read (unlike the C you write in that case).

formatting link
You're right, that the double looks like a reasonable candidate to contributing to the problem. Just need a better calculator to see how close it is to an exact representation.

formatting link

-93.81759643

Single Mantissa ExponentContribution

0xc2bba29b 1.465899825 0961304 64 ? 0xc2bba29c 1.465899944 30542 64 ? 0xc2bba29d 1.465900063 5147095 64 ?

Double Mantissa ExpC

0xc05774537ffa0b48 1.465899944 2187497 64 -93.81759642999998 0xc05774537ffa0b49 1.465899944 21875 64 -93.81759643000000 <==== need more careful conversion 0xc05774537ffa0b4a 1.465899944 2187501 64 -93.81759643000001

1.4658998250961304 * 64 = \

1.46589994430542 * 64 = \___ Need a calc that takes that many digits 1.4659000635147095 * 64 = / to verify the single precision representation "?" My Microsoft "calc" gives "Invalid Input".

*******

It's sloppy workmanship :-) We knew that much before investigating. If your input numbers coming from somewhere are eight digits after the decimal, then the tool output should also be eight digits or so. Printing that many extra digits is silly, as the database collecting these numbers, isn't "doing math" on them. It is just storing a GPS coord as reported (from NMEA message) and puking it back out on demand.

Paul

Thanks Paul and Winston for taking a look at the precision of the GPS data stored in the Apple WPS database.

I thought I had responded to this where I will always openly admit when I don't understand anything, so I will say I have no idea WHY Apple stores the integer GPS values to the number of integer precision that they do.

I can only add the value that I modified the FOSS scripts so that they report both the original machine-readable GPS coordinates and my human-readable conversion since decimal GPS coordinates are what we use.

These are actual values output when I input the first BSSID below: column 1 = the BSSID column 2 = the integer latitude stored in the Apple WPS database column 3 = the integer longitude stored in the Apple WPS database columns 4 & 5 = a conversion of integer to decimal for GPS display tools

00:18:f8:c1:4a:65 3245990371 -9381384277 32.459904 -93.813843 02:aa:a0:e3:5f:38 3245890808 -9381494903 32.458908 -93.814949 44:1c:12:99:23:58 3245909881 -9381492614 32.459099 -93.814926 44:1c:12:99:23:5b 3245910644 -9381491088 32.459106 -93.814911 44:1c:12:99:23:5d 3245910644 -9381491851 32.459106 -93.814919 44:1c:12:99:23:5e 3245911026 -9381491088 32.459110 -93.814911 06:aa:a0:e3:5f:38 3245891952 -9381494903 32.458920 -93.814949 72:13:01:01:99:9a 3245920944 -9381445312 32.459209 -93.814453 72:13:01:01:99:9d 3245919036 -9381446838 32.459190 -93.814468 ec:aa:a0:e3:5f:38 3245891571 -9381494140 32.458916 -93.814941 fa:aa:a0:e3:5f:38 3245891571 -9381493377 32.458916 -93.814934 12:36:aa:7d:3d:b1 3245915603 -9381276702 32.459156 -93.812767 12:36:aa:7d:3d:b2 3245915222 -9381278228 32.459152 -93.812782 12:36:aa:7d:3d:b6 3245914840 -9381275177 32.459148 -93.812752 12:36:aa:c2:2c:01 3245956802 -9381256103 32.459568 -93.812561 12:59:32:64:b2:bc 3245960617 -9381244659 32.459606 -93.812447 14:c0:3e:38:ef:36 3245923614 -9381269073 32.459236 -93.812691 16:c0:3e:38:ef:36 3245925140 -9381269836 32.459251 -93.812698 1a:c0:3e:38:ef:36 3245925140 -9381269073 32.459251 -93.812691 02:aa:a0:79:a6:b8 3245920181 -9381246185 32.459202 -93.812462 38:17:b1:28:28:46 3245931625 -9381245422 32.459316 -93.812454 40:48:6e:f1:9f:34 3245958328 -9381306457 32.459583 -93.813065 42:17:b1:28:28:46 3245932388 -9381243133 32.459324 -93.812431 46:d8:78:a3:03:a3 3245965576 -9381226348 32.459656 -93.812263 5c:b0:66:13:26:c1 3245907974 -9381227874 32.459080 -93.812279 5e:b0:66:13:26:c1 3245907592 -9381227111 32.459076 -93.812271 06:aa:a0:79:a6:b8 3245920181 -9381246185 32.459202 -93.812462 72:13:01:46:3c:c1 3245978546 -9381228637 32.459785 -93.812286 72:13:01:46:3c:c6 3245979690 -9381228637 32.459797 -93.812286 7e:b0:66:13:26:c1 3245907211 -9381227874 32.459072 -93.812279 88:ad:43:48:4a:a8 3245934295 -9381259918 32.459343 -93.812599 8c:76:3f:b7:b7:97 3245985412 -9381255340 32.459854 -93.812553 8e:76:3f:b7:b7:97 3245984649 -9381256103 32.459846 -93.812561 96:76:3f:b7:b7:97 3245984649 -9381255340 32.459846 -93.812553 98:52:4a:86:fa:4c 3245908737 -9381267547 32.459087 -93.812675 98:52:4a:86:fa:4f 3245908355 -9381267547 32.459084 -93.812675 98:52:4a:86:fa:51 3245908355 -9381267547 32.459084 -93.812675 98:52:4a:86:fa:52 3245908737 -9381268310 32.459087 -93.812683 9e:ad:43:48:4a:a8 3245934677 -9381259918 32.459347 -93.812599 9e:b0:66:13:26:c1 3245907211 -9381227874 32.459072 -93.812279 ac:91:9b:c6:7d:d2 3245978927 -9381267547 32.459789 -93.812675 b2:4f:b8:7f:cb:83 3245938873 -9381260681 32.459389 -93.812607 ce:6c:6d:83:12:4d 3245933151 -9381253051 32.459332 -93.812531 d4:6c:6d:83:12:4d 3245931243 -9381252288 32.459312 -93.812523 d6:6c:6d:83:12:4d 3245933914 -9381251525 32.459339 -93.812515 da:13:99:28:92:b0 3245917510 -9381269836 32.459175 -93.812698 e8:97:b8:8e:5d:0a 3245927047 -9381250000 32.459270 -93.812500 0e:c0:3e:38:ef:36 3245924758 -9381269073 32.459248 -93.812691 ec:aa:a0:79:a6:b8 3245919418 -9381246185 32.459194 -93.812462 f4:0e:83:d7:fb:68 3245946121 -9381263732 32.459461 -93.812637 fa:aa:a0:79:a6:b8 3245920181 -9381246185 32.459202 -93.812462 fc:ae:34:94:57:f0 3245948028 -9381231689 32.459480 -93.812317 fe:ae:34:94:57:f1 3245947265 -9381232452 32.459473 -93.812325 00:71:c2:b2:32:68 3245960998 -9381239318 32.459610 -93.812393 16:71:c2:b2:32:68 3245961761 -9381238555 32.459618 -93.812386 1a:71:c2:b2:32:68 3245961761 -9381238555 32.459618 -93.812386 10:93:97:0a:e7:80 3245982742 -9381553649 32.459827 -93.815536 12:36:aa:62:9c:39 3245925140 -9381566619 32.459251 -93.815666 12:36:aa:62:9c:3a 3245926284 -9381568908 32.459263 -93.815689 12:36:aa:62:9c:3d 3245923614 -9381565856 32.459236 -93.815659 12:36:aa:62:9c:3e 3245925521 -9381567382 32.459255 -93.815674 12:36:aa:85:84:c9 3245957183 -9381577301 32.459572 -93.815773 18:9c:27:b6:4b:8a 3245976257 -9381594085 32.459763 -93.815941 02:cb:7a:c2:d1:42 3245947265 -9381558227 32.459473 -93.815582 02:cb:7a:c2:d1:43 3245948028 -9381558227 32.459480 -93.815582 02:cb:7a:c2:d1:45 3245947265 -9381559753 32.459473 -93.815598 36:e6:e6:86:cd:1c 3245981216 -9381570434 32.459812 -93.815704 3a:9c:27:b6:4b:8a 3245977020 -9381596374 32.459770 -93.815964 5a:9c:27:b6:4b:8a 3245976257 -9381596374 32.459763 -93.815964 8c:85:80:e4:35:dd 3245977783 -9381558990 32.459778 -93.815590 8c:0f:6f:21:c8:80 3245982742 -9381554412 32.459827 -93.815544 8c:0f:6f:d3:3b:68 3245903778 -9381518554 32.459038 -93.815186 8e:76:3f:d4:13:8d 3245978164 -9381594085 32.459782 -93.815941 94:a6:7e:31:02:35 3245890045 -9381510162 32.458900 -93.815102 9a:0f:6f:21:c8:80 3245982742 -9381554412 32.459827 -93.815544 9a:0f:6f:d3:3b:68 3245905303 -9381518554 32.459053 -93.815186 a2:0f:6f:21:c8:80 3245982360 -9381554412 32.459824 -93.815544 a2:0f:6f:d3:3b:68 3245904541 -9381518554 32.459045 -93.815186 a6:0f:6f:21:c8:80 3245983123 -9381557464 32.459831 -93.815575 a6:0f:6f:d3:3b:68 3245905685 -9381520080 32.459057 -93.815201 be:61:e9:cd:aa:a8 3245882415 -9381622314 32.458824 -93.816223 ca:3a:6b:db:9b:ba 3245902252 -9381513977 32.459023 -93.815140 ce:6c:6d:53:02:e5 3245964050 -9381594848 32.459640 -93.815948 d4:6c:6d:53:02:e5 3245963287 -9381592559 32.459633 -93.815926 d6:6c:6d:53:02:e5 3245962142 -9381593322 32.459621 -93.815933 da:e3:5e:f7:08:87 3245980834 -9381555938 32.459808 -93.815559 f8:aa:3f:fe:b2:1e 3245905303 -9381512451 32.459053 -93.815125 4e:6b:b8:aa:8c:80 3245885086 -9381540679 32.458851 -93.815407 78:b2:13:e7:91:39 3245882797 -9381607055 32.458828 -93.816071 9e:b3:f7:21:91:e7 3245910263 -9381617736 32.459103 -93.816177 ce:8b:66:31:a1:df 3245933151 -9381556701 32.459332 -93.815567 80:30:dc:c2:05:26 3245886993 -9381635284 32.458870 -93.816353 6e:29:90:f7:23:74 3245903396 -9381517791 32.459034 -93.815178 0c:73:29:ff:29:93 3245893096 -9381542968 32.458931 -93.815430 7e:27:bc:95:f5:35 3245974349 -9381566619 32.459743 -93.815666 00:cb:7a:d0:d1:42 3245967102 -9381575775 32.459671 -93.815758 00:cb:7a:d0:d1:47 3245966720 -9381576538 32.459667 -93.815765 2c:7e:81:ab:cd:1b 3245813751 -9381472778 32.458138 -93.814728 2c:fb:0f:0f:66:06 3245831298 -9381491851 32.458313 -93.814919 36:fb:0f:0f:66:06 3245833969 -9381491088 32.458340 -93.814911 4e:7e:81:ab:cd:1b 3245811080 -9381472778 32.458111 -93.814728 6e:7e:81:ab:cd:1b 3245812988 -9381472778 32.458130 -93.814728 84:00:2d:41:9a:38 3245840454 -9381491088 32.458405 -93.814911 88:6a:e3:e0:51:c4 3245843887 -9381491088 32.458439 -93.814911 92:00:2d:41:9a:38 3245839691 -9381491088 32.458397 -93.814911 9a:00:2d:41:9a:38 3245840454 -9381491088 32.458405 -93.814911 9a:9d:5d:df:f0:6a 3245788955 -9381491851 32.457890 -93.814919 9e:00:2d:41:9a:38 3245840072 -9381491088 32.458401 -93.814911 be:8c:cd:2f:95:16 3245823669 -9381494903 32.458237 -93.814949 c2:18:03:fb:7c:5e 3245796585 -9381478118 32.457966 -93.814781 0c:83:cc:c6:58:4f 3245823669 -9381491851 32.458237 -93.814919 ce:3f:cb:da:f6:1b 3245833587 -9381475830 32.458336 -93.814758 ce:ab:82:cf:55:98 3245824432 -9381491088 32.458244 -93.814911 d4:3f:cb:da:f6:1b 3245833206 -9381475067 32.458332 -93.814751 d4:ab:82:cf:55:98 3245824432 -9381491088 32.458244 -93.814911 d6:3f:cb:da:f6:1b 3245833969 -9381475067 32.458340 -93.814751 d6:ab:82:cf:55:98 3245823669 -9381490325 32.458237 -93.814903 da:3f:cb:da:f6:1b 3245833587 -9381475067 32.458336 -93.814751 da:ab:82:cf:55:98 3245823669 -9381491088 32.458237 -93.814911 0e:fe:7b:7e:0e:29 3245786666 -9381475830 32.457867 -93.814758 f8:aa:3f:fe:b2:3b 3245837783 -9381485748 32.458378 -93.814857 42:9e:9d:73:67:ef 3245817947 -9381486511 32.458179 -93.814865 6e:57:25:f3:7c:e5 3245834732 -9381487274 32.458347 -93.814873 9e:73:b1:ef:ad:77 3245817184 -9381499481 32.458172 -93.814995 1c:56:8e:0b:3b:34 3246085739 -9381424713 32.460857 -93.814247 24:de:8a:10:6e:a4 3246070098 -9381474304 32.460701 -93.814743 24:de:8a:60:04:14 3246067428 -9381462860 32.460674 -93.814629 48:e2:ad:ad:39:f4 3246047592 -9381441497 32.460476 -93.814415 54:2b:57:35:d6:c5 3246046829 -9381445312 32.460468 -93.814453 54:b2:03:53:16:68 3246035766 -9381394195 32.460358 -93.813942 56:2b:57:2f:ff:cf 3246062088 -9381448364 32.460621 -93.814484 62:b2:03:53:16:68 3246036911 -9381393432 32.460369 -93.813934 6a:b2:03:53:16:68 3246036911 -9381393432 32.460369 -93.813934 6e:b2:03:53:16:68 3246028518 -9381393432 32.460285 -93.813934 82:da:c2:2d:1f:12 3246070861 -9381422424 32.460709 -93.814224 82:da:c2:2d:1f:15 3246070480 -9381422424 32.460705 -93.814224 c0:94:35:dc:33:1a 3246071624 -9381478881 32.460716 -93.814789 ce:94:35:dc:33:1a 3246070861 -9381479644 32.460709 -93.814796 d6:94:35:dc:33:1a 3246070861 -9381478881 32.460709 -93.814789 28:c2:dd:dc:c9:b8 3246021270 -9381389617 32.460213 -93.813896 30:13:8b:2b:28:10 3246051025 -9381438446 32.460510 -93.814384 8c:0f:6f:18:7c:00 3246034240 -9381385803 32.460342 -93.813858 9a:0f:6f:18:7c:00 3246034622 -9381387329 32.460346 -93.813873 a2:0f:6f:18:7c:00 3246035003 -9381387329 32.460350 -93.813873 a6:0f:6f:18:7c:00 3246034622 -9381386566 32.460346 -93.813866 2a:ad:18:fc:8b:1f 3246102142 -9381381988 32.461021 -93.813820 3a:e7:c0:83:c1:a7 3246105575 -9381404876 32.461056 -93.814049 c6:98:5c:db:c2:43 3246094512 -9381495666 32.460945 -93.814957 etc.

The question mainly is WHY Apple stores them to the number of integers that they do, where all I can do is convert the integer values to human-readable decimal coordinates.

If you look at the original data you posted a few articles back, you might notice that the number of significant digits in the Lat/Long numbers vary widely for each BSSID. That implies that the number is coming from the GPS receiver and is probably not "processed" prior to be being logged. The entries with fairly few significant figures is probably an old GPS who's designers were only confident in a few digits precision. The longer entries could easily be the output of an RTK differential GPS system capable of millimeter accuracy. A way to verify this is to write a program that grabs the first half of the BSSID and searches various OUI databases for the name of the manufacturer. Something like this: "Wi-Fi Vendor - Detect vendor of a Wi-Fi access point with just your iPhone or iPad"

formatting link

I'll try it. BSSID: 84:eb:3e:f8:36:d3 Latitude: 32.45880508 Longitude: -93.81717681 Plugging the BSSID into:

formatting link

formatting link
I get: Vivint Smart Home 84:eb:3e:00:00:00/24

Here's a longer Lat: BSSID: bc:9b:68:7e:15:c3 Latitude: 32.459438320000004 Longitude: -93.817276

formatting link
I get: Vantiva USA LLC bc:9b:68:00:00:00/24

I can't determine if either company has a reason to have a longer Lat/Long. However, notice the number of digits in the Lat, which are mostly zeros, except for the last digit: Latitude: 32.459438320000004 I don't know what they're doing, but it looks like they're using the Latitude to store some kind of data or ID. There are several other entries in the data that show a similar pattern of 8 places to the right of the decimal point for useful data followed by 6 zeros and 1 numeric digit.

This should be useful: "Accuracy of Decimal Places in Latitude and Longitude Degrees"

formatting link

8 decimal places is 1.11mm resolution which is probably the limit of GPS resolution (not sure).

Anyway, good luck with whatever you're doing.

Thanks Jeff. We're neighbors in the Santa Cruz Mountains, by the way.

You've taught me a lot over the years, one item of which is that most consumer routers (e.g., those with Broadcom chipsets) can't change the outward facing BSSID (although some professional routers certainly can).

I have plenty of old Surfnet, Etheric, Hilltop & Ridge equipment, that I repurpose them as access points even though they're designed for CPE use.

formatting link
formatting link
formatting link

Loren and Mike, in particular, and sometimes Andrea Lovelady at Surnet, give me all their old transceivers which I repurpose as access points (although much of the old surfnet stuff is licensed Mikrotick stuff).

I'm well aware you're an old hand at UNDERSTANDING what WISPs can do! So I appreciate that you looked up the brand of each of the strange ones.

My main goal here is simply to UNDERSTAND how Apple's WPS database is completely different than everyone else's, where I'm in discussions with Brian Krebs and the Mozilla research team (Dan Veditz) so I'm aware how the morally responsible companies handle hidden SSIDs.

Fundamentally, the results from Apple's RADAR bug report is that following Apple's public legally binding privacy policy will NOT work.

You have to know the super-secret trick to stay out of Apple's WPS database, and even then, that trick puts you into every other one.

Yes. You of all people understand the catch 22 that Apple puts us in.

My main goal is simply to get Apple to do the morally right, ethically correct, and legally defensible thing - which I have so far failed at.

But I rarely fail for long as you can note by the PG&E lines NOT failing anymore as PG&E has to call a conference3 with me for an hour EVERY SINGLE TIME the power goes out (as per my CPUC complaint resolution).

So I rarely fail. But so far, I'm failing to get Apple to do the right thing. Even though I'm communicating at the highest (VP) level at Apple.

However, time (and effort) will tell. Then I will be successful.

And that will preserve the privacy of hundreds of millions of homes. Which is what drives me after all.

These are from loss of precision in the storing of floating-point numbers in python. They aren't real. The source data will not include all the zeros.

The precision is a red herring, in my opinion, since the fact that you can't get out of the Apple WPS database even though you followed all of Apple's legally binding published policies is the main privacy issue.

Apple's decision is legally, morally & ethically reprehensible, so I will start working on getting Apple to change their decision any way that I can.

However, to the point of the raw precision in the Apple WPS database, I've modified the open source Apple bssid locator tools to report raw integer values in addition to conversion to the human-readable GPS coordinates.

Here are raw/converted values for the bssid lookup on the access point located near 4302 Josey Cir, Shreveport, LA 71109 (as a random AP lookup).

00:18:f8:c1:4a:65 3245990371 -9381384277 32.459904 -93.813843 02:aa:a0:e3:5f:38 3245890808 -9381494903 32.458908 -93.814949 44:1c:12:99:23:58 3245909881 -9381492614 32.459099 -93.814926 44:1c:12:99:23:5b 3245910644 -9381491088 32.459106 -93.814911 44:1c:12:99:23:5d 3245910644 -9381491851 32.459106 -93.814919 44:1c:12:99:23:5e 3245911026 -9381491088 32.459110 -93.814911 06:aa:a0:e3:5f:38 3245891952 -9381494903 32.458920 -93.814949 72:13:01:01:99:9a 3245920944 -9381445312 32.459209 -93.814453 72:13:01:01:99:9d 3245919036 -9381446838 32.459190 -93.814468 ec:aa:a0:e3:5f:38 3245891571 -9381494140 32.458916 -93.814941 fa:aa:a0:e3:5f:38 3245891571 -9381493377 32.458916 -93.814934 12:36:aa:7d:3d:b1 3245915603 -9381276702 32.459156 -93.812767 12:36:aa:7d:3d:b2 3245915222 -9381278228 32.459152 -93.812782 12:36:aa:7d:3d:b6 3245914840 -9381275177 32.459148 -93.812752 12:36:aa:c2:2c:01 3245956802 -9381256103 32.459568 -93.812561 12:59:32:64:b2:bc 3245960617 -9381244659 32.459606 -93.812447 14:c0:3e:38:ef:36 3245923614 -9381269073 32.459236 -93.812691 16:c0:3e:38:ef:36 3245925140 -9381269836 32.459251 -93.812698 1a:c0:3e:38:ef:36 3245925140 -9381269073 32.459251 -93.812691 02:aa:a0:79:a6:b8 3245920181 -9381246185 32.459202 -93.812462 38:17:b1:28:28:46 3245931625 -9381245422 32.459316 -93.812454 40:48:6e:f1:9f:34 3245958328 -9381306457 32.459583 -93.813065 42:17:b1:28:28:46 3245932388 -9381243133 32.459324 -93.812431 46:d8:78:a3:03:a3 3245965576 -9381226348 32.459656 -93.812263 5c:b0:66:13:26:c1 3245907974 -9381227874 32.459080 -93.812279 5e:b0:66:13:26:c1 3245907592 -9381227111 32.459076 -93.812271 06:aa:a0:79:a6:b8 3245920181 -9381246185 32.459202 -93.812462 72:13:01:46:3c:c1 3245978546 -9381228637 32.459785 -93.812286 72:13:01:46:3c:c6 3245979690 -9381228637 32.459797 -93.812286 7e:b0:66:13:26:c1 3245907211 -9381227874 32.459072 -93.812279 88:ad:43:48:4a:a8 3245934295 -9381259918 32.459343 -93.812599 8c:76:3f:b7:b7:97 3245985412 -9381255340 32.459854 -93.812553 8e:76:3f:b7:b7:97 3245984649 -9381256103 32.459846 -93.812561 96:76:3f:b7:b7:97 3245984649 -9381255340 32.459846 -93.812553 98:52:4a:86:fa:4c 3245908737 -9381267547 32.459087 -93.812675 98:52:4a:86:fa:4f 3245908355 -9381267547 32.459084 -93.812675 98:52:4a:86:fa:51 3245908355 -9381267547 32.459084 -93.812675 98:52:4a:86:fa:52 3245908737 -9381268310 32.459087 -93.812683 9e:ad:43:48:4a:a8 3245934677 -9381259918 32.459347 -93.812599 9e:b0:66:13:26:c1 3245907211 -9381227874 32.459072 -93.812279 ac:91:9b:c6:7d:d2 3245978927 -9381267547 32.459789 -93.812675 b2:4f:b8:7f:cb:83 3245938873 -9381260681 32.459389 -93.812607 ce:6c:6d:83:12:4d 3245933151 -9381253051 32.459332 -93.812531 d4:6c:6d:83:12:4d 3245931243 -9381252288 32.459312 -93.812523 d6:6c:6d:83:12:4d 3245933914 -9381251525 32.459339 -93.812515 da:13:99:28:92:b0 3245917510 -9381269836 32.459175 -93.812698 e8:97:b8:8e:5d:0a 3245927047 -9381250000 32.459270 -93.812500 0e:c0:3e:38:ef:36 3245924758 -9381269073 32.459248 -93.812691 ec:aa:a0:79:a6:b8 3245919418 -9381246185 32.459194 -93.812462 f4:0e:83:d7:fb:68 3245946121 -9381263732 32.459461 -93.812637 fa:aa:a0:79:a6:b8 3245920181 -9381246185 32.459202 -93.812462 fc:ae:34:94:57:f0 3245948028 -9381231689 32.459480 -93.812317 fe:ae:34:94:57:f1 3245947265 -9381232452 32.459473 -93.812325 00:71:c2:b2:32:68 3245960998 -9381239318 32.459610 -93.812393 16:71:c2:b2:32:68 3245961761 -9381238555 32.459618 -93.812386 1a:71:c2:b2:32:68 3245961761 -9381238555 32.459618 -93.812386 10:93:97:0a:e7:80 3245982742 -9381553649 32.459827 -93.815536 12:36:aa:62:9c:39 3245925140 -9381566619 32.459251 -93.815666 12:36:aa:62:9c:3a 3245926284 -9381568908 32.459263 -93.815689 12:36:aa:62:9c:3d 3245923614 -9381565856 32.459236 -93.815659 12:36:aa:62:9c:3e 3245925521 -9381567382 32.459255 -93.815674 12:36:aa:85:84:c9 3245957183 -9381577301 32.459572 -93.815773 18:9c:27:b6:4b:8a 3245976257 -9381594085 32.459763 -93.815941 02:cb:7a:c2:d1:42 3245947265 -9381558227 32.459473 -93.815582 02:cb:7a:c2:d1:43 3245948028 -9381558227 32.459480 -93.815582 02:cb:7a:c2:d1:45 3245947265 -9381559753 32.459473 -93.815598 36:e6:e6:86:cd:1c 3245981216 -9381570434 32.459812 -93.815704 3a:9c:27:b6:4b:8a 3245977020 -9381596374 32.459770 -93.815964 5a:9c:27:b6:4b:8a 3245976257 -9381596374 32.459763 -93.815964 8c:85:80:e4:35:dd 3245977783 -9381558990 32.459778 -93.815590 8c:0f:6f:21:c8:80 3245982742 -9381554412 32.459827 -93.815544 8c:0f:6f:d3:3b:68 3245903778 -9381518554 32.459038 -93.815186 8e:76:3f:d4:13:8d 3245978164 -9381594085 32.459782 -93.815941 94:a6:7e:31:02:35 3245890045 -9381510162 32.458900 -93.815102 9a:0f:6f:21:c8:80 3245982742 -9381554412 32.459827 -93.815544 9a:0f:6f:d3:3b:68 3245905303 -9381518554 32.459053 -93.815186 a2:0f:6f:21:c8:80 3245982360 -9381554412 32.459824 -93.815544 a2:0f:6f:d3:3b:68 3245904541 -9381518554 32.459045 -93.815186 a6:0f:6f:21:c8:80 3245983123 -9381557464 32.459831 -93.815575 a6:0f:6f:d3:3b:68 3245905685 -9381520080 32.459057 -93.815201 be:61:e9:cd:aa:a8 3245882415 -9381622314 32.458824 -93.816223 ca:3a:6b:db:9b:ba 3245902252 -9381513977 32.459023 -93.815140 ce:6c:6d:53:02:e5 3245964050 -9381594848 32.459640 -93.815948 d4:6c:6d:53:02:e5 3245963287 -9381592559 32.459633 -93.815926 d6:6c:6d:53:02:e5 3245962142 -9381593322 32.459621 -93.815933 da:e3:5e:f7:08:87 3245980834 -9381555938 32.459808 -93.815559 f8:aa:3f:fe:b2:1e 3245905303 -9381512451 32.459053 -93.815125 4e:6b:b8:aa:8c:80 3245885086 -9381540679 32.458851 -93.815407 78:b2:13:e7:91:39 3245882797 -9381607055 32.458828 -93.816071 9e:b3:f7:21:91:e7 3245910263 -9381617736 32.459103 -93.816177 ce:8b:66:31:a1:df 3245933151 -9381556701 32.459332 -93.815567 80:30:dc:c2:05:26 3245886993 -9381635284 32.458870 -93.816353 6e:29:90:f7:23:74 3245903396 -9381517791 32.459034 -93.815178 0c:73:29:ff:29:93 3245893096 -9381542968 32.458931 -93.815430 7e:27:bc:95:f5:35 3245974349 -9381566619 32.459743 -93.815666 00:cb:7a:d0:d1:42 3245967102 -9381575775 32.459671 -93.815758 00:cb:7a:d0:d1:47 3245966720 -9381576538 32.459667 -93.815765 2c:7e:81:ab:cd:1b 3245813751 -9381472778 32.458138 -93.814728 2c:fb:0f:0f:66:06 3245831298 -9381491851 32.458313 -93.814919 36:fb:0f:0f:66:06 3245833969 -9381491088 32.458340 -93.814911 4e:7e:81:ab:cd:1b 3245811080 -9381472778 32.458111 -93.814728 6e:7e:81:ab:cd:1b 3245812988 -9381472778 32.458130 -93.814728 84:00:2d:41:9a:38 3245840454 -9381491088 32.458405 -93.814911 88:6a:e3:e0:51:c4 3245843887 -9381491088 32.458439 -93.814911 92:00:2d:41:9a:38 3245839691 -9381491088 32.458397 -93.814911 9a:00:2d:41:9a:38 3245840454 -9381491088 32.458405 -93.814911 9a:9d:5d:df:f0:6a 3245788955 -9381491851 32.457890 -93.814919 9e:00:2d:41:9a:38 3245840072 -9381491088 32.458401 -93.814911 be:8c:cd:2f:95:16 3245823669 -9381494903 32.458237 -93.814949 c2:18:03:fb:7c:5e 3245796585 -9381478118 32.457966 -93.814781 0c:83:cc:c6:58:4f 3245823669 -9381491851 32.458237 -93.814919 ce:3f:cb:da:f6:1b 3245833587 -9381475830 32.458336 -93.814758 ce:ab:82:cf:55:98 3245824432 -9381491088 32.458244 -93.814911 d4:3f:cb:da:f6:1b 3245833206 -9381475067 32.458332 -93.814751 d4:ab:82:cf:55:98 3245824432 -9381491088 32.458244 -93.814911 d6:3f:cb:da:f6:1b 3245833969 -9381475067 32.458340 -93.814751 d6:ab:82:cf:55:98 3245823669 -9381490325 32.458237 -93.814903 da:3f:cb:da:f6:1b 3245833587 -9381475067 32.458336 -93.814751 da:ab:82:cf:55:98 3245823669 -9381491088 32.458237 -93.814911 0e:fe:7b:7e:0e:29 3245786666 -9381475830 32.457867 -93.814758 f8:aa:3f:fe:b2:3b 3245837783 -9381485748 32.458378 -93.814857 42:9e:9d:73:67:ef 3245817947 -9381486511 32.458179 -93.814865 6e:57:25:f3:7c:e5 3245834732 -9381487274 32.458347 -93.814873 9e:73:b1:ef:ad:77 3245817184 -9381499481 32.458172 -93.814995 1c:56:8e:0b:3b:34 3246085739 -9381424713 32.460857 -93.814247 24:de:8a:10:6e:a4 3246070098 -9381474304 32.460701 -93.814743 24:de:8a:60:04:14 3246067428 -9381462860 32.460674 -93.814629 48:e2:ad:ad:39:f4 3246047592 -9381441497 32.460476 -93.814415 54:2b:57:35:d6:c5 3246046829 -9381445312 32.460468 -93.814453 54:b2:03:53:16:68 3246035766 -9381394195 32.460358 -93.813942 56:2b:57:2f:ff:cf 3246062088 -9381448364 32.460621 -93.814484 62:b2:03:53:16:68 3246036911 -9381393432 32.460369 -93.813934 6a:b2:03:53:16:68 3246036911 -9381393432 32.460369 -93.813934 6e:b2:03:53:16:68 3246028518 -9381393432 32.460285 -93.813934 82:da:c2:2d:1f:12 3246070861 -9381422424 32.460709 -93.814224 82:da:c2:2d:1f:15 3246070480 -9381422424 32.460705 -93.814224 c0:94:35:dc:33:1a 3246071624 -9381478881 32.460716 -93.814789 ce:94:35:dc:33:1a 3246070861 -9381479644 32.460709 -93.814796 d6:94:35:dc:33:1a 3246070861 -9381478881 32.460709 -93.814789 28:c2:dd:dc:c9:b8 3246021270 -9381389617 32.460213 -93.813896 30:13:8b:2b:28:10 3246051025 -9381438446 32.460510 -93.814384 8c:0f:6f:18:7c:00 3246034240 -9381385803 32.460342 -93.813858 9a:0f:6f:18:7c:00 3246034622 -9381387329 32.460346 -93.813873 a2:0f:6f:18:7c:00 3246035003 -9381387329 32.460350 -93.813873 a6:0f:6f:18:7c:00 3246034622 -9381386566 32.460346 -93.813866 2a:ad:18:fc:8b:1f 3246102142 -9381381988 32.461021 -93.813820 3a:e7:c0:83:c1:a7 3246105575 -9381404876 32.461056 -93.814049 c6:98:5c:db:c2:43 3246094512 -9381495666 32.460945 -93.814957

None of us knew how Apple saved the location of our APs until recently. 02:aa:a0:e3:5f:38 3245891571 -9381494140 32.45891571 -93.81494140 00:18:f8:c1:4a:65 3245990371 -9381384277 32.45990371 -93.81384277 44:1c:12:99:23:58 3245911026 -9381490325 32.45911026 -93.81490325 44:1c:12:99:23:5b 3245911026 -9381489562 32.45911026 -93.81489562 44:1c:12:99:23:5d 3245911407 -9381490325 32.45911407 -93.81490325 44:1c:12:99:23:5e 3245912170 -9381490325 32.45912170 -93.81490325 06:aa:a0:e3:5f:38 3245893096 -9381491088 32.45893096 -93.81491088 72:13:01:01:99:9a 3245925521 -9381433868 32.45925521 -93.81433868 72:13:01:01:99:9d 3245924758 -9381433868 32.45924758 -93.81433868 etc.

After digging deeper (see other posts), I've confirmed Apple is simply storing our personal data to 8 decimal places, but without the decimal point. So all the conversion of Apple's raw values to GPS are off a bit.

That is, Apple's wide-open yet highly insecure WPS database stores latitude and longitude as integers representing the real coordinate multiplied by 100,000,000 (i.e., multiply by one hundred million).

I think mainly, since we're using Windows tools to get Apple privacy data, that we simply needed to UNDERSTAND better what it is that Apple is allowing everyone on the planet, no matter who they are, to access.

I agree with everyone who says the precision for the decimal location in Apple's highly insecure but all-too-public easily accessed WPS database is likely far higher than it needs to be for simply locating an access point. 9a:0f:6f:18:7c:00 3246034622 -9381387329 32.460346 -93.813873 a2:0f:6f:18:7c:00 3246035003 -9381387329 32.460350 -93.813873 a6:0f:6f:18:7c:00 3246034622 -9381386566 32.460346 -93.813866 2a:ad:18:fc:8b:1f 3246102142 -9381381988 32.461021 -93.813820 where all four of those in Shreveport, LA map to the same 100-meter area. 0.0008deg latitude ~ 89 meters 0.0010deg longitude at that latitude ~ 92 meters

Apple's WPS (Wi-Fi Positioning System) database appears to be storing our personal BSSID locations using fixed-point integer encoding where Latitude is apparently stored as an integer ~ lat * 1e8 Longitude is stored as an integer ~ lon * 1e8

Hence Apple's WPS database stores coordinates with 8 decimal places: 1e-8 degrees of latitude ~ 1.1 millimeters But the real-world accuracy of Wi-Fi geolocation is nowhere near that. So the location of each individual BSSID is probably within ~10 meters.

When you look up your own AP in Apple's database, if you get the raw numbers, all you need to do to convert Apple's stored value back into a normal GPS coordinate, you just divide by 100,000,000.

Here's the modified python script that just divides by 100 million the raw data that Apple stores about us in its highly insecure public WPS database.

#!/usr/bin/env -S uv run --script # -*- coding: utf-8 -*- # C:\app\os\python\apple_bssid_locator\apple_bssid_locator.py # Queries Apple WPS database for GPS:BSSID location pairs # Implementation based on

formatting link
# # Usage: apple_bssid_locator.py 11:22:33:AA:BB:CC # Usage: apple_bssid_locator.py 11:22:33:AA:BB:CC --all # Usage: apple_bssid_locator.py 11:22:33:AA:BB:CC --map # # Changelog: # v1p0 20251205 - Initial version # v1p1 20251214 - Added logging to results.txt # v1p2 20251215 - Timestamped results.txt to avoid overwrites # v1p3 20251219 - Limited output to 6 decimal places # v1p4 20251219 - Added raw integer output alongside converted decimals # v1p5 20251222 - Fixed raw to decimal conversion (divide by 100 Million) import argparse import requests import webbrowser import AppleWLoc_pb2 def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument("bssid", type=str, help="display the location of the bssid") parser.add_argument("-m", "--map", help="shows the location on google maps", action='store_true') parser.add_argument("-a", "--all", help="shows all results returned, not just the requested one", action='store_true') args = parser.parse_args() return args def format_bssid(bssid): return ':'.join(e.rjust(2, '0') for e in bssid.split(':')) def query_bssid(bssid, output_file="results.txt"): apple_wloc = AppleWLoc_pb2.AppleWLoc() wifi_device = apple_wloc.wifi_devices.add() wifi_device.bssid = bssid apple_wloc.unknown_value1 = 0 apple_wloc.return_single_result = 0 # request ALL results serialized_apple_wloc = apple_wloc.SerializeToString() length_serialized_apple_wloc = len(serialized_apple_wloc) headers = {'User-Agent':'locationd/1753.17 CFNetwork/889.9 Darwin/17.2.0'} data = b"\x00\x01\x00\x05"+b"en_US"+b"\x00\x13"+b"com.apple.locationd"+b"\x00\x0a"+b"8.1.12B411"+b"\x00\x00\x00\x01\x00\x00\x00" + bytes((length_serialized_apple_wloc,)) + serialized_apple_wloc r = requests.post('
formatting link
', headers=headers, data=data) apple_wloc = AppleWLoc_pb2.AppleWLoc() apple_wloc.ParseFromString(r.content[10:]) # Build dictionary of results results = {} with open(output_file, "w") as f: for wifi_device in apple_wloc.wifi_devices: if wifi_device.HasField('location'): raw_lat = wifi_device.location.latitude raw_lon = wifi_device.location.longitude lat = raw_lat * 1e-8 lon = raw_lon * 1e-8 mac = format_bssid(wifi_device.bssid) results[mac] = (lat, lon, raw_lat, raw_lon) # Write both raw integers and converted decimals (8 decimal places) f.write(f"{mac}\t{raw_lat}\t{raw_lon}\t{lat:.8f}\t{lon:.8f}\n") print(f"Saved {len(results)} entries to {output_file}") return results def main(): args = parse_arguments() print("Searching for location of bssid: %s" % args.bssid) results = query_bssid(args.bssid) # Determine which BSSIDs to process bssids_to_process = results.keys() if args.all else [args.bssid.lower()] found = False for bssid in bssids_to_process: if bssid in results: lat, lon, raw_lat, raw_lon = results[bssid] if lat == -180.0 and lon == -180.0: continue # Skip entries that were not found if found: print() print(f"BSSID: {bssid}") print(f"Raw latitude integer: {raw_lat}") print(f"Raw longitude integer: {raw_lon}") print(f"Latitude (degrees): {lat:.8f}") print(f"Longitude (degrees): {lon:.8f}") if args.map: url = f"
formatting link
{lat:.8f},{lon:.8f}" webbrowser.open(url) found = True if not found: print("The bssid was not found.") if __name__ == '__main__': main() # end of C:\app\os\python\apple_bssid_locator\apple_bssid_locator.py

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required