首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测端点(KAA SDK)是否从应用程序连接到KAA服务器?

如何检测端点(KAA SDK)是否从应用程序连接到KAA服务器?
EN

Stack Overflow用户
提问于 2016-10-26 04:40:06
回答 2查看 909关注 0票数 4

是否有任何机制或方法或步骤来检测从应用程序到KAA服务器的端点(KAA SDK)连接。

如果没有,那么我们如何通过远程识别故障设备??或者,在部署设备之后,如何识别无法与KAA服务器通信的设备?

如何才能达到这一要求,解锁IOT的力量??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-27 15:41:38

如果您的端点将遇到连接到Kaa服务器的一些问题,就会发生“故障转移”。

因此,您必须定义自己的故障转移策略,并将其设置为您的Kaa客户端。每次发生故障转移时,都会调用策略的onFialover()方法。

下面可以看到Java的代码示例。

代码语言:javascript
复制
  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);
  }
  }
  }
  }

更新(2016/10/28)

服务器端,您可以检查端点凭据状态,如下面代码中的方法checkCredentialsStatus()所示。状态IN_USE显示端点至少有一次成功的连接尝试。

不幸的是,在当前的Kaa版本中,没有直接检查端点是否连接到服务器的方法。我在代码示例之后描述它们。

代码语言:javascript
复制
  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;
  }

  }

您可以从Kaa 示例应用程序项目 on AdminClient中看到在凭据演示应用中的KaaAdminManager类中使用GitHub的更多示例。

知道解决问题的方法

  1. 结合使用Kaa通知Kaa数据收集特性。服务器向端点发送特定的单播通知(使用端点ID),然后端点答复发送具有数据收集功能的数据。服务器稍等片刻,检查最后一个附录记录的时间戳(通常在数据库中),以确定端点(按端点ID)。所有消息都是异步的,因此您必须根据实际环境选择响应-等待时间。
  2. 仅使用Kaa数据收集功能。该方法简单,但具有一定的性能缺陷。如果端点必须将数据发送到Kaa服务器(测量传感器等),则可以使用它。端点只是定期向服务器发送数据。当服务器需要检查端点是否“在线”时,它会查询保存的数据日志(通常是数据库),以获得端点ID (键散列)的最后记录,并分析时间戳字段。

*为了有效地利用Kaa数据收集特性,您必须在选定的Log的设置中添加这样的元数据(在Kaa Admin UI中):“端点键散列”(与“端点ID”相同)、“时间戳”。这将自动将所需字段添加到从端点接收的每个日志记录中。

票数 5
EN

Stack Overflow用户

发布于 2016-10-26 14:43:29

我对Kaa本人并不熟悉,也不确定SDK中是否有一种方法可以直接确定这一点,但有一个解决办法是,您可以有一个额外的端点,您可以从该端点定期向所有其他端点发送一个事件,并期望得到答复。当端点不响应时,您知道存在问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40253865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档