WoL Gateway menjadikan perangkat Android sebagai gateway Wake-on-LAN (WoL) untuk membangunkan PC atau perangkat lain di jaringan lokal. Aplikasi menyediakan UI Android, REST API terautentikasi, Cloudflare Tunnel opsional, background service, diagnostics, serta Root Mode opsional.
- Registrasi, edit, hapus, pencarian, dan detail device WoL.
- Discovery device pada subnet LAN aktif.
- Pengiriman magic packet melalui UDP broadcast.
- Pemeriksaan status target melalui ICMP dan/atau TCP.
- REST API versioned pada
/api/v1. - API token tersimpan menggunakan Android Keystore.
- Cloudflare Tunnel opsional untuk akses dari jaringan eksternal.
- Foreground service, API autostart, tunnel autostart, dan network recovery.
- Standard Mode sebagai mode utama; Root Mode sebagai fitur opsional.
- Diagnostics aman dengan redaction secret dan data thermal bila tersedia.
- UI Jetpack Compose Material 3, light/dark theme, dan layout accessible.
External Client
│
├── Cloudflare Tunnel (opsional)
│
Android Gateway ── Ktor REST API
│
└── LAN ── UDP WoL / ICMP / TCP ── Target Device
Status target dipisahkan dari status API, tunnel, dan service:
ONLINE: pemeriksaan memperoleh bukti konektivitas.OFFLINE: tersedia bukti kuat target tidak reachable.UNKNOWN: hasil ambigu atau bukti tidak cukup.
PACKET_SENT hanya berarti magic packet berhasil dikirim secara lokal. Status tersebut bukan bukti target sudah menyala.
- Android 10 atau lebih baru (
minSdk 29). - ARM64 (
arm64-v8a). - Jaringan Wi-Fi atau Ethernet yang sama dengan target WoL.
- Root tidak diperlukan untuk Standard Mode.
- Cloudflare account/token hanya diperlukan bila Tunnel digunakan.
- Install APK pada perangkat Android.
- Buka Add Devices.
- Jalankan discovery LAN atau pilih registrasi manual.
- Isi nama, IP, dan MAC address target.
- Periksa konfigurasi broadcast address dan port WoL bila diperlukan.
- Simpan device.
- Gunakan Wake untuk mengirim magic packet.
- Gunakan Check status untuk memeriksa target.
- Aktifkan API service melalui Settings → API settings bila aplikasi perlu menerima request eksternal.
Discovery tidak otomatis menyimpan device. Hasil discovery harus dipilih lalu didaftarkan.
API default:
http://127.0.0.1:8080/api/v1
Bind address selalu 127.0.0.1. Hanya port 1024..65535 yang dapat diubah melalui Settings. API berhenti secara default dan harus diaktifkan dari aplikasi.
| Method | Path | Auth | Fungsi |
|---|---|---|---|
GET |
/health |
Tidak | Health minimum |
GET |
/diagnostics |
Ya | Diagnostics gateway yang sudah di-redact |
POST |
/discovery/scan |
Ya | Scan device LAN |
GET |
/devices |
Ya | Daftar device |
GET |
/devices/{id} |
Ya | Detail device |
POST |
/devices |
Ya | Tambah device |
PUT |
/devices/{id} |
Ya | Ubah device |
DELETE |
/devices/{id} |
Ya | Hapus device |
GET |
/devices/{id}/status |
Ya | Status check satu kali |
POST |
/devices/{id}/wake |
Ya | Kirim magic packet |
Endpoint protected memakai:
Authorization: Bearer <api-token>
Health check:
curl.exe -i http://127.0.0.1:8080/api/v1/health
Daftar device:
$token = '<copy-token-from-Settings>'
curl.exe -i http://127.0.0.1:8080/api/v1/devices `
-H "Authorization: Bearer $token"
Tambah device:
$body = '{"name":"Office PC","ipAddress":"192.168.1.20","macAddress":"AA:BB:CC:DD:EE:FF","broadcastAddress":"255.255.255.255","wolPort":9,"statusCheckMethod":"ICMP_AND_TCP","statusCheckPort":3389}'
curl.exe -i -X POST http://127.0.0.1:8080/api/v1/devices `
-H "Authorization: Bearer $token" `
-H 'Content-Type: application/json' `
-d $body
Error memakai envelope konsisten:
{
"error": {
"code": "validation_failed",
"message": "Device validation failed",
"fields": {
"IP_ADDRESS": "IP_ADDRESS_INVALID"
}
}
}
Kode error umum: unauthorized, invalid_json, validation_failed, duplicate_device, device_not_found, discovery_timeout, request_too_large, bad_request, dan internal_error.
Dokumentasi endpoint lengkap tersedia di docs/API_ENDPOINTS.md dan docs/API.md.
- Token dibuat otomatis saat konfigurasi API pertama kali.
- Token disimpan dalam secure storage berbasis Android Keystore.
- Token dapat diganti dengan custom token atau automatic refresh dari Settings.
- Token ditampilkan secara masked.
- Tidak ada endpoint token-management.
- Token tidak boleh masuk log, notification, diagnostics, response error, report, atau screenshot.
Cloudflare Tunnel membuat API Android dapat diakses dari luar jaringan lokal tanpa port forwarding atau inbound firewall rule. Koneksi dibuat outbound dari Android ke Cloudflare Edge; client eksternal mengakses hostname HTTPS Cloudflare.
External Client
│ HTTPS
▼
Cloudflare Edge
│ encrypted tunnel
▼
cloudflared di Android
│ loopback
▼
Ktor API: 127.0.0.1:<configured-api-port>
Tunnel hanya meneruskan request. Tunnel bukan autentikasi; semua endpoint selain /api/v1/health tetap memerlukan:
Authorization: Bearer <api-token>
Origin tunnel selalu mengikuti port API pada aplikasi:
127.0.0.1:<configured-api-port>
Origin tidak dapat diubah terpisah dari halaman Tunnel. API service harus aktif agar tunnel dapat berjalan. Tunnel autostart juga membutuhkan API service dan tunnel token yang tersimpan.
- Akun Cloudflare.
- Domain aktif pada Cloudflare.
- Subdomain yang akan dipakai, misalnya
wol.example.com. - Android tetap terhubung ke LAN target.
- API service WoL Gateway sudah diuji secara lokal.
Gunakan remotely-managed tunnel melalui Cloudflare Dashboard. Model ini cocok untuk WoL Gateway karena aplikasi Android menjalankan cloudflared secara embedded dan menerima tunnel token; pengguna tidak perlu menjalankan proses cloudflared terpisah pada PC.
- Buka Cloudflare Dashboard.
- Pilih akun yang memiliki domain.
- Buka Zero Trust → Networks → Connectors → Tunnels.
- Pilih Create a tunnel.
- Pilih connector Cloudflared.
- Isi nama tunnel, misalnya
wol-gateway-home. - Buat tunnel.
- Salin tunnel token dari halaman connector.
- Jangan commit, log, screenshot, atau membagikan token. Token memberi izin connector untuk menjalankan tunnel.
Di aplikasi Android:
- Buka Settings → Tunnel.
- Masukkan tunnel token.
- Simpan token.
- Aktifkan switch Connection.
- Pastikan status berubah menjadi
CONNECTED.
Token tunnel disimpan terpisah dari API token menggunakan Android Keystore-backed storage. Saat CONNECTING, CONNECTED, atau RECONNECTING, token tidak dapat diedit.
Route menentukan hostname publik mana yang diteruskan ke API lokal Android.
-
Pada tunnel yang dibuat, buka tab Routes atau Published application.
-
Pilih Add route → Published application.
-
Isi Subdomain, misalnya
wol. -
Pilih domain, misalnya
example.com. -
Pastikan hostname menjadi
wol.example.com. -
Isi Service URL sesuai port API pada aplikasi:
http://127.0.0.1:8080Ganti
8080bila port API di Settings memakai port lain. -
Simpan route.
-
Pastikan DNS record/CNAME untuk hostname dibuat atau terhubung otomatis ke tunnel oleh Cloudflare.
-
Pastikan connector tunnel menunjukkan status Healthy atau Connected.
Route tidak perlu menambahkan /api/v1; gunakan origin root http://127.0.0.1:<port>. Path request diteruskan apa adanya, sehingga client memakai:
https://wol.example.com/api/v1/health
https://wol.example.com/api/v1/devices
https://wol.example.com/api/v1/devices/1/wake
Untuk API WoL Gateway, route publik yang disarankan adalah satu hostname ke satu origin API. Jika memakai path route, path tersebut tidak otomatis dihapus atau di-rewrite sebelum diterima origin; konfigurasi rewrite tambahan dapat membuat URL API tidak sesuai.
Konsep route remotely-managed equivalent:
tunnel: <tunnel-id>
ingress:
- hostname: wol.example.com
service: http://127.0.0.1:8080
- service: http_status:404
Rule catch-all http_status:404 harus berada paling akhir. Pada integrasi Android ini, konfigurasi ingress dikelola oleh runtime tunnel dan Cloudflare Dashboard; contoh YAML hanya menjelaskan mapping hostname ke origin, bukan file yang harus disimpan di repository.
Lakukan pengujian dari jaringan seluler atau Wi-Fi lain, bukan jaringan yang sama dengan Android:
curl.exe -i https://wol.example.com/api/v1/health
Expected:
{"status":"ok"}
Uji endpoint protected memakai API token:
$token = '<copy-token-from-Settings>'
curl.exe -i https://wol.example.com/api/v1/devices `
-H "Authorization: Bearer $token"
Tanpa token atau dengan token salah, response harus 401. Health endpoint yang berhasil tidak membuktikan device WoL online; endpoint tersebut hanya membuktikan API menerima request.
- Nyalakan API service sebelum menghubungkan tunnel.
- Port pada route Cloudflare harus sama dengan port API Settings.
- Jangan mengisi origin dengan IP LAN Android; gunakan
127.0.0.1:<port>. - Jangan membuka port router ke internet hanya untuk Tunnel.
- Jangan memakai URL tunnel sebagai pengganti API token.
- Gunakan HTTPS hostname Cloudflare untuk client eksternal.
- Tunnel harus berstatus
CONNECTEDsebelum request eksternal diuji. - Mematikan API akan memutus tunnel; mematikan tunnel tidak mematikan API lokal.
- Auto-reconnect hanya berjalan ketika connection aktif dan token tersimpan.
Tunnel mendukung state berikut:
NOT_CONFIGURED, DISCONNECTED, CONNECTING, CONNECTED, RECONNECTING, ERROR.
Runtime tunnel ditargetkan untuk ARM64 dan menggunakan binary yang dibangun dari source resmi Cloudflare. Detail provenance, checksum, lifecycle, dan validasi ada di docs/ARCHITECTURE.md serta docs/IMPLEMENTATION_PLAN.md.
| Gejala | Pemeriksaan |
|---|---|
NOT_CONFIGURED |
Simpan tunnel token pada Settings. |
Switch kembali OFF |
Token invalid, koneksi gagal, atau origin API belum aktif. Baca safe error pada halaman Tunnel. |
502 Bad Gateway |
Pastikan API aktif, port route sama dengan port API, dan origin memakai http://127.0.0.1:<port>. |
| Hostname tidak resolve | Pastikan public hostname route dan DNS record dibuat pada tunnel yang benar. |
Tunnel CONNECTED, API 401 |
Tunnel sehat; gunakan API token WoL Gateway yang benar. |
/health berhasil, device gagal |
Periksa device ID, status target, MAC, broadcast address, firewall, dan jaringan LAN Android. |
| Tunnel sering reconnect | Periksa koneksi Android, battery optimization, network recovery, dan kebijakan OEM. |
Mode default tanpa root. Android foreground service menjaga API dan tunnel tetap berjalan sesuai batasan OS/OEM, battery policy, notification permission, dan background-start restriction.
Mode opsional dengan explicit consent. Root supervisor hanya mengelola lifecycle gateway melalui operasi allowlisted, readiness check, restart terbatas, dan fallback ke Standard Mode.
Root Mode tidak:
- Menjalankan arbitrary shell command.
- Menjalankan Ktor, Room, Keystore, atau credential tunnel sebagai UID 0.
- Menjamin aplikasi selalu hidup pada setiap OEM.
- Menghilangkan batasan jaringan atau ARP discovery.
- API bind loopback-only pada
127.0.0.1. - Semua route sensitif membutuhkan Bearer token.
- Perbandingan token constant-time.
- Request body dibatasi 64 KiB.
- Input device divalidasi pada trust boundary.
- Tidak ada shell execution atau arbitrary process execution melalui API.
- Secret dipisahkan dari DataStore biasa dan disimpan pada Keystore-backed storage.
- Diagnostics, log, notification, dan error memakai data yang sudah di-redact.
- Root membutuhkan capability serta consent eksplisit.
- WoL bergantung pada konfigurasi broadcast, router, firewall, NIC, dan power state target.
- MAC address tidak selalu dapat ditemukan melalui discovery; input manual tetap tersedia.
- ICMP atau TCP yang gagal tidak otomatis berarti target
OFFLINE; hasil ambigu menjadiUNKNOWN. - TCP status check default Windows memakai port
3389; port dapat diubah per device. - Background recovery bersifat best-effort dan dipengaruhi Android/OEM.
- Data thermal bersifat diagnostik; bukan bukti target WoL online dan bukan health check API/tunnel.
- Tunnel publik tetap memerlukan autentikasi API.
Proyek memakai satu Android module dengan pembagian layer:
- Presentation: Jetpack Compose, ViewModel, navigation, shared components.
- Domain: model, validation, use case, repository/service contract.
- Data: Room, DataStore, repository, secure storage.
- Gateway: Ktor server, routing, DTO, auth, validation, error mapping.
- Network/WoL: discovery, status checker, magic packet, UDP sender.
- Tunnel: controller, state machine, retry, runtime adapter.
- Android service: foreground service, boot/network recovery, lifecycle coordinator.
- Root: capability detector, consent, supervisor, safe fallback.
Package utama: com.yihs.wolgateway.
docs/PRD.md— product requirements, scope, security, acceptance criteria.docs/ARCHITECTURE.md— deployment, layer, lifecycle, storage, security boundary.docs/API.md— ringkasan API dan manual verification.docs/API_ENDPOINTS.md— referensi endpoint dan schema lengkap.docs/DESIGN.md— UI/UX, design tokens, navigation, accessibility.docs/IMPLEMENTATION_PLAN.md— checkpoint, status implementasi, dan validasi.
Fitur utama Android UI, device management, REST API, tunnel ARM64, background service, Root Mode, dan diagnostics telah didokumentasikan sebagai implemented/validated sesuai scope masing-masing. Validasi real-device tetap bergantung pada perangkat, jaringan, konfigurasi OEM, dan target WoL yang digunakan.