企业服务器与物联网平台通信——服务端订阅

版权声明:如有错误或侵权,请指正。 https://blog.csdn.net/weixin_44101331/article/details/86504614

一,什么是服务端订阅

服务端可以直接订阅产品下配置的所有类型的消息。

目前,新版物联网平台通过HTTP/2通道进行消息流转。配置HTTP/2服务端订阅后,物联网平台会将消息通过HTTP/2通道推送至服务端。通过接入HTTP/2 SDK,企业服务器可以直接从物联网平台接收消息。HTTP/2 SDK提供身份认证、Topic订阅、消息发送和消息接收能力,并支持设备接入和云端接入能力。HTTP/2 SDK适用于物联网平台与企业服务器之间的大量消息流转,也支持设备与物联网平台之间的消息收发。
在这里插入图片描述:旧版物联网平台用户使用阿里云消息服务(MNS)进行消息流转,您可以将服务端订阅方式升级为HTTP/2方式。如果您继续使用在MNS这种方式,物联网平台将设备消息推送至MNS,服务端应用通过监听MNS队列接收设备消息。

二,开发指南(.NET)

介绍如何配置服务端订阅、接入HTTP/2 .NET版SDK、进行身份认证和设置消息接收接口。以下简单介绍服务端订阅的开发流程。有关SDK配置的具体信息,请参考Demo

1,配置服务端订阅

  • 登录物联网平台控制台。
  • 左侧导航栏选择设备管理 > 产品。
  • 在产品列表中,搜索到要配置服务端订阅的产品,并单击该产品对应的查看按钮,进入产品详情页。
  • 单击服务端订阅 > 设置。
  • 选择推送的消息类型。
    在这里插入图片描述
  • 设备上报消息:指产品下所有设备 Topic 列表中,具有发布权限的 Topic 中的消息。勾选后,可以通过 HTTP/2 SDK 接收这些消息。
  • 设备状态变化通知:指一旦该产品下的设备状态变化时通知的消息,例如设备上线、下线的消息。设备状态消息的发送 Topic 为 /as/mqtt/status/${YourProductKey}/${YourDeviceName}。勾选后,可以通过 HTTP/2 SDK 接收设备状态变化的通知消息。

2,接入 SDK

在工程中添加依赖包 iotx-as-http2-net-sdk.dll

3,身份认证

使用服务端订阅功能,需要基于您的阿里云 AccessKey 进行身份认证并建立连接。

建立链接示例如下:

//阿里云accessKey:即您的账号的 AccessKey ID
string accessKey = "xxxxxxxxxxxxxxx";
//阿里云accessSecret:即 AccessKey ID对应的 AccessKey Secret
string accessSecret = "xxxxxxxxxxxxxxx";
//regionId:为您的物联网平台服务地域
string regionId = "cn-shanghai";
//阿里云uid:您的账号 ID
string uid = "xxxxxxxxxxxxxxx";
//domain
string domain = ".aliyuncs.com";
//endpoint
string endpoint = "https://" + uid + ".iot-as-http2." + regionId + domain;

//连接参数配置
Profile profile = new Profile();
profile.AccessKey = accessKey;
profile.AccessSecret = accessSecret;
profile.RegionId = regionId;
profile.Domain = domain;
profile.Url = endpoint;
//清除堆积消息
profile.CleanSession = true;
profile.GetAccessKeyAuthParams();

//构造客户端
IMessageClient client = new MessageClient(profile);

//连接HTTP2通道,并接收消息
client.DoConnection(new DefaultHttp2MessageCallback());

//指定topic回调
client.SetMessageListener("/${YourProductKey}/#", new CustomHttp2MessageCallback());
  • accessKey 即您的账号的 AccessKey ID, accessSecret 即 AccessKey ID对应的 AccessKey Secret。请登录阿里云控制台,将光标移至您的账号头像上,在选项框中选择 accesskeys 查看您的 AccessKey ID 和 AccessKey Secret;选择安全设置查看您的账号 ID。
  • regionId为您的物联网平台服务地域。

4,设置消息接收接口

1,连接建立后,服务端会立即向 SDK 推送已订阅的消息。因此,建立连接时,需要实现消息接收接口。

消息接收接口如下:

public interface IHttp2MessageCallback
{
    ConsumeAction Consume(Http2ConsumeMessage http2ConsumeMessage);
}

2,您需要通过 IHttp2MessageCallback接口的consume方法,来设置消息接收接口。

设置消息接收接口的方法如下:

public class DefaultHttp2MessageCallback : IHttp2MessageCallback
    {
        public DefaultHttp2MessageCallback()
        {
        }
//参数 Http2ConsumeMessage 是消息回执的消息体
        public ConsumeAction Consume(Http2ConsumeMessage http2ConsumeMessage)
        {
            Console.WriteLine("receive : " + http2ConsumeMessage.MessageId);
            //自动回复ACK
            return ConsumeAction.CommitSuccess;
        }
    }

3,参数 Http2ConsumeMessage 是消息回执的消息体。
消息体包含的内容如下:

public class Http2ConsumeMessage
{
    //消息体
    public byte[] Payload { get; set; }
    //Topic
    public string Topic { get; set; }
    //消息ID
    public string MessageId { get; set; }
    //QoS
    public int Qos { get; set; }
    //连接体
    public Http2Connection Connection { get; set; }
}

4messageClient.setMessageListener("/${YourProductKey}/#",messageCallback);用于设置回调。本示例中,设置为指定 Topic 回调。您可以设置为指定 Topic 回调,也可以设置为通用回调。

  • 指定 Topic 回调
    指定 Topic 回调的优先级高于通用回调。一条消息匹配到多个 Topic 时,按字典顺序优先调用,并且仅回调一次。
    设置回调时,可以指定带通配符的 Topic,如 /${YourProductKey}/${YourDeviceName}/#
    示例:
	client.SetMessageListener("/alEddfaXXXX/device1/#",messageCallback);
	//当收到消息的Topic,如"/alEddfaXXXX/device1/update",匹配指定Topic时,会优先调用该回调
  • 通用回调
    未指定 Topic 回调的消息,则调用通用回调。
    设置通用回调方法:
	new DefaultHttp2MessageCallback()

5,设置回复 ACK。
对于 QOS>0 的消息,消费后需要回复 ACK。SDK 支持自动回复 ACK 和手动回复 ACK。默认为自动回复 ACK。本示例中未设置回复 ACK,则默认为自动回复。

  • 自动回复 ACK:设置为自动回复 ACK 后,若 IHttp2MessageCallback.consume 的返回值为 ConsumeAction.CommitSuccess 则 SDK 会发送 ACK;返回 ConsumeAction.CommitFailure 或抛出异常,则不会返回 ACK。对于 QOS>0 且未回复 ACK 的消息,服务端会重新发送。
  • 手动回复 ACK:通过ConsumeAction.CommitFailure设置手动回复 ACK。
    设置为手动回复 ACK 后,需要调用MessageClient.DoAck()方法回复 ACK,参数为 topic、messageId和连接体。 这些参数可以在接收消息中获取到。
    手动回复 ACK 的方法:
	client.DoAck(connection, topic, messageId, delegate);

5,消息体格式

1,设备状态通知:

{
    "status":"online|offline", 		//设备状态,online上线,offline离线
    "productKey":"12345565569",		//设备所属产品的唯一标识
    "deviceName":"deviceName1234",		//设备名称
    "time":"2018-08-31 15:32:28.205",	   //发送通知的时间点
    "utcTime":"2018-08-31T07:32:28.205Z",	//发送通知的UTC时间点
    "lastTime":"2018-08-31 15:32:28.195",	 //状态变更时最后一次通信时间
    "utcLastTime":"2018-08-31T07:32:28.195Z",  //状态变更时最后一次通信的UTC时间
    "clientIp":"123.123.123.123" 		//设备公网出口IP
}

在这里插入图片描述
说明 为避免消息时序紊乱造成影响,建议您根据lastTime来维护最终设备状态。

2,设备生命周期变更:

{
    "action" : "create|delete|enable|disable",
    "iotId" : "4z819VQHk6VSLmmBJfrf00107ee201",
    "productKey" : "12345565569",
    "deviceName" : "deviceName1234",
    "deviceSecret" : "",
    "messageCreateTime": 1510292739881
}

在这里插入图片描述
3,设备拓扑关系变更:

{
    "action" : "add|remove|enable|disable",
    "gwIotId": "4z819VQHk6VSLmmBJfrf00107ee200",
    "gwProductKey": "1234556554",
    "gwDeviceName": "deviceName1234",
    "devices": [
        {
          "iotId": "4z819VQHk6VSLmmBJfrf00107ee201",
          "productKey": "12345565569",
          "deviceName": "deviceName1234"
       }
    ],
    "messageCreateTime": 1510292739881
}

在这里插入图片描述
4,网关发现子设备上报:

{
    "gwIotId":"4z819VQHk6VSLmmBJfrf00107ee200",
    "gwProductKey":"1234556554",
    "gwDeviceName":"deviceName1234",
    "devices":[
        {
            "iotId":"4z819VQHk6VSLmmBJfrf00107ee201",
            "productKey":"12345565569",
            "deviceName":"deviceName1234"
        }
    ]
}

在这里插入图片描述

没有更多推荐了,返回首页