物联网平台将设备上报的城市的名称、城市代码、坐标信息(经纬度)、IP地址等信息转发至函数计算(FC),函数计算接入第三方天气服务,然后再将查询到的天气情况发送到指定的Topic中。
操作步骤
- 在物联网平台控制台创建产品和设备,定义发布查询消息和接收查询结果的两个Topic。
- 开发设备端SDK。请参见设备接入Link SDK文档。
- 定义函数代码包。
- 新建工程,引入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如下图所示。
以上函数定义,使用了实现函数计算预留的接口PojoRequestHandler,提供了实现StreamRequestHandler接口的方式。您可以根据自己的需要进行接口选择,请参见函数计算Java使用说明。
- 新建工程,引入JAR包。
- 在函数计算控制台,新建服务和函数。
- 在物联网平台控制台,配置数据转发规则。
- 在实例概览页面,找到对应的实例,单击实例进入实例详情页面。注意 目前华东2(上海)、华北2(北京)、华南1(深圳)地域开通了企业版实例服务。其他地域,请跳过此步骤。
- 选择规则引擎 > 云产品流转 > 创建规则,创建一个规则。
- 单击规则对应的查看,在数据流转规则页,单击编写SQL,编写消息处理SQL。如下图所示。
- 单击添加操作,配置转发操作,将数据转发到函数计算中进行计算处理,请参见数据转发到函数计算。
- 在云产品流转页,单击规则对应的启动,启动规则。
规则启动后,物联网平台将根据规则定义转发相应的消息到函数计算。 - 在实例概览页面,找到对应的实例,单击实例进入实例详情页面。
- 验证天气查询功能。
- 模拟设备登录,并订阅Topic。
- 登录物联网平台控制台,在对应实例下的设备详情页的Topic列表中,单击发布查询天气消息的Topic对应的发布消息,输入测试信息,进行试验查询。说明 因为规则SQL中定义了筛选消息中city、cityid、cityCode、location、ip字段,可根据任一字段查询当地天气情况。
- 查看设备端是否接收到天气消息。
- 模拟设备登录,并订阅Topic。