文档

使用SDK开发

更新时间:

物联网平台提供各类设备端SDK,支持您使用SDK开发设备。本文介绍使用物联网平台提供的Java SDK开发设备。

前提条件

已在物联网平台云端创建产品和设备,并获取设备证书(ProductKey、DeviceName和DeviceSecret)。具体操作,请参见云端配置

背景信息

实际开发中,请根据开发时使用的语言、平台,选用合适的设备端SDK。更多信息,请参见下载设备端SDK。本示例使用Java SDK开发设备。

准备工作

示例代码

说明

为了避免初始化时订阅大量Alink协议中系统Topic带来的性能开销,平台提供了免订阅能力,即物联网平台帮设备进行Topic订阅。Topic相关说明,请参见什么是Topic

  1. 下载Java SDK Demo,然后解压。

  2. 修改src/main/java/com.aliyun.alink.devicesdk.demo目录下ThingSample.java文件中上报属性、上报事件和监听下行服务的代码,内容如下。

    • 上报属性

          public void reportDemoProperty(){
              /**
               * 上报属性
               */
              Map<String, ValueWrapper> properties = new HashMap<String, ValueWrapper>();
      
              // key为物模型中属性标识符"acOutMeterIty",value需要遵循属性值规范:int类型,取值范围在0~200之间;
              properties.put("acOutMeterIty", new ValueWrapper(10));
      
              LinkKit.getInstance().getDeviceThing().thingPropertyPost(properties, new IPublishResourceListener() {
      
                  @Override
                  public void onSuccess(String s, Object o) {
                      System.out.println("=====thingPropertyPost success=======");
                      System.out.println(s);
                      System.out.println(JSON.toJSONString(o));
                  }
      
                  @Override
                  public void onError(String s, AError aError) {
                      System.out.println("=====thingPropertyPost failure=======");
                  }
              });
      
              // 上报属性之后,云端会返回响应结果,此处是监听云端返回的属性reply
              LinkKit.getInstance().registerOnNotifyListener(new IConnectNotifyListener() {
      
                  @Override
                  public void onNotify(String s, String s1, AMessage aMessage) {
                      System.out.println("===PROPERTY REPLY===");
                      System.out.println("TOPIC:" + s1);
                      System.out.println("Payload:" + JSON.toJSONString(aMessage));
                  }
      
                  @Override
                  public boolean shouldHandle(String s, String s1) {
                      return false;
                  }
      
                  @Override
                  public void onConnectStateChange(String s, ConnectState connectState) {
                  }
              });
          }
    • 上报事件

      public void reportDemoEvent() {
              /**
               * 上报事件
               */
              HashMap<String, ValueWrapper> eventMap = new HashMap<String, ValueWrapper>();
      
              // key为物模型中事件参数的标识符"gunNum", value为事件参数值需要遵循数值规范:int类型,取值范围0~100之间;
              eventMap.put("gunNum", new ValueWrapper.IntValueWrapper(50));
      
              OutputParams eventOutput = new OutputParams(eventMap);
      
              // 参数identity为"startChaResEvt"属于物模型事件标识符。
              LinkKit.getInstance().getDeviceThing().thingEventPost("startChaResEvt", eventOutput, new IPublishResourceListener() {
                  public void onSuccess(String resId, Object o) {
                      System.out.println("=====thingEventPost success=======");
                      System.out.println(resId);
                      System.out.println(JSON.toJSONString(o));
                  }
      
                  public void onError(String resId, AError aError) {
                      System.out.println("=====thingEventPost failure=======");
                  }
              });
          }
    • 监听下行服务

          private ITResRequestHandler mCommonHandler = new ITResRequestHandler() {
              public void onProcess(final String identify, final Object result, final ITResResponseCallback itResResponseCallback) {
                  ALog.d(TAG, "onProcess() called with: s = [" + identify + "], o = [" + result + "], itResResponseCallback = [" + itResResponseCallback + "]");
                  try {
                      /**
                       * 设置属性(property)的模式
                       */
                      // "set"为设置属性默认的标识符
                      if ("set".equals(identify)) {
                          // TODO 用户需要设置真实设备的属性
                          /**
                           * 向云端同步设置好的属性值
                           */
                          Map<String, ValueWrapper> desiredProperty = (Map<String, ValueWrapper>) ((InputParams) result).getData();
      
                          LinkKit.getInstance().getDeviceThing().thingPropertyPost(desiredProperty, new IPublishResourceListener() {
      
                              @Override
                              public void onSuccess(String s, Object o) {
                                  if (result instanceof InputParams) {
                                      Map<String, ValueWrapper> data = (Map<String, ValueWrapper>) ((InputParams) result).getData();
                                      //                        data.get()
                                      ALog.d(TAG, "收到异步下行数据 " + data);
                                      // 响应云端接收数据成功
                                      itResResponseCallback.onComplete(identify, null, null);
                                  } else {
                                      itResResponseCallback.onComplete(identify, null, null);
                                  }
                              }
      
                              @Override
                              public void onError(String s, AError aError) {
                                  AError error = new AError();
                                  error.setCode(100);
                                  error.setMsg("setPropertyFailed.");
                                  itResResponseCallback.onComplete(identify, new ErrorInfo(error), null);
                              }
                          });
      
                          /**
                           * 服务(service)的模式
                           */
                          // "startChaResService"为服务的标识符
                      } else if ("startChaResService".equals(identify)) {
      
                          Map<String, ValueWrapper> inputParams = (Map<String, ValueWrapper>) ((InputParams) result).getData();
                          // TODO 根据服务入参inputParams执行设备逻辑,比如启动充电
                          // 充电完成后,向云端返回输出参数
                          OutputParams outputParams = new OutputParams();
                          // key为"charm"属于物模型中"startChaResService"服务出参标识符,value为出参值遵循数据规范:int类型,数据范围1~100之间;
                          outputParams.put("charm", new ValueWrapper.IntValueWrapper(20));
      
                          itResResponseCallback.onComplete(identify, null, outputParams);
      
                      } else {
                          // 根据不同的服务做不同的处理,跟具体的服务有关系
                          OutputParams outputParams = new OutputParams();
                          // 根据特定服务,按照服务规范返回服务的出参。
                          itResResponseCallback.onComplete(identify, null, outputParams);
                      }
                  } catch (Exception e) {
                      e.printStackTrace();
                      ALog.d(TAG, "云端返回数据格式异常");
                  }
              }
      
              public void onSuccess(Object o, OutputParams outputParams) {
                  ALog.d(TAG, "onSuccess() called with: o = [" + o + "], outputParams = [" + outputParams + "]");
                  ALog.d(TAG, "注册服务成功");
              }
      
              public void onFail(Object o, ErrorInfo errorInfo) {
                  ALog.d(TAG, "onFail() called with: o = [" + o + "], errorInfo = [" + errorInfo + "]");
                  ALog.d(TAG, "注册服务失败");
              }
          };
  3. 在device_id.json文件中配置设备证书信息(productKeydeviceNamedeviceSecret)。

      "productKey": "*****",
      "deviceName": "*****",
      "deviceSecret": "*************",
  4. 在src/main/java/com.aliyun.alink.devicesdk.demo目录下HelloWorld.java文件中,配置MQTT接入域名。具体内容,请参见查看实例终端节点

    config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883";
  5. 运行HelloWorld.java文件。

    代码运行成功后:

    • 上报属性成功,云端返回如下REPLY信息,表示设备与物联网平台成功进行通信。云端返回的REPLY信息

    • 设备收到属性设置指令,在物理设备上修改属性完成后,建议将新属性同步上报到云端。

后续步骤

设备调试

  • 本页导读 (1)
文档反馈