2016-10-26 25 views
4

から任意の機構や方法またはエンドポイントのアプリケーションからのKAAサーバーへ(KAA SDK)の接続を検出するための手順があります。は、KAAサーバーに接続されているかいないアプリケーション

ノーならば、どのように我々は、遠隔を通じて、障害デバイスを特定できますか?またはフィールドにデバイスを配備した後にKAAサーバと通信できないデバイスを特定する方法はありますか?

どのようにIOTのパワーをロック解除するためにこの要件を達成できますか?

答えて

5

起こります。

だからあなたはあなた自身のフェイルオーバー戦略を定義し、あなたのKAAのクライアントのためにそれを設定する必要があります。フェールオーバーが発生するたびに、戦略のonFialover()メソッドが呼び出されます。

Java SDKのコード例を以下に示します。

import org.kaaproject.kaa.client.DesktopKaaPlatformContext; 
    import org.kaaproject.kaa.client.Kaa; 
    import org.kaaproject.kaa.client.KaaClient; 
    import org.kaaproject.kaa.client.SimpleKaaClientStateListener; 
    import org.kaaproject.kaa.client.channel.failover.FailoverDecision; 
    import org.kaaproject.kaa.client.channel.failover.FailoverStatus; 
    import org.kaaproject.kaa.client.channel.failover.strategies.DefaultFailoverStrategy; 
    import org.kaaproject.kaa.client.exceptions.KaaRuntimeException; 
    import org.slf4j.Logger; 
    import org.slf4j.LoggerFactory; 

    import java.io.IOException; 
    import java.util.concurrent.TimeUnit; 

    /** 
    * A demo application that shows how to use the Kaa credentials API. 
    */ 
    public class CredentialsDemo { 
    private static final Logger LOG = LoggerFactory.getLogger(CredentialsDemo.class); 
    private static KaaClient kaaClient; 

    public static void main(String[] args) throws InterruptedException, IOException { 

    LOG.info("Demo application started"); 

    try { 

    // Create a Kaa client and add a startup listener 
    kaaClient = Kaa.newClient(new DesktopKaaPlatformContext(), new SimpleKaaClientStateListener() { 
    @Override 
    public void onStarted() { 
    super.onStarted(); 
    LOG.info("Kaa client started"); 
    } 
    }, true); 

    kaaClient.setFailoverStrategy(new CustomFailoverStrategy()); 
    kaaClient.start(); 

    // ... Do some work ... 

    LOG.info("Stopping application."); 
    kaaClient.stop(); 

    } catch (KaaRuntimeException e) { 
    LOG.info("Cannot connect to server - no credentials found."); 
    LOG.info("Stopping application."); 
    } 

    } 

    // Give a possibility to manage device behavior when it loses connection 
    // or has other problems dealing with Kaa server. 
    private static class CustomFailoverStrategy extends DefaultFailoverStrategy { 

    @Override 
    public FailoverDecision onFailover(FailoverStatus failoverStatus) { 
    LOG.info("Failover happen. Failover type: " + failoverStatus); 

    // See enum DefaultFailoverStrategy from package org.kaaproject.kaa.client.channel.failover 
    // to list all possible values 
    switch (failoverStatus) { 
    case CURRENT_BOOTSTRAP_SERVER_NA: 
    LOG.info("Current Bootstrap server is not available. Trying connect to another one."); 

    // ... Do some recovery, send notification messages, etc. ... 

    // Trying to connect to another bootstrap node one-by-one every 5 seconds 
    return new FailoverDecision(FailoverDecision.FailoverAction.USE_NEXT_BOOTSTRAP, 5L, TimeUnit.SECONDS); 
    default: 
    return super.onFailover(failoverStatus); 
    } 
    } 
    } 
    } 

UPDATED (2016年10月28日)

サーバ側から、以下のコードでメソッドcheckCredentialsStatus()に示すように、あなたは、エンドポイントの資格情報の状態を確認することができます。ステータス​​は、エンドポイントに少なくとも1回の接続試行が成功したことを示します。

は、残念ながら現在のKAAバージョンでエンドポイントは、サーバーに接続されているかどうかを直接確認するための何の方法がありません。コード例の後に記述します。

package org.kaaproject.kaa.examples.credentials.kaa; 

    import org.kaaproject.kaa.common.dto.ApplicationDto; 
    import org.kaaproject.kaa.common.dto.admin.AuthResultDto; 
    import org.kaaproject.kaa.common.dto.credentials.CredentialsStatus; 
    import org.kaaproject.kaa.examples.credentials.utils.IOUtils; 
    import org.kaaproject.kaa.server.common.admin.AdminClient; 
    import org.slf4j.Logger; 
    import org.slf4j.LoggerFactory; 

    import java.util.List; 

    public class KaaAdminManager { 

    private static final Logger LOG = LoggerFactory.getLogger(KaaAdminManager.class); 

    private static final int DEFAULT_KAA_PORT = 8080; 
    private static final String APPLICATION_NAME = "Credentials demo"; 

    public String tenantAdminUsername = "admin"; 
    public String tenantAdminPassword = "admin123"; 

    private AdminClient adminClient; 

    public KaaAdminManager(String sandboxIp) { 
    this.adminClient = new AdminClient(sandboxIp, DEFAULT_KAA_PORT); 
    } 

    // ... 

    /** 
    * Check credentials status for getting information 
    * @return credential status 
    */ 
    public void checkCredentialsStatus() { 
    LOG.info("Enter endpoint ID:"); 

    // Reads endpoint ID (aka "endpoint key hash") from user input 
    String endpointId = IOUtils.getUserInput().trim(); 

    LOG.info("Getting credentials status..."); 
    try { 
    ApplicationDto app = getApplicationByName(APPLICATION_NAME); 
    String appToken = app.getApplicationToken(); 

    // CredentialsStatus can be: AVAILABLE, IN_USE, REVOKED 
    // if endpoint is not found on Kaa server, exception will be thrown 
    CredentialsStatus status = adminClient.getCredentialsStatus(appToken, endpointId); 
    LOG.info("Credentials for endpoint ID = {} are now in status: {}", endpointId, status.toString()); 
    } catch (Exception e) { 
    LOG.error("Get credentials status for endpoint ID = {} failed. Error: {}", endpointId, e.getMessage()); 
    } 
    } 

    /** 
    * Get application object by specified application name 
    */ 
    private ApplicationDto getApplicationByName(String applicationName) { 
    checkAuthorizationAndLogin(); 

    try { 
    List<ApplicationDto> applications = adminClient.getApplications(); 
    for (ApplicationDto application : applications) { 
    if (application.getName().trim().equals(applicationName)) { 
    return application; 
    } 
    } 
    } catch (Exception e) { 
    LOG.error("Exception has occurred: " + e.getMessage()); 
    } 
    return null; 
    } 

    /** 
    * Checks authorization and log in 
    */ 
    private void checkAuthorizationAndLogin() { 
    if (!checkAuth()) { 
    adminClient.login(tenantAdminUsername, tenantAdminPassword); 
    } 
    } 

    /** 
    * Do authorization check 
    * @return true if user is authorized, false otherwise 
    */ 
    private boolean checkAuth() { 
    AuthResultDto.Result authResult = null; 
    try { 
    authResult = adminClient.checkAuth().getAuthResult(); 
    } catch (Exception e) { 
    LOG.error("Exception has occurred: " + e.getMessage()); 
    } 
    return authResult == AuthResultDto.Result.OK; 
    } 

    } 

あなたはGitHubの上KAA sample-apps projectからCredentials Demo ApplicationにクラスKaaAdminManagerAdminClientを使用してのより多くの例を見ることができます。

を知ることはKaa Data Collection機能と連動してKaa Notificationsを使用して

  1. 回避策。サーバーは、(エンドポイントIDを使用して)エンドポイントに特定のユニキャスト通知を送信し、エンドポイントはデータ収集機能でデータを送信します。サーバーはちょっと待って、エンドポイントの最後のアペンダーレコード(通常はデータベース内)のタイムスタンプを(エンドポイントIDごとに)チェックします。すべてのメッセージは非同期で処理されるので、実際の環境に応じて応答待ち時間を選択する必要があります。
  2. Kaa Data Collection機能のみを使用してください。この方法は簡単ですが、パフォーマンス上の欠点があります。エンドポイントがKaaサーバーにデータを送信する必要がある場合(センサーなどの測定)、この機能を使用できます。エンドポイントは定期的にサーバーにデータを送信するだけです。エンドポイントが「オンライン」であるかどうかを確認する必要がある場合、エンドポイントID(キーハッシュ)によって最後のレコードを取得し、タイムスタンプフィールドを分析するために保存されたデータログ(通常はデータベース)を照会します。

*がKaa Data Collection機能を有効に活用するには、(Kaa Admin UIに)選択されたログアペンダの設定で、このようなメタデータを追加する必要があります。「エンドポイントのキーハッシュ」(「エンドポイントID」と同じ)、「タイムスタンプ」を。これにより、エンドポイントから受信したすべてのログレコードに必要なフィールドが自動的に追加されます。

+0

Andrey氏のおかげでありがたいことですが、これはフィールド上のエンドポイント内でイベントを引き起こします。エンドポイント(KAA SDK)を遠隔から(オフィス、Webポータル、モバイルアプリケーション)またはオンライン/オフラインエンドポイント。 KAAサーバからこの要件を達成するための機能や方法がありますか? –

+0

ありがとう、アンドレア。 –

0

私はSDKに直接それを決定する方法があるかどうかを自分自身をKAAする新しいとわからないんだけど、回避策はあなたが定期的に他のすべてのイベントを送信し、そこから余分なエンドポイントを持っている可能性があることです応答を期待します。エンドポイントが応答しない場合、問題があることがわかります。あなたのエンドポイントがKAAサーバーに「フェイルオーバー」を接続するいくつかの問題を満たしています場合

+0

しかし、何万台ものデバイスがKAAサーバに接続されているのはどうでしょうか。あなたはこのアプローチが働いていると思いますか? –

関連する問題