Tiga Komponen Asas, Satu Matlamat
Di sebalik tabir, Timmy dibina dengan cara yang cukup praktikal: Flutter untuk aplikasi, WebRTC untuk audio dan video masa nyata, serta Firebase untuk penyelarasan. Saya tidak mahu membina platform besar yang menghantar semuanya melalui awan. Setiap bahagian sepatutnya hanya mengetahui sesedikit mungkin, namun tetap berfungsi dengan baik bersama bahagian lain.
WebRTC: Sambungan Terus, Disulitkan Secara Lalai
WebRTC (Web Real-Time Communication) membawa audio dan video antara peranti bayi dan ibu bapa. Dalam keadaan terbaik, data mengalir terus antara dua peranti, secara peer-to-peer, tanpa pelayan media di tengah.
Setiap sambungan WebRTC menggunakan DTLS-SRTP secara lalai. Jika seseorang memintas paket rangkaian, mereka tidak akan memperoleh audio yang boleh didengar atau video yang boleh ditonton. Penyulitan ini ialah sebahagian daripada protokol dan tidak boleh dimatikan begitu sahaja dalam WebRTC.
Itulah perkara penting bagi saya: media bilik bayi tidak sepatutnya melalui pelayan saya. Media itu kekal antara peranti anda.
Pensinyalan melalui Firebase Firestore
Sebelum WebRTC boleh bermula, peranti perlu mencari satu sama lain dan merundingkan cara untuk bersambung. Bahagian ini dipanggil pensinyalan. Timmy menggunakan Firebase Firestore, pangkalan data awan Google, untuk tujuan ini.
Hanya data teknikal sambungan yang dipertukarkan:
- Tawaran dan jawapan SDP: Menerangkan keupayaan peranti (codec yang disokong, resolusi dan sebagainya).
- Calon ICE: Laluan rangkaian yang mungkin digunakan peranti untuk mencapai satu sama lain.
Audio dan video tidak dihantar ke Firebase. Firestore hanya mengangkut data teknikal sambungan. Timmy turut menyulitkan lapisan pensinyalan ini supaya Firestore tidak menjadi tempat pertukaran data SDP dan ICE dalam bentuk teks biasa.
Pelayan TURN: Apabila Laluan Terus Tidak Berfungsi
Sesetengah rangkaian menyekat sambungan terus, contohnya tembok api yang ketat atau pembekal mudah alih tertentu. Dalam keadaan itu, WebRTC memerlukan geganti TURN (Traversal Using Relays around NAT).
Timmy mula-mula mencuba pelayan TURN setempat dan menggunakan Cloudflare sebagai sandaran apabila geganti setempat tidak tersedia atau terlalu sibuk. Geganti itu meneruskan paket yang disulitkan. Ia tidak menerima kunci untuk audio atau video; penyulitan WebRTC kekal utuh.
Bukti kelayakan TURN diperoleh daripada Firebase Cloud Function dan hanya sah selama 24 jam. Menyimpan bukti kelayakan kekal dalam aplikasi monitor bayi terlalu berisiko bagi saya.
Nearby Connections: Peranti Mencari Satu Sama Lain Secara Automatik
Untuk mengelakkan langkah persediaan yang leceh antara peranti bayi dan ibu bapa, Timmy menggunakan Nearby Connections. Google menyediakan lapisan pengesanan ini melalui Bluetooth dan WiFi.
Penggandingan automatik dalam Timmy berfungsi tanpa perlu memasukkan kod secara manual: peranti mengesan satu sama lain dan menemukan titik pertemuan yang sama untuk pertukaran kunci. Jika proses itu gagal, anda boleh memasukkan kod 4 aksara. Kod penggandingan tidak pernah meninggalkan peranti; Firestore hanya melihat cincangan kriptografi (SHA-256) sebagai pengecam dokumen.
Pengesahan Tanpa Nama
Timmy menggunakan Firebase Anonymous Authentication. Ketika pertama kali dibuka, setiap peranti menerima ID sementara tanpa nama. Tiada akaun, alamat e-mel atau kata laluan. ID ini hanya digunakan untuk menguatkuasakan peraturan Firestore: hanya peranti yang disahkan boleh membaca atau menulis data sesi.
Seni Bina: Siapa Menghantar, Siapa Menerima
Timmy mempunyai dua mod:
- Mod Bayi (penghantar): Peranti menangkap audio melalui mikrofon dan menghantarnya ke peranti ibu bapa melalui WebRTC. Kamera juga boleh diaktifkan secara pilihan; video kemudian turut dihantar secara terus.
- Mod Ibu Bapa (penerima): Peranti menerima audio dan video, memaparkan strim kamera, serta menawarkan push-to-talk untuk mesej suara ringkas kepada peranti bayi.
Kawalan seperti push-to-talk dan menghidupkan atau mematikan kamera menggunakan DataChannel, satu lagi saluran WebRTC yang menghantar mesej kecil yang disulitkan secara terus antara peranti.
Mengapa Flutter?
Flutter ialah rangka kerja Google untuk aplikasi pada pelbagai platform. Bagi Timmy, ini bermakna saya boleh menulis sebahagian besar logik sekali sahaja dan menggunakannya pada Android serta iOS. Timmy tersedia pada Android, dan versi iOS hampir dilancarkan. Lebih sedikit kod pendua bermakna lebih sedikit tempat yang boleh menjadi punca pepijat.
Ringkasan
Prinsip teknikalnya mudah: Timmy hanya patut mengakses data yang benar-benar diperlukan. WebRTC melindungi media, Firebase menyelaraskan persediaan sambungan, TURN hanya melihat paket yang disulitkan, dan Nearby Connections memudahkan proses penggandingan.
Teknologi yang baik hampir tidak disedari dalam kehidupan seharian. Ia berfungsi tanpa menjadikan bilik bayi suatu projek berasaskan awan.