から任意の機構や方法またはエンドポイントのアプリケーションからのKAAサーバーへ(KAA SDK)の接続を検出するための手順があります。は、KAAサーバーに接続されているかいないアプリケーション
ノーならば、どのように我々は、遠隔を通じて、障害デバイスを特定できますか?またはフィールドにデバイスを配備した後にKAAサーバと通信できないデバイスを特定する方法はありますか?
どのようにIOTのパワーをロック解除するためにこの要件を達成できますか?
から任意の機構や方法またはエンドポイントのアプリケーションからのKAAサーバーへ(KAA SDK)の接続を検出するための手順があります。は、KAAサーバーに接続されているかいないアプリケーション
ノーならば、どのように我々は、遠隔を通じて、障害デバイスを特定できますか?またはフィールドにデバイスを配備した後にKAAサーバと通信できないデバイスを特定する方法はありますか?
どのようにIOTのパワーをロック解除するためにこの要件を達成できますか?
起こります。
だからあなたはあなた自身のフェイルオーバー戦略を定義し、あなたの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にクラスKaaAdminManagerでAdminClient
を使用してのより多くの例を見ることができます。
を知ることはKaa Data Collection機能と連動してKaa Notificationsを使用して
*がKaa Data Collection機能を有効に活用するには、(Kaa Admin UIに)選択されたログアペンダの設定で、このようなメタデータを追加する必要があります。「エンドポイントのキーハッシュ」(「エンドポイントID」と同じ)、「タイムスタンプ」を。これにより、エンドポイントから受信したすべてのログレコードに必要なフィールドが自動的に追加されます。
私はSDKに直接それを決定する方法があるかどうかを自分自身をKAAする新しいとわからないんだけど、回避策はあなたが定期的に他のすべてのイベントを送信し、そこから余分なエンドポイントを持っている可能性があることです応答を期待します。エンドポイントが応答しない場合、問題があることがわかります。あなたのエンドポイントがKAAサーバーに「フェイルオーバー」を接続するいくつかの問題を満たしています場合
しかし、何万台ものデバイスがKAAサーバに接続されているのはどうでしょうか。あなたはこのアプローチが働いていると思いますか? –
Andrey氏のおかげでありがたいことですが、これはフィールド上のエンドポイント内でイベントを引き起こします。エンドポイント(KAA SDK)を遠隔から(オフィス、Webポータル、モバイルアプリケーション)またはオンライン/オフラインエンドポイント。 KAAサーバからこの要件を達成するための機能や方法がありますか? –
ありがとう、アンドレア。 –