物联网平台将设备上报的城市的名称、城市代码、坐标信息(经纬度)、IP地址等信息,转发至函数计算(FC),函数计算接入第三方天气服务,然后再将查询到的天气情况发送到指定的Topic中。

前提条件

操作步骤

  1. 在物联网平台控制台创建产品和设备,定义发布查询消息和接收查询结果的两个Topic。
    1. 登录物联网平台控制台
    2. 选择设备管理 > 产品 > 创建产品,创建一个产品。
    3. 选择设备管理 > 设备 > 添加设备,在刚创建的产品下注册一个设备。
    4. 产品管理页,单击产品对应的查看按钮。
    5. 产品详情页,选择Topic类列表 > 定义Topic类,定义查询天气和接收查询结果的Topic。Topic如下图所示:
  2. 开发设备端SDK。请参见设备接入Link Kit SDK文档
  3. 定义函数。

    函数中的业务逻辑:

    • 根据城市的信息,查询城市的天气情况。
    • 使用阿里云市场上提供的天气查询服务。
    • 将查询结果通过物联网平台提供的服务端API转发到设备的Topic中。
    • 新建工程,引入jar包:
      
      com.aliyun.fc.runtime
      fc-java-core
      1.0.0
      com.aliyun
      aliyun-java-sdk-core
      3.2.10
      com.aliyun
      aliyun-java-sdk-iot
      4.0.0
      com.alibaba
      fastjson
      1.2.25
      org.apache.httpcomponents
      httpclient
      4.2.1
      org.apache.httpcomponents
      httpcore
      4.2.1
      commons-lang
      commons-lang
      2.6
      								
    • 代码逻辑:
      
      public class FcToApiDemo implements PojoRequestHandler {
      private static String host = "http://jisutqybmf.market.alicloudapi.com";
      private static String path = "/weather/query";
      private static String method = "GET";
      private static String appcode = "您的appCode";
      private static String accessKey = "您的阿里云账号AccessKey ID";
      private static String accessSecret = "您的阿里云账号AccessKey Secret";
      static DefaultAcsClient client;
      static {
      IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, accessSecret);
      try {
      DefaultProfile.addEndpoint("cn-shanghai", "cn-shanghai", "Iot", "iot.cn-shanghai.aliyuncs.com");
      } catch (ClientException e) {
      e.printStackTrace();
      }
      client = new DefaultAcsClient(profile);// 初始化SDK客户端
      }
      public String handleRequest(CityModel input, Context context) {
      Map headers = new HashMap();
      // 最后在header中的格式(中间是英文空格)为Authorization:APPCODE
      // 83359fd73fe94948385f570e3c13****
      headers.put("Authorization", "APPCODE " + appcode);
      Map querys = new HashMap();
      querys.put("city", input.getCity());
      querys.put("citycode", input.getCityCode());
      querys.put("cityid", input.getCityid());
      querys.put("ip", input.getIp());
      querys.put("location", input.getLocation());
      try {
      /**
      * 重要提示如下: HttpUtils请从
      * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
      * 下载
      *
      * 相应的依赖请参照
      * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
      */
      HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);
      // 将天气查询的结果转发到topic中
      Boolean result = pub(EntityUtils.toString(response.getEntity()));
      return result.toString();
      } catch (Exception e) {
      e.printStackTrace();
      }
      return "error";
      }
      public static Boolean pub(String msg) {
      try {
      PubRequest request = new PubRequest();
      request.setProductKey("您的产品productKey");
      request.setTopicFullName("接收天气查询结果的topic");
      request.setMessageContent(Base64.encodeBase64String(msg.getBytes()));
      request.setQos(1);
      PubResponse response = client.getAcsResponse(request);
      return response.getSuccess();
      } catch (ServerException e) {
      e.printStackTrace();
      } catch (ClientException e) {
      e.printStackTrace();
      }
      return false;
      }
      }
      其中,自定义model如下图所示:

    以上函数定义,使用了实现函数计算预留的接口PojoRequestHandler,提供了实现StreamRequestHandler接口的方式。您可以根据自己的需要进行接口选择。

    参考文档:JAVA基本概念

  4. 在函数计算控制台,新建服务和函数。
    1. 创建服务。
    2. 创建函数。

      选择空白模板和不创建触发器。基础管理配置信息,上传您定义好的函数代码包。如下图所示。

    3. 测试函数是否能正确执行。
  5. 在物联网平台的控制台,配置数据转发规则。
    1. 选择规则引擎 > 数据流转 > 创建规则,创建一个规则。
    2. 数据流转详情页,编写消息处理SQL。如下图所示:
    3. 配置转发操作,将数据转发到函数计算中进行计算处理。如需帮助,请参见数据转发到函数计算
    4. 数据流转规则列表中,单击规则对应的启动,启动规则。
    规则启动后,物联网平台将根据规则定义转发相应的消息到函数计算。
  6. 验证天气查询功能。
    1. 模拟设备登录,并订阅Topic。
    2. 在物联网篇平台控制台,设备详情页的Topic列表中,单击发布查询天气消息的Topic对应的发布消息,输入测试信息,进行试验查询。
      说明 因为规则SQL中定义了筛选消息中city、cityid、cityCode、location、ip字段,可根据任一字段查询当地天气情况。
    3. 查看设备端是否接收到天气消息。