Android Open Source - lifx-sdk-android L F X Gateway Discovery Controller






From Project

Back to project page lifx-sdk-android.

License

The source code is released under:

MIT License

If you think the Android project lifx-sdk-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

//
//  LFXGatewayDiscoveryController.java
//  LIFX//from  w  w  w .ja  v  a 2  s .c o m
//
//  Created by Jarrod Boyes on 24/03/14.
//  Copyright (c) 2014 LIFX Labs. All rights reserved.
//

package lifx.java.android.network_context.internal.transport_manager.lan.gateway_discovery;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import lifx.java.android.entities.internal.LFXBinaryPath;
import lifx.java.android.entities.internal.LFXGatewayDescriptor;
import lifx.java.android.entities.internal.LFXMessage;
import lifx.java.android.entities.internal.LFXMessageObservationDescriptor.LFXMessageObserverCallback;
import lifx.java.android.entities.internal.structle.LxProtocolDevice;
import lifx.java.android.entities.internal.structle.LxProtocol.Type;
import lifx.java.android.entities.internal.structle.LxProtocolDevice.Service;
import lifx.java.android.network_context.internal.transport_manager.lan.LFXLANTransportManager;
import lifx.java.android.util.LFXTimerUtils;

public class LFXGatewayDiscoveryController
{
  public enum LFXGatewayDiscoveryMode
  {
    NORMAL,        // 30 seconds
    ACTIVELY_SEARCHING,  // 1 second
  };

  private LFXGatewayDiscoveryControllerListener listener;
  private boolean ended = false;

  // This property will change how often DeviceGetPanGateway messages are broadcast
  private LFXGatewayDiscoveryMode discoveryMode;
  
  public static LFXGatewayDiscoveryController getGatewayDiscoveryControllerWithLANTransportManager( LFXLANTransportManager transportManager, LFXGatewayDiscoveryControllerListener listener)
  {
    LFXGatewayDiscoveryController discoveryTable = new LFXGatewayDiscoveryController();
    discoveryTable.table = new ArrayList<LFXGatewayDiscoveryTableEntry>();
    discoveryTable.transportManager = transportManager;
    discoveryTable.listener = listener;
    
    discoveryTable.transportManager.addMessageObserverObjectWithCallback( discoveryTable, new LFXMessageObserverCallback()
    {
      @Override
      public void run( Object context, LFXMessage message)
      {
        LFXGatewayDiscoveryController discoveryTable = (LFXGatewayDiscoveryController) context;
        
        if( message.getType() != Type.LX_PROTOCOL_DEVICE_STATE_PAN_GATEWAY) 
        {
          return;
        }
        
        discoveryTable.handleStatePANGatewayMessage( message);
      }
    });
    
    discoveryTable.discoveryMode = LFXGatewayDiscoveryMode.NORMAL;
    discoveryTable.configureTimerForDiscoveryMode( discoveryTable.discoveryMode);
    return discoveryTable;
  }

  public interface LFXGatewayDiscoveryControllerListener
  {
    public void gatewayDiscoveryControllerDidUpdateEntry( LFXGatewayDiscoveryController table, LFXGatewayDiscoveryTableEntry tableEntry, boolean entryIsNew);
  }
  
  private Timer discoveryTimer;

  private LFXLANTransportManager transportManager;
  private ArrayList<LFXGatewayDiscoveryTableEntry> table;

  @SuppressWarnings( { "unchecked", "unused" })
  private ArrayList<LFXGatewayDiscoveryTableEntry> getAllGatewayDiscoveryTableEntries()
  {
    return (ArrayList<LFXGatewayDiscoveryTableEntry>) table.clone();
  }

  public void removeAllGatewayDiscoveryTableEntries()
  {
    table.clear();
  }

  public void handleStatePANGatewayMessage( LFXMessage statePanGateway)
  {
    LxProtocolDevice.StatePanGateway statePanGatewayPayload = (LxProtocolDevice.StatePanGateway) statePanGateway.getPayload();
    
    String host = statePanGateway.getSourceNetworkHost();
    int port = (int) statePanGatewayPayload.getPort().getValue();
    LFXBinaryPath path = statePanGateway.getPath();
    Service service = LxProtocolDevice.serviceMap.get( statePanGatewayPayload.getService().getValue());
    
    // TODO: remove to enable TCP
    if( service == Service.LX_PROTOCOL_DEVICE_SERVICE_TCP)
    {
      return;
    }
    
    LFXGatewayDescriptor gatewayDescriptor = LFXGatewayDescriptor.getGatewayDescriptorWithHostPortPathService( host, port, path, service);
    
    LFXGatewayDiscoveryTableEntry tableEntry = null;
    
    for( LFXGatewayDiscoveryTableEntry anEntry : table)
    {
      if( anEntry.getGatewayDescriptor().equals( gatewayDescriptor))
      {
        tableEntry = anEntry;
        break;
      }
    }
    
    if( tableEntry != null)
    {
      tableEntry.setLastDiscoveryResponseDate( statePanGateway.getTimestamp());
      listener.gatewayDiscoveryControllerDidUpdateEntry( this, tableEntry, false);
    }
    else
    {
      tableEntry = new LFXGatewayDiscoveryTableEntry();
      tableEntry.setGatewayDescriptor( gatewayDescriptor);
      tableEntry.setLastDiscoveryResponseDate( statePanGateway.getTimestamp());
      table.add( tableEntry);
      listener.gatewayDiscoveryControllerDidUpdateEntry( this, tableEntry, true);
    }
  }

  public void sendGatewayDiscoveryMessage()
  {
    LFXMessage getPANGateway = LFXMessage.messageWithType( Type.LX_PROTOCOL_DEVICE_GET_PAN_GATEWAY);
    transportManager.sendBroadcastUDPMessage( getPANGateway);
  }

  public void setDiscoveryMode( LFXGatewayDiscoveryMode discoveryMode)
  {
    if( this.discoveryMode == discoveryMode) 
    {
      return;
    }
    this.discoveryMode = discoveryMode;
    configureTimerForDiscoveryMode( discoveryMode);
  }

  private Runnable getDiscoverTimerTask() 
  {
    Runnable discoverTimerTask = new TimerTask() 
    {
        public void run() 
        {
          discoveryTimerDidFire();
        }
    };
    
    return discoverTimerTask;
  }
  
  public void configureTimerForDiscoveryMode( LFXGatewayDiscoveryMode discoveryMode)
  {
    System.out.println( "DISCOVERYMODE: " + discoveryMode);
    
    long duration = 1000;
    switch( discoveryMode)
    {
      case NORMAL:
        duration = 30000;
        break;
      case ACTIVELY_SEARCHING:
        duration = 1000;
        break;
    }
    
    if( discoveryTimer != null)
    {
      discoveryTimer.cancel();
      discoveryTimer.purge();
    }

    System.out.println( "Making Discovery Timer task. Period: " + duration);
    discoveryTimer = LFXTimerUtils.getTimerTaskWithPeriod( getDiscoverTimerTask(), duration, false);
  }

  public void discoveryTimerDidFire()
  {
    if( !ended)
    {
      sendGatewayDiscoveryMessage();
    }
  }
  
  public void shutDown()
  {
    if( discoveryTimer != null)
    {
      discoveryTimer.cancel();
      discoveryTimer.purge();
    }
    
    ended = true;
  }
}




Java Source Code List

com.example.lifx_sdk_samples.LFXSDKLightEditLabelActivity.java
com.example.lifx_sdk_samples.LFXSDKLightListAdapter.java
com.example.lifx_sdk_samples.LFXSDKLightPowerActivity.java
com.example.lifx_sdk_samples.LFXSDKLightRandomColorActivity.java
com.example.lifx_sdk_samples.LFXSDKSamplesActivity.java
com.example.lifx_sdk_samples.LFXSDKTaggedLightCollectionListAdapter.java
lifx.java.android.client.LFXClient.java
lifx.java.android.constant.LFXSDKConstants.java
lifx.java.android.entities.LFXHSBKColor.java
lifx.java.android.entities.LFXLightTarget.java
lifx.java.android.entities.LFXTypes.java
lifx.java.android.entities.internal.LFXBinaryPath.java
lifx.java.android.entities.internal.LFXBinaryTargetID.java
lifx.java.android.entities.internal.LFXBinaryTypes.java
lifx.java.android.entities.internal.LFXDeviceMapping.java
lifx.java.android.entities.internal.LFXGatewayDescriptor.java
lifx.java.android.entities.internal.LFXMessageObservationDescriptor.java
lifx.java.android.entities.internal.LFXMessage.java
lifx.java.android.entities.internal.LFXSiteID.java
lifx.java.android.entities.internal.LFXTagMapping.java
lifx.java.android.entities.internal.LFXTarget.java
lifx.java.android.entities.internal.structle.LxProtocolDevice.java
lifx.java.android.entities.internal.structle.LxProtocolLight.java
lifx.java.android.entities.internal.structle.LxProtocolSensor.java
lifx.java.android.entities.internal.structle.LxProtocolWan.java
lifx.java.android.entities.internal.structle.LxProtocolWifi.java
lifx.java.android.entities.internal.structle.LxProtocol.java
lifx.java.android.entities.internal.structle.Lx.java
lifx.java.android.entities.internal.structle.StructleTypes.java
lifx.java.android.internal.LFXWiFiObserver.java
lifx.java.android.light.LFXLightCollection.java
lifx.java.android.light.LFXLight.java
lifx.java.android.light.LFXTaggedLightCollection.java
lifx.java.android.light.internal.LFXAllLightsCollection.java
lifx.java.android.network_context.LFXNetworkContext.java
lifx.java.android.network_context.internal.routing_table.LFXRoutingTable.java
lifx.java.android.network_context.internal.transport_manager.LFXTransportManager.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXGatewayConnection.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXSocketGeneric.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXSocketTCP.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXSocketUDP.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXTCPGatewayConnection.java
lifx.java.android.network_context.internal.transport_manager.gateway_connection.LFXUDPGatewayConnection.java
lifx.java.android.network_context.internal.transport_manager.lan.LFXLANTransportManager.java
lifx.java.android.network_context.internal.transport_manager.lan.gateway_discovery.LFXGatewayDiscoveryController.java
lifx.java.android.network_context.internal.transport_manager.lan.gateway_discovery.LFXGatewayDiscoveryTableEntry.java
lifx.java.android.util.LFXByteUtils.java
lifx.java.android.util.LFXLog.java
lifx.java.android.util.LFXNetworkUtils.java
lifx.java.android.util.LFXTimerUtils.java