mirror of
https://github.com/twinksoftware/Gearslip.git
synced 2026-11-11 00:12:24 +01:00
tell the car about the Wi-Fi join before TCP
This commit is contained in:
1 parent
fb4b0e2914
commit
6f9fc061e3
1 file changed
+13
-7
@@ -34,8 +34,9 @@ import java.util.UUID
|
|||||||
* <- VersionRequest -> VersionResponse
|
* <- VersionRequest -> VersionResponse
|
||||||
* <- StartRequest {ip, port} -> InfoRequest
|
* <- StartRequest {ip, port} -> InfoRequest
|
||||||
* <- InfoResponse {ssid, password, bssid, security}
|
* <- InfoResponse {ssid, password, bssid, security}
|
||||||
* 3. Join the car's Wi-Fi as a local-only network, so the phone's internet stays on mobile data.
|
* 3. Join the car's Wi-Fi as a local-only network, so the phone's internet stays on mobile data,
|
||||||
* -> StartResponse {status} -> ConnectionStatus {status}
|
* and say so over Bluetooth before connecting:
|
||||||
|
* -> StartResponse {phone ip, status} -> ConnectionStatus {status}
|
||||||
* 4. TCP to {ip, port} over that network, and hand the socket to [onConnected].
|
* 4. TCP to {ip, port} over that network, and hand the socket to [onConnected].
|
||||||
*
|
*
|
||||||
* The Bluetooth channel stays open for the whole drive: the car pings over it, and some cars end
|
* The Bluetooth channel stays open for the whole drive: the car pings over it, and some cars end
|
||||||
@@ -65,7 +66,7 @@ object WirelessLink {
|
|||||||
private const val MSG_PING = 8
|
private const val MSG_PING = 8
|
||||||
private const val MSG_PONG = 9
|
private const val MSG_PONG = 9
|
||||||
|
|
||||||
private const val TCP_TRIES = 5
|
private const val TCP_TRIES = 12 // about a minute: a car's projection listener can start well after its Wi-Fi
|
||||||
private const val WIFI_WAIT_MS = 60_000
|
private const val WIFI_WAIT_MS = 60_000
|
||||||
|
|
||||||
/** Set by the activity: starts a session on the car's socket. */
|
/** Set by the activity: starts a session on the car's socket. */
|
||||||
@@ -248,6 +249,15 @@ object WirelessLink {
|
|||||||
val callback = object : ConnectivityManager.NetworkCallback() {
|
val callback = object : ConnectivityManager.NetworkCallback() {
|
||||||
override fun onAvailable(net: Network) {
|
override fun onAvailable(net: Network) {
|
||||||
log.i("Wi-Fi: joined \"$ssid\"")
|
log.i("Wi-Fi: joined \"$ssid\"")
|
||||||
|
// Real phones report the join over Bluetooth before opening TCP, and some cars
|
||||||
|
// only start listening once they hear it.
|
||||||
|
val phoneIp = manager.getLinkProperties(net)?.linkAddresses
|
||||||
|
?.firstOrNull { it.address is java.net.Inet4Address }?.address?.hostAddress.orEmpty()
|
||||||
|
runCatching {
|
||||||
|
send(output, MSG_START_RESPONSE, Protobuf.stringField(1, phoneIp) + Protobuf.varintField(3, STATUS_SUCCESS))
|
||||||
|
send(output, MSG_CONNECTION_STATUS, Protobuf.varintField(1, STATUS_SUCCESS))
|
||||||
|
log.i("-> StartResponse (phone at $phoneIp), ConnectionStatus: success")
|
||||||
|
}.onFailure { log.w("Bluetooth: couldn't report the Wi-Fi join (${it.message})") }
|
||||||
Thread({ connectTcp(output, name, net, ip, port) }, "gearslip-wireless-tcp").start()
|
Thread({ connectTcp(output, name, net, ip, port) }, "gearslip-wireless-tcp").start()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,10 +290,6 @@ object WirelessLink {
|
|||||||
socket.connect(InetSocketAddress(ip, port), 5_000)
|
socket.connect(InetSocketAddress(ip, port), 5_000)
|
||||||
tcp = socket
|
tcp = socket
|
||||||
log.i("TCP: connected to $ip:$port (try ${attempt + 1})")
|
log.i("TCP: connected to $ip:$port (try ${attempt + 1})")
|
||||||
runCatching {
|
|
||||||
send(output, MSG_START_RESPONSE, Protobuf.varintField(3, STATUS_SUCCESS))
|
|
||||||
send(output, MSG_CONNECTION_STATUS, Protobuf.varintField(1, STATUS_SUCCESS))
|
|
||||||
}
|
|
||||||
val start = onConnected
|
val start = onConnected
|
||||||
if (start == null) {
|
if (start == null) {
|
||||||
log.w("TCP: connected, but nothing is waiting for the socket")
|
log.w("TCP: connected, but nothing is waiting for the socket")
|
||||||
|
|||||||
Reference in new issue
Block a user