2025-10-15 09:49:07 +08:00

265 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# dumon-geolocation
Capacitor Plugin untuk Android yang menyediakan **real-time high-accuracy positioning** menggunakan kombinasi:
- 📡 **GNSS multi-konstelasi** (GPS, GLONASS, BeiDou, Galileo)
- 📶 **Wi-Fi RTT / RSSI**
- 🎯 **IMU Sensor** (Accelerometer, Gyroscope, Rotation)
-**Forward Prediction (opsional)**
- 🛡️ **Deteksi Lokasi Palsu (Mock Location Detection)**
---
## 📦 Instalasi
```bash
npm install git+https://git.jayacita.com/wengki/dumon-geolocation.git
```
Jika terjadi konflik dependency:
```bash
npm install git+https://git.jayacita.com/wengki/dumon-geolocation.git --legacy-peer-deps
```
Kemudian:
```bash
npx cap sync
```
---
## Permissions
Plugin ini memerlukan izin berikut:
- ACCESS_FINE_LOCATION
- ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
- CHANGE_WIFI_STATE
- NEARBY_WIFI_DEVICES (untuk Android 13+)
Gunakan API checkAndRequestPermissions() sebelum memulai positioning.
---
## API
### startPositioning()
```typescript
startPositioning(): Promise<void>
```
Memulai pengambilan data lokasi dari GNSS, Wi-Fi, dan IMU secara simultan.
### stopPositioning()
```typescript
stopPositioning(): Promise<void>
```
Menghentikan semua sensor dan proses positioning.
### getLatestPosition()
```typescript
getLatestPosition(): Promise<PositioningData>
```
Mengembalikan posisi terkini. Jika opsi prediksi diaktifkan (lihat setOptions), nilai dapat diproyeksikan pendek dan ditandai `predicted: true`.
### addListener(onPositionUpdate, …)
```typescript
addListener('onPositionUpdate', (data: PositioningData) => void): PluginListenerHandle
```
Menerima update posisi secara real-time (dengan debounce + threshold perubahan posisi/speed/direction).
### checkAndRequestPermissions()
```typescript
checkAndRequestPermissions(): Promise<PermissionStatus>
```
Memeriksa dan meminta semua permission yang dibutuhkan oleh plugin.
### configureEdgeToEdge()
```typescript
configureEdgeToEdge(options: {
bgColor: string;
style: 'DARK' | 'LIGHT';
overlay?: boolean;
}): Promise<void>
```
Mengatur status bar dan navigasi bar agar transparan, dengan warna dan icon style sesuai UI.
### setGpsMode()
```typescript
setGpsMode(options: { mode: 'normal' | 'driving' }): Promise<void>
```
Mengganti mode GPS:
- `normal`: polling adaptif (hemat baterai)
- `driving`: continuous updates + loop emisi periodik
### setOptions()
```typescript
setOptions(options: {
distanceThresholdMeters?: number;
speedChangeThreshold?: number;
directionChangeThreshold?: number;
emitDebounceMs?: number;
drivingEmitIntervalMs?: number;
wifiScanIntervalMs?: number;
enableWifiRtt?: boolean;
enableLogging?: boolean;
enableForwardPrediction?: boolean;
maxPredictionSeconds?: number;
emitGnssStatus?: boolean;
suppressMockedUpdates?: boolean;
keepScreenOn?: boolean;
}): Promise<void>
```
Mengubah parameter runtime tanpa rebuild. Semua default menjaga perilaku saat ini.
### getGnssStatus()
```typescript
getGnssStatus(): Promise<SatelliteStatus | null>
```
Mengambil status GNSS terakhir untuk debugging.
### getLocationServicesStatus()
```typescript
getLocationServicesStatus(): Promise<{ gpsEnabled: boolean; networkEnabled: boolean }>
```
Memeriksa apakah provider lokasi aktif.
### addListener('onGnssStatus', …)
```typescript
addListener('onGnssStatus', (data: SatelliteStatus) => void): PluginListenerHandle
```
Menerima update status GNSS jika `emitGnssStatus: true` di setOptions.
---
## Interfaces
PositioningData
```typescript
interface PositioningData {
source: 'GNSS' | 'WIFI' | 'FUSED' | 'MOCK';
timestamp: number;
latitude: number;
longitude: number;
accuracy: number;
speed: number;
acceleration: number;
directionRad: number;
isMocked: boolean;
mode: 'normal' | 'driving';
predicted?: boolean;
// opsional: detail asal speed
speedSource?: 'GNSS' | 'IMU' | 'DELTA' | 'NONE';
speedGnss?: number; // m/s dari Location.getSpeed bila tersedia & segar
speedImu?: number; // m/s dari IMU (heuristik internal)
speedDerived?: number; // m/s hasil Δpos/Δt (kasar)
}
```
PermissionStatus
```typescript
interface PermissionStatus {
location: 'granted' | 'denied';
wifi: 'granted' | 'denied';
}
```
---
## Fusion dan Prediksi
- Tidak ada Kalman/Fusion saat ini. Data yang dipancarkan berasal dari GNSS, dilengkapi IMU untuk heuristik interval dan estimasi arah/kecepatan.
- Prediksi maju (deadreckoning) bersifat opsional dan nonaktif secara default. Aktifkan dengan `setOptions({ enableForwardPrediction: true, maxPredictionSeconds?: number })`.
- Saat prediksi aktif, posisi dapat diproyeksikan pendek (<= `maxPredictionSeconds`) berdasarkan `speed` dan `directionRad` dari IMU, serta ditandai `predicted: true`. Nilai `source` tidak berubah.
### Kebijakan `speed`
- Field `speed` kini dipilih dengan prioritas: GNSS > IMU > Δpos/Δt > 0.
- GNSS: dipakai jika `Location.hasSpeed()` dan usia fix ≤ ~3000 ms.
- IMU: fallback dari integrasi percepatan IMU (dibatasi ke 0..30 m/s, dengan smoothing & idle handling).
- Δpos/Δt: fallback terakhir, hanya bila selang waktu antar fix ≥ 3 s.
- Field tambahan opsional: `speedSource`, `speedGnss`, `speedImu`, `speedDerived` untuk transparansi asal nilai.
---
## Detail Sensor (untuk pengembangan lanjutan)
> gnssData, imuData, dan wifiData tersedia dalam payload internal dan bisa diaktifkan untuk debug.
```typescript
// Dapat disertakan di masa depan:
interface SatelliteStatus {
satellitesInView: number;
usedInFix: number;
constellationCounts: { [key: string]: number };
}
interface ImuData {
accelX: number;
accelY: number;
accelZ: number;
gyroX: number;
gyroY: number;
gyroZ: number;
speed: number;
acceleration: number;
directionRad: number;
}
interface WifiAp {
ssid: string;
bssid: string;
rssi: number;
distance?: number;
}
```
---
## Catatan
- Hanya mendukung platform Android.
- Gunakan bersama @capacitor/geolocation jika ingin membandingkan hasil native vs Dumon.
- Posisi dipancarkan setiap 1000ms atau saat terjadi perubahan signifikan (jarak, kecepatan, arah).
- directionRad dalam radian relatif terhadap utara.
- Fitur Mock Location Detection aktif secara default.
---
## Testing (example-app)
Contoh implementasi tersedia di folder `/example-app` dengan kontrol:
- Start/Stop Positioning, Get Latest Position
- Request Permissions, Clear Log
- Mode: Driving / Normal
- Apply Options (semua opsi runtime, termasuk keepScreenOn, emitGnssStatus, enableForwardPrediction, interval)
- Diagnostics: Get GNSS Status, Get Location Services Status
---
- Lisensi: MIT
- Dibuat oleh: Tim Dumon 🇮🇩