Kurento Room Android client WebSocket using nv-websocket-client
kurento-room-client-android is a Java library for Android. This library can be used to deploy applications for interac- tion with Kurento room server. This documentation Provides help on how to install and use the library.
Source code is available at https://github.com/nubomedia-vtt/kurento-room-client-android.
Support is provided through the Nubomedia VTT Public Mailing List available at https://groups.google.com/forum/#!forum/nubomedia-vtt
Salah satu permasalahan yang ada di klien Kurento Room berbasis android adalah koneksi websocket ke server. Kurento Room secara default menggunakan Maven org.java_websocket yang bisa diakses di situs resmi repositori Maven https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket/1.3.0 atau kode sumber nya bisa juga dilihat di Github https://github.com/TooTallNate/Java-WebSocket, kalau dilihat di Github tertulis terakhir update sekitar 2 tahun yang lalu (terhitung saya mempublikasikan tulisan ini). Dan terjadi banyak kendala pada umumnya untuk membangun koneksi ke sever kurento room yang berbasis SSL. Dokumentasi kurento room secara resmi mengatakan dalam tulisannya; https://media.readthedocs.org/pdf/doc-kurento-room-client-android/latest/doc-kurento-room-client-android.pdf
WSS support on Android 5.0.x (Lollipop) and up
kurento-room-client-android library uses Maven org.java_websocket: http://mvnrepository.com/artifact/org.java- websocket/Java-WebSocket/
However, org.java_websocket version 1.3.0 is not compatible with Android 5.0.x systems due to malfunction in wss protocol handshake. Until a newer version is uploaded to Maven, a workaround is to compile a newer version from git: https://github.com/TooTallNate/Java-WebSocket
This limitation is known to exist only in wss TSL handshake. Android 5.1.x and up should not have this issue.
Kadang tidak seperti yang tertulis disana “This limitation is known to exist only in wss TSL handshake. Android 5.1.x and up should not have this issue”, saya pernah mencoba menggunakan dengan versi Android 5.1.1 dan masih sering terjadi masalah terutama diproses SSL handshaking nya.
Kenapa menggunakan nv-websocket-client?
Seperti tertulis di Github, nv-websocket-client (High-quality WebSocket client implementation in Java) memproklamirkan diri sebagai WebSocket yang mempunyai kualitas tinggi (high-quality websocket) dengan spesifikasi sebagai berikut:
complies with RFC 6455 (The WebSocket Protocol),
works on Java SE 1.5+ and Android,
supports all the frame types (continuation, binary, text, close, ping and pong),
provides a method to send a fragmented frame in addition to methods for unfragmented frames,
provides a method to get the underlying raw socket of a WebSocket to configure it,
provides a method for Basic Authentication,
provides a factory class which utilizes javax.net.SocketFactory interface,
provides a rich listener interface to hook WebSocket events,
has fine-grained error codes for fine-grained controllability on errors,
allows to disable validity checks on RSV1/RSV2/RSV3 bits and opcode of frames,
supports HTTP proxy, especially "Secure WebSocket" (wss) through "Secure Proxy" (https),
and supports RFC 7692 (Compression Extensions for WebSocket), also known as permessage-deflate (not enabled by default).
Arisitektur jaringan client-server
Arsitektur jaringan klien-server kurento room yang saya implementasikan adalah seperti ini:
Android klien => Cloudflare => Server Nginx (sebagai proxy) => server Kurento Room
Kalau kita lihat seperti diatas adalah ada beberapa sertifikat SSL yang perlu disiapkan, yaitu kita harus mendapatkan sertifikat ssl dari cloudflare, server nginx dan server kurento (jika nginx mempunyai sertifikat ssl yang berbeda dengan sertifikat server kurento room yang biasanya dalam format java keystore). Buat satu sertifikat ssl dalam format BKS yang nanti akan kita jadikan untuk proses jabat tangan (handshaking) antara klien (dalam hal ini android) ke server websocket dengan ssl (wss) kurento room tadi. Anda bisa mencari berbagai literatur untuk proses pembuatan sertifikat dalam format BKS ini.
https://superuser.com/questions/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file
http://stackoverflow.com/questions/4065379/how-to-create-a-bks-bouncycastle-format-java-keystore-that-contains-a-client-c
https://www.bouncycastle.org/
https://www.netspaceindia.com/converting-crt-to-cer-to-bks-files/
https://docs.wso2.com/display/EMM200/Generating+a+BKS+File+for+Android
Contoh konfigurasi server kurento room demo dan nginx
server nginx tatapmuka.id
kurento-room-demo.properties
*referensi websocket di nginx
https://www.nginx.com/blog/websocket-nginx/
Perubahan kode sumber (KurentoAPI.java, KurentoRoomAPI.java, JsonRpcWebSocketClient.java)
https://github.com/nubomedia-vtt/kurento-room-client-android (KurentoAPI.java, KurentoRoomAPI.java)
https://github.com/nubomedia-vtt/jsonrpc-ws-android (JsonRpcWebSocketClient.java)
JsonRpcWebSocketClient.java
Contoh Cara penggunaan Koneksi Websocket dengan SSL
Referensi Kurento Room dan Demo kurento room untuk android
https://github.com/Kurento/kurento-room
https://github.com/nubomedia-vtt/nubo-test (Demo kurento room untuk android)