Android application for streaming GPS, compass and orientation data to a computer over Bluetooth RFCOMM in JSON format.
A GPS Bridge egy Android alkalmazás, amely a telefon helymeghatározási és tájolási adatait Bluetooth RFCOMM kapcsolaton keresztül továbbítja egy számítógépnek.
A telefon külső Bluetooth GPS-, iránytű- és helyzetérzékelőként használható. Az alkalmazás a mért adatokat UTF-8 kódolású, soronként egy JSON objektumot tartalmazó adatfolyamban küldi.
- GPS-koordináták továbbítása
- magasság és helymeghatározási pontosság továbbítása
- sebesség és GPS szerinti haladási irány továbbítása
- mágneses északi irány meghatározása
- valódi északi irány számítása a helyi mágneses deklináció alapján
- pitch és roll érték továbbítása
- Bluetooth RFCOMM / Serial Port Profile kapcsolat
- folyamatos, közel 5 Hz-es JSON adatfolyam
- egyszerű magyar nyelvű Android kezelőfelület
- Android 8.1 vagy újabb rendszer
- GPS-vevő
- Bluetooth adapter
TYPE_ROTATION_VECTORszenzor- iránytűszenzor
A projekt fontosabb Android-beállításai:
| Beállítás | Érték |
|---|---|
| Minimum Android API | 27 |
| Target Android API | 33 |
| Compile SDK | 33 |
| Programnyelv | Kotlin |
| JVM target | Java 8 |
| Application ID | hu.digitalsinus.gpsbridge |
Az alkalmazás Bluetooth RFCOMM szerverként működik.
| Paraméter | Érték |
|---|---|
| Szolgáltatás neve | GPS Bridge |
| RFCOMM UUID | 00001101-0000-1000-8000-00805F9B34FB |
| Profil | Serial Port Profile kompatibilis RFCOMM kapcsolat |
| Karakterkódolás | UTF-8 |
| Üzenethatárolás | LF, azaz \n |
| Küldési periódus | 200 ms |
| Névleges küldési gyakoriság | körülbelül 5 Hz |
Az alkalmazás egyszerre egy RFCOMM klienskapcsolatot kezel. A kapcsolat megszakadása után új kliens csatlakozására vár.
- Párosítsd a telefont a fogadó számítógéppel.
- Indítsd el a GPS Bridge alkalmazást.
- Engedélyezd a kért helymeghatározási és Bluetooth-jogosultságokat.
- Kapcsold be a telefon helymeghatározását és Bluetooth adapterét.
- Nyomd meg az Indítás gombot.
- A számítógépen csatlakozz a
GPS Bridgenevű RFCOMM szolgáltatáshoz. - A kapcsolat létrejötte után az alkalmazás folyamatosan küldi a JSON sorokat.
- A leállításhoz nyomd meg a Leállítás gombot.
A kezelőfelület megjeleníti:
- a Bluetooth-szerver állapotát;
- a klienskapcsolat állapotát;
- az aktuális helymeghatározási adatokat;
- a mágneses és valódi irányt;
- a pitch és roll értékeket;
- az utoljára elküldött JSON sort.
Minden elküldött rekord egyetlen JSON objektum. Az objektumot egy LF sortörés zárja le:
{JSON objektum}\n
Ez tehát newline-delimited JSON, röviden NDJSON jellegű adatfolyam. Egy teljes sor egy önállóan feldolgozható rekord.
Az alkalmazás a mezőket mindig ugyanabban a logikai sorrendben teszi a JSON objektumba:
{
"time": "2026-07-12T09:30:15.123Z",
"lat": 47.4979,
"lon": 19.0402,
"alt": 118.4,
"gps_accuracy": 4.2,
"speed": 0.3,
"course": 125.0,
"location_time_ms": 1783848615123,
"provider": "gps",
"heading_mag": 182.4,
"heading_true": 187.1,
"pitch": -3.2,
"roll": 1.5,
"heading_accuracy": 3
}A tényleges Bluetooth adatfolyamban ugyanez egyetlen sorban jelenik meg, majd \n karakter követi:
{"time":"2026-07-12T09:30:15.123Z","lat":47.4979,"lon":19.0402,"alt":118.4,"gps_accuracy":4.2,"speed":0.3,"course":125.0,"location_time_ms":1783848615123,"provider":"gps","heading_mag":182.4,"heading_true":187.1,"pitch":-3.2,"roll":1.5,"heading_accuracy":3}| Mező | JSON-típus | Mértékegység | Leírás |
|---|---|---|---|
time |
string | UTC idő | A JSON rekord létrehozásának időpontja yyyy-MM-dd'T'HH:mm:ss.SSS'Z' formátumban. |
lat |
number vagy null |
fok | Földrajzi szélesség WGS84 koordinátában. |
lon |
number vagy null |
fok | Földrajzi hosszúság WGS84 koordinátában. |
alt |
number vagy null |
méter | A Location objektum által szolgáltatott magasság. |
gps_accuracy |
number vagy null |
méter | A helymeghatározás becsült vízszintes pontossága. |
speed |
number vagy null |
m/s | A Location objektum által szolgáltatott sebesség. |
course |
number vagy null |
fok | A GPS/helymeghatározás szerinti haladási irány. Ez nem azonos a telefon iránytű szerinti tájolásával. |
location_time_ms |
integer vagy null |
ms Unix epoch óta | A felhasznált Android Location mérés időbélyege. |
provider |
string vagy null |
— | A helyadat szolgáltatója, például gps vagy network. |
heading_mag |
number vagy null |
fok | A telefon mágneses északi irányhoz viszonyított tájolása, 0 és 360 fok között normalizálva. |
heading_true |
number vagy null |
fok | Valódi északi irányhoz viszonyított tájolás, a helyi mágneses deklinációval korrigálva. |
pitch |
number vagy null |
fok | A telefon pitch szöge az Android rotation vector orientációjából. |
roll |
number vagy null |
fok | A telefon roll szöge az Android rotation vector orientációjából. |
heading_accuracy |
integer vagy null |
Android szenzorpontossági kód | A rotation vector szenzor által jelentett pontossági állapot. |
A mezők nem maradnak ki. Ha egy adat még nem érhető el, a program az adott mező értékeként JSON null értéket küld.
Példa közvetlenül az indulás után, amikor még nincs helyadat és szenzoradat:
{"time":"2026-07-12T09:30:15.123Z","lat":null,"lon":null,"alt":null,"gps_accuracy":null,"speed":null,"course":null,"location_time_ms":null,"provider":null,"heading_mag":null,"heading_true":null,"pitch":null,"roll":null,"heading_accuracy":null}Részleges adat esetén csak a nem elérhető mezők lesznek null értékűek. Például a helyadat már rendelkezésre állhat úgy is, hogy a sebesség vagy a GPS szerinti haladási irány még nem ismert.
A protokoll két külön időadatot tartalmaz:
A JSON sor létrehozásának aktuális rendszerideje UTC-ben:
2026-07-12T09:30:15.123Z
Az Android helymeghatározási mérés időpontja ezredmásodpercben, Unix epoch óta. Ez nem feltétlenül egyezik meg pontosan a JSON rekord létrehozási idejével, mert ugyanaz a legutóbbi helymérés több egymást követő JSON rekordban is szerepelhet.
A course a helymeghatározó rendszer által megadott haladási irány. Álló vagy nagyon lassan mozgó készüléknél nem feltétlenül áll rendelkezésre, ezért null lehet.
A heading_mag a telefon rotation vector szenzorából számított, mágneses északi irányhoz viszonyított tájolás.
A program a valódi északi irányt az Android GeomagneticField osztályával számítja:
heading_true = heading_mag + helyi mágneses deklináció
Az eredmény 0 és 360 fok közé van normalizálva. A számításhoz az aktuális szélességet, hosszúságot, magasságot és rendszeridőt használja. Helyadat hiányában a heading_true értéke null.
A mező az Android SensorManager pontossági kódját tartalmazza:
| Érték | Android jelentés |
|---|---|
0 |
SENSOR_STATUS_UNRELIABLE |
1 |
SENSOR_STATUS_ACCURACY_LOW |
2 |
SENSOR_STATUS_ACCURACY_MEDIUM |
3 |
SENSOR_STATUS_ACCURACY_HIGH |
null |
A szenzor még nem jelentett pontossági állapotot. |
Miután a Bluetooth RFCOMM kapcsolat létrejött és a rendszerben például /dev/rfcomm0 eszközként elérhető, az adatfolyam egyszerűen olvasható:
cat /dev/rfcomm0A sorok feldolgozhatók például jq segítségével:
cat /dev/rfcomm0 | jq -c .Csak a pozíció kiírása:
cat /dev/rfcomm0 |
while IFS= read -r line
do
printf '%s\n' "$line" |
jq -r '[.time, .lat, .lon, .alt] | @tsv'
doneA kliensprogramnak soronként kell olvasnia az adatfolyamot, majd minden teljes sort külön JSON objektumként feldolgoznia.
A projekt Android Studio használatával nyitható meg, vagy a mellékelt Gradle Wrapperrel parancssorból is fordítható.
Debug APK készítése:
./gradlew assembleDebugA létrejövő APK alapértelmezett helye:
app/build/outputs/apk/debug/app-debug.apk
Release build készítése:
./gradlew assembleReleaseA release APK publikálásához külön aláírási konfiguráció szükséges.
Az alkalmazás a következő jogosultságokat használja:
ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONBLUETOOTHAndroid 11-igBLUETOOTH_ADMINAndroid 11-igBLUETOOTH_CONNECTAndroid 12-tőlBLUETOOTH_SCANAndroid 12-től
GPSBridge/
├── app/
│ ├── src/main/
│ │ ├── java/hu/digitalsinus/gpsbridge/MainActivity.kt
│ │ ├── res/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ └── proguard-rules.pro
├── gradle/wrapper/
├── build.gradle
├── settings.gradle
├── gradlew
└── gradlew.bat
A teljes alkalmazás fő működése jelenleg a MainActivity.kt fájlban található:
- jogosultságkezelés;
- GPS- és hálózati helyfrissítések kezelése;
- rotation vector szenzor olvasása;
- mágneses és valódi irány számítása;
- RFCOMM szerver létrehozása;
- klienskapcsolat kezelése;
- JSON rekordok előállítása és küldése.
- Az alkalmazásnak az előtérben kell futnia; külön Android foreground service nincs megvalósítva.
- Egyszerre egy Bluetooth klienskapcsolatot kezel.
- A küldési periódus 200 ms, de az új GPS-mérések tényleges gyakoriságát a telefon hardvere és az Android helymeghatározó rendszere határozza meg.
- Két GPS-frissítés között több JSON rekord is tartalmazhatja ugyanazt a helyadatot.
- A mágneses irányt a környező fémek, mágnesek, hangszórók és elektromos berendezések jelentősen befolyásolhatják.
- A pontos irányméréshez szükség lehet a telefon iránytűjének kalibrálására.
A projekt licencét a repository LICENSE fájlja határozza meg.