阿里云物联网平台NET SDK实现RRPC服务端调用

简介: 本文介绍如何使用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 {

<span class="hljs-comment">// 设备三元组信息</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> productKey = <span class="hljs-string">"a16MX******"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> deviceName = <span class="hljs-string">"RRPC******"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> deviceSecret = <span class="hljs-string">"Ayq069ifWO7WOmwKyswNLv6E********"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> regionId = <span class="hljs-string">"cn-shanghai"</span>;

<span class="hljs-comment">// RRPC 系统Topic</span>
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> subTopic = <span class="hljs-string">"/sys/"</span> + productKey + <span class="hljs-string">"/"</span> + deviceName+ <span class="hljs-string">"/rrpc/request/+"</span>;
private <span class="hljs-keyword">static</span> MqttClient mqttClient;

public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span> [] args) {

    initAliyunIoTClient();

    <span class="hljs-comment">// RRPC订阅Topic</span>
    <span class="hljs-keyword">try</span> {
        mqttClient.subscribe(subTopic);
    } <span class="hljs-keyword">catch</span> (MqttException e) {
        e.printStackTrace();
    }

    mqttClient.setCallback(<span class="hljs-keyword">new</span> MqttCallback() {
        @Override
        public <span class="hljs-keyword">void</span> connectionLost(Throwable cause) {
            System.out.println(<span class="hljs-string">"connectionLost:"</span> + cause.getMessage());
        }

        @Override
        public <span class="hljs-keyword">void</span> messageArrived(<span class="hljs-built_in">String</span> topic, MqttMessage message) throws Exception {
            System.out.println(<span class="hljs-string">"message: "</span> + <span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>(message.getPayload()));
            System.out.println(<span class="hljs-string">"topic:"</span> + topic);

            <span class="hljs-comment">// 根据RRPC请求消息Topic,构建RRPC响应消息Topic</span>
            <span class="hljs-built_in">String</span> responseTopic = topic.replace(<span class="hljs-string">"request"</span>,<span class="hljs-string">"response"</span>);
            MqttMessage message1 = <span class="hljs-keyword">new</span> MqttMessage(<span class="hljs-string">"resonse demo"</span>.getBytes(<span class="hljs-string">"utf-8"</span>));
            mqttClient.publish(responseTopic, message1);
        }

        @Override
        public <span class="hljs-keyword">void</span> deliveryComplete(IMqttDeliveryToken token) {
        }
    });
}

<span class="hljs-comment">/***
 * 初始化Client
 */</span>
private <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> initAliyunIoTClient() {

    <span class="hljs-keyword">try</span> {
        <span class="hljs-built_in">String</span> clientId = <span class="hljs-string">"java"</span> + System.currentTimeMillis();

        <span class="hljs-built_in">Map</span>&lt;<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>&gt; params = <span class="hljs-keyword">new</span> HashMap&lt;&gt;(<span class="hljs-number">16</span>);
        params.put(<span class="hljs-string">"productKey"</span>, productKey);
        params.put(<span class="hljs-string">"deviceName"</span>, deviceName);
        params.put(<span class="hljs-string">"clientId"</span>, clientId);
        <span class="hljs-built_in">String</span> timestamp = <span class="hljs-built_in">String</span>.valueOf(System.currentTimeMillis());
        params.put(<span class="hljs-string">"timestamp"</span>, timestamp);

        <span class="hljs-comment">// cn-shanghai</span>
        <span class="hljs-built_in">String</span> targetServer = <span class="hljs-string">"tcp://"</span> + productKey + <span class="hljs-string">".iot-as-mqtt."</span> + regionId + <span class="hljs-string">".aliyuncs.com:1883"</span>;

        <span class="hljs-built_in">String</span> mqttclientId = clientId + <span class="hljs-string">"|securemode=3,signmethod=hmacsha1,timestamp="</span> + timestamp + <span class="hljs-string">"|"</span>;
        <span class="hljs-built_in">String</span> mqttUsername = deviceName + <span class="hljs-string">"&amp;"</span> + productKey;
        <span class="hljs-built_in">String</span> mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, <span class="hljs-string">"hmacsha1"</span>);

        connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);

    } <span class="hljs-keyword">catch</span> (Exception e) {
        System.out.println(<span class="hljs-string">"initAliyunIoTClient error "</span> + e.getMessage());
    }
}

public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> connectMqtt(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> clientId, <span class="hljs-built_in">String</span> mqttUsername, <span class="hljs-built_in">String</span> mqttPassword) throws Exception {

    MemoryPersistence persistence = <span class="hljs-keyword">new</span> MemoryPersistence();
    mqttClient = <span class="hljs-keyword">new</span> MqttClient(url, clientId, persistence);
    MqttConnectOptions connOpts = <span class="hljs-keyword">new</span> MqttConnectOptions();
    <span class="hljs-comment">// MQTT 3.1.1</span>
    connOpts.setMqttVersion(<span class="hljs-number">4</span>);
    connOpts.setAutomaticReconnect(<span class="hljs-literal">false</span>);
    connOpts.setCleanSession(<span class="hljs-literal">true</span>);

    connOpts.setUserName(mqttUsername);
    connOpts.setPassword(mqttPassword.toCharArray());
    connOpts.setKeepAliveInterval(<span class="hljs-number">60</span>);

    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
{

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Program</span>
</span>{
    <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> Main(string[] args)
    {
        <span class="hljs-comment">// ak,sk https://yq.aliyun.com/articles/693979</span>
        IClientProfile profile = DefaultProfile.GetProfile(<span class="hljs-string">"cn-shanghai"</span>, <span class="hljs-string">"LTAIOZZg********"</span>, <span class="hljs-string">"v7CjUJCMk7j9aKduMAQLjy********"</span>);
        DefaultAcsClient client = <span class="hljs-keyword">new</span> DefaultAcsClient(profile);
        client.SetConnectTimeoutInMilliSeconds(<span class="hljs-number">8000</span>);<span class="hljs-comment">// 设置 Client 连接超时时间,默认是5S,RRPC响应超过5S是必须设置</span>
        <span class="hljs-keyword">var</span> request = <span class="hljs-keyword">new</span> RRpcRequest();
        request.Timeout = <span class="hljs-number">8000</span>;
        <span class="hljs-comment">// 设置设备三元组信息</span>
        request.DeviceName = <span class="hljs-string">"RRPC******"</span>;
        request.RequestBase64Byte = <span class="hljs-string">"5raI5oGv5LiL6KGM5rWL6K+V"</span>;  <span class="hljs-comment">// 消息下行测试 base64编码内容</span>
        request.ProductKey = <span class="hljs-string">"a16MX******"</span>;

        <span class="hljs-keyword">try</span>
        {
            <span class="hljs-keyword">var</span> response = client.GetAcsResponse(request);
            Console.WriteLine(Encoding.Default.GetString(response.HttpResponse.Content));
            Console.ReadKey();
        }
        <span class="hljs-keyword">catch</span> (ServerException e)
        {
            Console.WriteLine(<span class="hljs-string">"ServerException:"</span>);
            Console.WriteLine(e);
            Console.ReadKey();
        }
        <span class="hljs-keyword">catch</span> (ClientException e)
        {
            Console.WriteLine(<span class="hljs-string">"ClientException: "</span>);
            Console.WriteLine(e);
            Console.ReadKey();
        }
    }
}

}


4、测试情况


  • 4.1 设备端

_


  • 4.2 云端

_


参考链接


基于开源Java MQTT Client的阿里云物联网平台RRPC功能测试

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
27天前
|
存储 安全 物联网
.NET 跨平台工业物联网网关解决方案
【9月更文挑战第28天】本文介绍了利用 .NET 构建跨平台工业物联网网关的解决方案。通过 .NET Core 和多种通信协议(如 MQTT 和 Modbus),实现工业设备的高效接入和数据采集。系统架构包括设备接入层、数据处理层、通信层、应用层和数据库层,确保数据的准确采集、实时处理和安全传输。此外,还详细阐述了设备身份认证、数据加密及安全审计等机制,确保系统的安全性。该方案适用于不同操作系统和工业环境,具备高度灵活性和扩展性。
|
18天前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
15 0
|
2月前
|
缓存 运维 前端开发
阿里云云效操作报错合集之如何解决在使用流水线构建net8应用时遇到无法构建的报错
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
3月前
|
开发框架 前端开发 应用服务中间件
部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
|
3月前
|
人工智能 物联网 开发者
**.NET技术革新赋能软件开发:从.NET 5的性能飞跃、跨平台支持,到微服务、物联网、AI和游戏开发的广泛应用。
【7月更文挑战第4天】**.NET技术革新赋能软件开发:从.NET 5的性能飞跃、跨平台支持,到微服务、物联网、AI和游戏开发的广泛应用。随着云集成深化、开源社区壮大,未来将聚焦性能优化、云原生应用及新兴技术融合,培养更多开发者,驱动软件创新。**
139 1
|
5月前
【开源视频联动物联网平台】vertx写一个mqtt服务端
【开源视频联动物联网平台】vertx写一个mqtt服务端
130 1
|
5月前
|
存储 运维 网络协议
【开源物联网平台】物联网设备上云提供开箱即用接入SDK
IOTDeviceSDK是物联网平台提供的设备端软件开发工具包,可简化开发过程,实现设备快速接入各大物联网平台。设备厂商获取SDK后,根据需要选择相应功能进行移植,即可快速集成IOTDeviceSDK,实现设备的接入。
251 0
|
消息中间件 物联网 Java
[笔记]阿里云物联网之业务服务端(java、php)接入阿里云平台(一)
[笔记]阿里云物联网之业务服务端(java、php)接入阿里云平台
364 1
|
12月前
|
对象存储
.net core 阿里云接口之拷贝文件
紧接上文, 1)[.net core 阿里云接口之获取临时访问凭证](https://developer.aliyun.com/article/1363447?spm=a2c6h.12873639.article-detail.7.2b0e5b1cpeWbZ5 ".net core 阿里云接口之获取临时访问凭证") 2)[.net core 阿里云接口之将指定的OSS文件下载到流](https://developer.aliyun.com/article/1363886 ".net core 阿里云接口之将指定的OSS文件下载到流") 本文继续阿里云接口调用,将指定的OSS文件下载到流。
64 0
|
12月前
|
C# 对象存储
.net core 阿里云接口之将指定的OSS文件下载到流
紧接上文,[.net core 阿里云接口之获取临时访问凭证](https://developer.aliyun.com/article/1363447?spm=a2c6h.13262185.profile.8.180876540j71A9 ".net core 阿里云接口之获取临时访问凭证") 本文继续阿里云接口调用,将指定的OSS文件下载到流。 直接上代码: ```csharp /// <summary> /// 将指定的OSS文件下载到流 /// </summary> /// <param name="args"></param> /// <returns></returns> [H
270 0

相关产品

  • 物联网平台