diff options
Diffstat (limited to 'Software/Android_Studio/Tango.Integration')
9 files changed, 182 insertions, 23 deletions
diff --git a/Software/Android_Studio/Tango.Integration/build.gradle b/Software/Android_Studio/Tango.Integration/build.gradle index dc482d641..255fce0f6 100644 --- a/Software/Android_Studio/Tango.Integration/build.gradle +++ b/Software/Android_Studio/Tango.Integration/build.gradle @@ -43,4 +43,8 @@ dependencies { compile globalDependencies.dagger compile globalDependencies.daggerAndroid implementation project(':Tango.PMR') + implementation project(':Tango.Transport') + implementation project(':Tango.Core') + implementation project(':Tango.DAL') + implementation project(':Tango.Web') } diff --git a/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml b/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml index b57dcb665..81958ad3d 100644 --- a/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml +++ b/Software/Android_Studio/Tango.Integration/src/main/AndroidManifest.xml @@ -2,5 +2,6 @@ package="com.twine.tango.integration"> <uses-permission android:name="android.permission.INTERNET"/> + <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> </manifest> diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java index 7d69ce8ad..9963f295b 100644 --- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/IMachineOperator.java @@ -1,9 +1,12 @@ package com.twine.tango.integration.operators; +import com.twine.tango.transport.ITransporter; + /** * Created by Roy on 12/23/2017. */ -public interface IMachineOperator +public interface IMachineOperator extends ITransporter { + } diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java index 0eb73cab3..f23c8c705 100644 --- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java @@ -1,9 +1,20 @@ package com.twine.tango.integration.operators; +import com.twine.tango.transport.ITransportAdapter; +import com.twine.tango.transport.transporters.ProtoTransporter; + /** * Created by Roy on 12/23/2017. */ -public class MachineOperator +public class MachineOperator extends ProtoTransporter implements IMachineOperator { + public MachineOperator() + { + } + + public MachineOperator(ITransportAdapter adapter) + { + super(adapter); + } } diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java index 3e35be9d0..547a17e50 100644 --- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/IMachineIdentityProvider.java @@ -1,4 +1,4 @@ -package com.twine.tango.integration; +package com.twine.tango.integration.providers; /** diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java index 29cb0c30c..b4f2d3c4d 100644 --- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/providers/MachineIdentityProvider.java @@ -1,4 +1,4 @@ -package com.twine.tango.integration; +package com.twine.tango.integration.providers; /** diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java index f1702ee9e..709d5a271 100644 --- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java @@ -1,35 +1,60 @@ package com.twine.tango.integration.services; +import android.content.Context; +import android.net.DhcpInfo; +import android.net.wifi.WifiManager; +import android.os.StrictMode; import android.os.SystemClock; +import android.provider.SyncStateContract.Constants; +import android.util.Log; import com.elvishew.xlog.XLog; +import com.google.protobuf.GeneratedMessageV3; +import com.twine.tango.core.ContextHelper; import com.twine.tango.core.IEventHandler; +import com.twine.tango.integration.operators.IMachineOperator; +import com.twine.tango.integration.providers.IMachineIdentityProvider; import com.twine.tango.pmr.MessageFactory; +import com.twine.tango.pmr.TangoMessage; import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer; import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType; +import com.twine.tango.pmr.integration.ExternalBridgeUdpDiscoveryPacketOuterClass.ExternalBridgeUdpDiscoveryPacket; +import com.twine.tango.pmr.integration.ExternalClientLoginRequestOuterClass.ExternalClientLoginRequest; +import com.twine.tango.pmr.integration.ExternalClientLoginResponseOuterClass.ExternalClientLoginResponse; +import com.twine.tango.transport.ITransportAdapter; import com.twine.tango.transport.adapters.TcpTransportAdapter; import com.twine.tango.transport.transporters.ProtoTransporter; import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + import static br.com.zbra.androidlinq.Linq.stream; /** * Created by Roy on 12/22/2017. */ -public class TangoBridgeService extends ProtoTransporter implements ITangoBridgeService +public class ExternalBridgeService extends ProtoTransporter implements IExternalBridgeService { private ServerSocket listener; private boolean isStarted; private List<HandlerAndType> handlers; + private IMachineIdentityProvider identityProvider; + private IMachineOperator machineOperator; - public TangoBridgeService() + @Inject + public ExternalBridgeService(IMachineIdentityProvider identityProvider, IMachineOperator machineOperator) { + this.identityProvider = identityProvider; + this.machineOperator = machineOperator; handlers = new ArrayList<>(); } @@ -43,8 +68,63 @@ public class TangoBridgeService extends ProtoTransporter implements ITangoBridge public void start() throws IOException { listener = new ServerSocket(1984); + isStarted = true; Thread listenerThread = new Thread(this::listenerThreadMethod); + Thread discoveryThread = new Thread(this::discoveryThreadMethod); listenerThread.start(); + discoveryThread.start(); + } + + private void discoveryThreadMethod() + { + // Hack Prevent crash (sending should be done using an async task) + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.setThreadPolicy(policy); + + byte[] packet = ExternalBridgeUdpDiscoveryPacket.newBuilder().setSerialNumber(identityProvider.getSerialNumber()).build().toByteArray(); + + while (isStarted) + { + try + { + DatagramSocket socket = new DatagramSocket(); + socket.setBroadcast(true); + + //First try to send to emulator host... + DatagramPacket sendPacket = new DatagramPacket(packet, packet.length, InetAddress.getByName("10.0.2.2"), 8888); + socket.send(sendPacket); + + //This will not work on the emulator as far as I know. + //TODO: This needs to be tested on a real device! + sendPacket = new DatagramPacket(packet, packet.length, InetAddress.getByName("255.255.255.255"), 8888); + socket.send(sendPacket); + + } catch (IOException e) + { + XLog.e(e); + } + + SystemClock.sleep(5000); + } + } + + private InetAddress getBroadcastAddress() throws IOException + { + WifiManager wifi = (WifiManager) ContextHelper.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + assert wifi != null; + DhcpInfo dhcp = wifi.getDhcpInfo(); + + if (dhcp != null) + { + int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; + byte[] quads = new byte[4]; + for (int k = 0; k < 4; k++) + quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); + return InetAddress.getByAddress(quads); + } else + { + return null; + } } @Override @@ -86,37 +166,98 @@ public class TangoBridgeService extends ProtoTransporter implements ITangoBridge if (newSocket != null) { + for (ITransportAdapter adapter : getAdapters()) + { + adapter.disconnect().blockingAwait(); + } getAdapters().clear(); - getAdapters().add(new TcpTransportAdapter(newSocket)); - connect(); + TcpTransportAdapter adapter = new TcpTransportAdapter(newSocket); + adapter.setAuthenticated(false); + getAdapters().add(adapter); + connect().blockingAwait(); } } catch (IOException e) { - + XLog.e(e); } SystemClock.sleep(100); } + + disconnect().blockingAwait(); } @Override - protected void onRequestReceived(MessageContainer request) + protected void onRequestReceived(MessageContainer container) { - super.onRequestReceived(request); - + super.onRequestReceived(container); + try { - Object message = MessageFactory.parseMessageFromContainerAgnostic(request); - - List<HandlerAndType> receivers = stream(handlers).where((x) -> x.messageType == request.getType()).toList(); - - for (HandlerAndType receiver : receivers) + if (container.getType() == MessageType.ExternalClientLoginRequest) { - //noinspection unchecked - receiver.handler.invoke(this, message); + ExternalClientLoginRequest request = MessageFactory.parseMessageFromContainer(container); + if (request.getKey().equals("1234")) + { + getAdapters().get(0).setAuthenticated(true); + sendResponse(MessageFactory.createTangoMessage( + ExternalClientLoginResponse.class, + ExternalClientLoginResponse.newBuilder().setAuthenticated(true).build(), + container.getToken())); + } else + { + getAdapters().get(0).setAuthenticated(false); + sendResponse(MessageFactory.createTangoMessage( + ExternalClientLoginResponse.class, + ExternalClientLoginResponse.newBuilder().setAuthenticated(false).build(), + container.getToken())); + } + + return; } - + + if (getAdapters().get(0).isAuthenticated()) + { + GeneratedMessageV3 message = MessageFactory.parseMessageFromContainerAgnostic(container); + + List<HandlerAndType> receivers = stream(handlers).where((x) -> x.messageType == container.getType()).toList(); + + if (receivers.size() > 0) + { + for (HandlerAndType receiver : receivers) + { + //noinspection unchecked + receiver.handler.invoke(this, new MessageReceivedArgs(container, message)); + } + } else + { + //Route to machine... + if (container.getContinuous()) + { + machineOperator.sendContinuousRequest(MessageFactory.createTangoMessage(container, message)).subscribe((response) -> + { + sendResponse((TangoMessage<? extends GeneratedMessageV3>) response); + }, (ex) -> + { + + }); + } else + { + machineOperator.sendRequest(MessageFactory.createTangoMessage(container, message)).subscribe((response) -> + { + sendResponse((TangoMessage<? extends GeneratedMessageV3>) response); + }, (ex) -> + { + + }); + } + } + } else + { + XLog.w("Message received from an unauthorized adapter!"); + } + } catch (Exception e) { XLog.e(e); diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java index 32abe3365..5a2aed9aa 100644 --- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/IExternalBridgeService.java @@ -11,7 +11,7 @@ import java.io.IOException; * Created by Roy on 12/22/2017. */ -public interface ITangoBridgeService extends ITransporter +public interface IExternalBridgeService extends ITransporter { boolean isStarted(); void start() throws IOException; diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java index ed15c9b7b..0f3d98982 100644 --- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java +++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/SynchronizationService.java @@ -29,7 +29,6 @@ public class SynchronizationService implements ISynchronizationService private IMachineIdentityProvider machineIdentityProvider; private IExternalBridgeService bridgeService; - /** * Instantiates a new Tango synchronizer. * @@ -40,7 +39,7 @@ public class SynchronizationService implements ISynchronizationService { this.machineIdentityProvider = machineIdentityProvider; this.bridgeService = bridgeService; - this.bridgeService.registerMessageHandler(this::handleCalculateRequest, MessageType.CalculateRequest); + //this.bridgeService.registerMessageHandler(this::handleCalculateRequest, MessageType.CalculateRequest); } private void handleCalculateRequest(Object o, MessageReceivedArgs<CalculateRequest> e) |
