您的服务端可以使用SDK,通过HTTP/2通道,接收物联网平台推送过来的设备消息。本文档为服务端订阅功能的开发指南,介绍了.NET版本的开发方法。
背景信息
服务端HTTP/2 SDK Demo下载:HTTP/2 SDK(.NET) server side demo。
- 使用Demo程序时,需要使用NLog包。请访问NLog官网下载,建议版本号:4.5.11。
- 使用Demo程序时,请引入最新依赖包。使用依赖包时,需引入Newtonsoft.Json,建议版本号:12.0.2 。
配置服务端订阅
在物联网平台控制台配置要订阅的消息类型。
接入 SDK
在工程中添加依赖包。下载依赖包。
身份认证
使用服务端订阅功能,需要基于您的阿里云AccessKey进行身份认证并建立连接。
建立连接代码示例:
//阿里云accessKey
string accessKey = "xxxxxxxxxxxxxxx";
//阿里云accessSecret
string accessSecret = "xxxxxxxxxxxxxxx";
//regionId
string regionId = "cn-shanghai";
//阿里云uid
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。
登录阿里云控制台,将光标移至账号头像上,然后单击accesskeys,跳转至用户信息管理页,即可获取。 |
accessSecret | 您的账号AccessKey Secret。获取方式同accessKey。 |
uid | 您的账号ID。
用主账号登录阿里云控制台,单击账号头像,跳转至账号管理控制台,即可获取账号UID。 |
regionId | 您的物联网平台服务所在地域代码。
在物联网平台控制台页,右上方即可查看地域(Region)。RegionId的表达方法,请参见地域和可用区。 |
设置消息接收接口
连接建立后,服务端会立即向SDK推送已订阅的消息。因此,建立连接时,需要实现消息接收接口。
public interface IHttp2MessageCallback
{
ConsumeAction Consume(Http2ConsumeMessage http2ConsumeMessage);
}
您需要通过IHttp2MessageCallback接口的consume方法,来设置消息接收接口。
设置消息接收接口的方法如下:
public class DefaultHttp2MessageCallback : IHttp2MessageCallback
{
public DefaultHttp2MessageCallback()
{
}
public ConsumeAction Consume(Http2ConsumeMessage http2ConsumeMessage)
{
Console.WriteLine("receive : " + http2ConsumeMessage.MessageId);
//自动回复ACK
return ConsumeAction.CommitSuccess;
}
}
其中:
-
参数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; } }
各类型消息具体格式,请参见数据格式。
说明 关于设备上下线状态,为避免消息时序紊乱造成影响,建议您根据消息中的lastTime字段来判断最终设备状态。 messageClient.setMessageListener("/${YourProductKey}/#",messageCallback);
用于设置回调。本示例中,设置为指定Topic回调。您可以设置为指定Topic回调,也可以设置为通用回调。
- 指定Topic回调。
指定Topic回调的优先级高于通用回调。一条消息匹配到多个Topic时,按字典顺序优先调用,并且仅回调一次。
设置回调时,可以指定带通配符的Topic,如/${YourProductKey}/${YourDeviceName}/# 。
示例:client.SetMessageListener("/alEddfaXXXX/device1/#",messageCallback); //当收到消息的Topic,如"/alEddfaXXXX/device1/update",匹配指定Topic时,会优先调用该回调
- 通用回调。
未指定Topic回调的消息,则调用通用回调。
设置通用回调方法:new DefaultHttp2MessageCallback()
- 指定Topic回调。
- 设置回复ACK(acknowledgement,即回复确认消息)。
对于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);
在文档使用中是否遇到以下问题
更多建议
匿名提交