阿里云物联网平台NET SDK实现RRPC服务端调用
概述
MQTT协议是基于PUB/SUB的异步通信模式,不适用于服务端同步控制设备端返回结果的场景。前面博客基于开源Java MQTT Client的阿里云物联网平台RRPC功能测试介绍了RRPC原理,使用Open API实现服务端的调用实现。本文介绍如何使用NET SDK在本地实现RRPC的服务端调用。
Step By Step
1、创建产品与设备
参考链接 准备工作部分。
2、设备端Code
import com.alibaba.taro.AliyunIoTSignUtil; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import java.util.HashMap; import java.util.Map; public class IoTRRPCForSysTopicDemo { // 设备三元组信息 public static String productKey = "a16MX******"; public static String deviceName = "RRPC******"; public static String deviceSecret = "Ayq069ifWO7WOmwKyswNLv6E********"; public static String regionId = "cn-shanghai"; // RRPC 系统Topic private static String subTopic = "/sys/" + productKey + "/" + deviceName+ "/rrpc/request/+"; private static MqttClient mqttClient; public static void main(String [] args) { initAliyunIoTClient(); // RRPC订阅Topic try { mqttClient.subscribe(subTopic); } catch (MqttException e) { e.printStackTrace(); } mqttClient.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { System.out.println("connectionLost:" + cause.getMessage()); } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { System.out.println("message: " + new String(message.getPayload())); System.out.println("topic:" + topic); // 根据RRPC请求消息Topic,构建RRPC响应消息Topic String responseTopic = topic.replace("request","response"); MqttMessage message1 = new MqttMessage("resonse demo".getBytes("utf-8")); mqttClient.publish(responseTopic, message1); } @Override public void deliveryComplete(IMqttDeliveryToken token) { } }); } /*** * 初始化Client */ private static void initAliyunIoTClient() { try { String clientId = "java" + System.currentTimeMillis(); Map<String, String> params = new HashMap<>(16); params.put("productKey", productKey); params.put("deviceName", deviceName); params.put("clientId", clientId); String timestamp = String.valueOf(System.currentTimeMillis()); params.put("timestamp", timestamp); // cn-shanghai String targetServer = "tcp://" + productKey + ".iot-as-mqtt." + regionId + ".aliyuncs.com:1883"; String mqttclientId = clientId + "|securemode=3,signmethod=hmacsha1,timestamp=" + timestamp + "|"; String mqttUsername = deviceName + "&" + productKey; String mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, "hmacsha1"); connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword); } catch (Exception e) { System.out.println("initAliyunIoTClient error " + e.getMessage()); } } public static void connectMqtt(String url, String clientId, String mqttUsername, String mqttPassword) throws Exception { MemoryPersistence persistence = new MemoryPersistence(); mqttClient = new MqttClient(url, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); // MQTT 3.1.1 connOpts.setMqttVersion(4); connOpts.setAutomaticReconnect(false); connOpts.setCleanSession(true); connOpts.setUserName(mqttUsername); connOpts.setPassword(mqttPassword.toCharArray()); connOpts.setKeepAliveInterval(60); mqttClient.connect(connOpts); } }
3、云端Code
- 3.1 SDK安装:
Install-Package aliyun-net-sdk-iot -Version 7.4.0
- 3.2 NET Code
using System; using System.Text; using Aliyun.Acs.Core; using Aliyun.Acs.Core.Exceptions; using Aliyun.Acs.Core.Profile; using Aliyun.Acs.Iot.Model.V20180120; namespace IoTRRPCDemo { class Program { static void Main(string[] args) { // ak,sk https://yq.aliyun.com/articles/693979 IClientProfile profile = DefaultProfile.GetProfile("cn-shanghai", "LTAIOZZg********", "v7CjUJCMk7j9aKduMAQLjy********"); DefaultAcsClient client = new DefaultAcsClient(profile); client.SetConnectTimeoutInMilliSeconds(8000);// 设置 Client 连接超时时间,默认是5S,RRPC响应超过5S是必须设置 var request = new RRpcRequest(); request.Timeout = 8000; // 设置设备三元组信息 request.DeviceName = "RRPC******"; request.RequestBase64Byte = "5raI5oGv5LiL6KGM5rWL6K+V"; // 消息下行测试 base64编码内容 request.ProductKey = "a16MX******"; try { var response = client.GetAcsResponse(request); Console.WriteLine(Encoding.Default.GetString(response.HttpResponse.Content)); Console.ReadKey(); } catch (ServerException e) { Console.WriteLine("ServerException:"); Console.WriteLine(e); Console.ReadKey(); } catch (ClientException e) { Console.WriteLine("ClientException: "); Console.WriteLine(e); Console.ReadKey(); } } } }
4、测试情况
- 4.1 设备端
- 4.2 云端
参考链接
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【阿里云IoT+YF3300】13.阿里云IoT Studio WEB监控界面构建
Web可视化开发是阿里云IoT Studio中比较重要的一个功能,通过可视化拖拽的方式,方便地将各种图表组件与设备相关的数据源关联,无需编程,即可将物联网平台上接入的设备数据可视化展现。 目前支持的组件如下图所示: 通过可视化拖拽的方式,方便地将各种图表组件与设备相关的数据源关联,无需编程,即可将物联网平台上接入的设备数据可视化展现。 我们的对接的硬件平台依然是YF3300,相关的配置如下:当前物联网平台已经直接集成了IoT Studio,如下图所示: 首先我们在阿里云上构建YF3300的物模型,并在此基础上,我们添加温度和湿度这两个属性。 阿里云IoT Studio中的设备管理和物联网平台中的设备管理有些不同,针对IoT Studio来说,是以项目为单位的。产品和设备在同一个项目内是共享的,在不同项目之间是隔离的。
- 下一篇
我们应该怎么样编写 Go 语言库,有哪些标准可以参考?
云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 不久前我和朋友们想出一个主意,准备合并我们的 IRC bots,并用 Go 重写它们。为了防止重写大部分现有功能,我们试图找到支持 bots 程序中使用的 Web API 的现有库。我们的项目需要一个 Reddit API 的库。这篇文章启发于我找到的前三个库,我不打算说出它们的名字,以免羞辱它们的作者。 上面说的每一个库都存在一些基本问题以至于它们在真实场景中不可用。并且每个库都以这样一种方式编写:不以非向后兼容的方式修改现有库的 API,这样是不可能修复问题的。不幸的是,由于很多其他的库也存在同样的问题,所以我会在下面列出一些作者错误的地方。 不要对 HTTP 客户端硬编码 很对库都包含了对 http.DefaultClient 的硬编码。虽然对库本身来说这并不是问题,但是库的作者并未理解应该怎样使用 http.DefaultClient 。正如 default client 建议它只在用户没有提供其他 http.Client 时...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果