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

前提条件

操作步骤

  1. 在物联网平台控制台创建产品和设备,定义发布查询消息和接收查询结果的两个Topic。
    1. 登录物联网平台控制台
    2. 实例概览页面,找到对应的实例,单击实例进入实例详情页面。
      注意 目前华东2(上海)、华北2(北京)、华南1(深圳)地域开通了企业版实例服务。其他地域,请跳过此步骤。
      实例概览
    3. 选择设备管理 > 产品 > 创建产品,创建一个产品,请参见创建产品
    4. 选择设备管理 > 设备 > 添加设备,在刚创建的产品下注册一个设备,请参见单个创建设备
    5. 产品管理页,单击产品对应的查看
    6. 产品详情页,选择Topic类列表 > 自定义Topic > 定义Topic类,定义查询天气和接收查询结果的Topic。Topic如下图所示。
      自定义Topic
  2. 开发设备端SDK。
  3. 定义函数代码包。
    • 新建工程,引入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.83
      org.apache.httpcomponents
      httpclient
      4.2.1
      org.apache.httpcomponents
      httpcore
      4.2.1
      commons-lang
      commons-lang
      2.6
                                  
    • 定义函数业务逻辑。

      函数中的业务逻辑:

      • 根据城市的信息,查询城市的天气情况。
      • 使用阿里云市场上提供的天气查询服务。
      • 将查询结果通过物联网平台提供的服务端API转发到设备的Topic中。
      
      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();
              }
              // 初始化SDK客户端。
              client = new DefaultAcsClient(profile);
          }
      
      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如下图所示。
      自定义model

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

  4. 函数计算控制台,新建服务和函数。
    1. 创建服务,请参见创建服务
    2. 创建函数,请参见创建函数
    3. 创建函数后,自动跳转到代码执行页签,上传您定义好的函数代码包。测试函数是否能正确执行。
  5. 物联网平台控制台,配置数据转发规则。
    1. 实例概览页面,找到对应的实例,单击实例进入实例详情页面。
      注意 目前华东2(上海)、华北2(北京)、华南1(深圳)地域开通了企业版实例服务。其他地域,请跳过此步骤。
      实例概览
    2. 选择规则引擎 > 云产品流转 > 创建规则,创建一个规则。
    3. 单击规则对应的查看,在数据流转规则页,单击编写SQL,编写消息处理SQL。如下图所示。
      编写SQL
    4. 单击添加操作,配置转发操作,将数据转发到函数计算中进行计算处理,请参见数据转发到函数计算
      添加操作
    5. 云产品流转页,单击规则对应的启动,启动规则。
    规则启动后,物联网平台将根据规则定义转发相应的消息到函数计算。
  6. 验证天气查询功能。
    1. 模拟设备登录,并订阅Topic。
      订阅Topic
    2. 登录物联网平台控制台,在对应实例下的设备详情页的Topic列表中,单击发布查询天气消息的Topic对应的发布消息,输入测试信息,进行试验查询。
      说明 因为规则SQL中定义了筛选消息中city、cityid、cityCode、location、ip字段,可根据任一字段查询当地天气情况。
      发布消息
    3. 查看设备端是否接收到天气消息。
      接收到天气消息