Tous les produits
Search
Centre de documentation

IoT Platform:Connecter un client à IoT Platform à l'aide du SDK pour .NET

Dernière mise à jour :Aug 09, 2026

Utilisez le SDK .NET pour connecter un client AMQP à Alibaba Cloud IoT Platform et recevoir les messages d'abonnement côté serveur.

Prérequis

Vous disposez d'un ID de groupe de consommateurs et êtes abonné aux messages des rubriques requises.

Environnement de développement

Le tableau suivant répertorie les frameworks et versions pris en charge.

Framework

Version prise en charge

.NET Framework

3,5, 4,0, 4,5 ou version ultérieure

.NET Micro Framework

4,2 ou version ultérieure

.NET nanoFramework

1,0 ou version ultérieure

.NET Compact Framework

3,9 ou version ultérieure

.Net Core sur Windows 10 et Ubuntu 14.04

1,0 ou version ultérieure

Mono

4,2,1 ou version ultérieure

Télécharger le SDK

Nous recommandons la bibliothèque AMQP.Net Lite. Pour télécharger la bibliothèque et consulter sa documentation, rendez-vous sur AMQP.Net Lite.

Ajouter la dépendance

Ajoutez la dépendance suivante au fichier packages.config :

<packages>
  <package id="AMQPNetLite" version="2.2.0" targetFramework="net47" />
</packages>

Exemple de code

using System;
using System.Text;
using Amqp;
using Amqp.Sasl;
using Amqp.Framing;
using System.Threading;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Security.Cryptography;
namespace amqp
{
    class MainClass
    {
        // The endpoint. For more information, see Connect an AMQP client to IoT Platform.
        static string Host = "${YourHost}";
        static int Port = 5671;
        // Hardcoding the AccessKey ID and AccessKey Secret in your code poses security risks. We recommend using environment variables to store your credentials. This example demonstrates how to retrieve the AccessKey ID and AccessKey Secret from environment variables.
        static string AccessKey = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID");
        static string AccessSecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        static string consumerGroupId = "${YourConsumerGroupId}";
        static string clientId = "${YourClientId}";
        // The ID of the instance.
        static string iotInstanceId = "${YourIotInstanceId}"; 
        static int Count = 0;
        static int IntervalTime = 10000;
        static Address address;
        public static void Main(string[] args)
        {
            long timestamp = GetCurrentMilliseconds();
            string param = "authId=" + AccessKey + "&timestamp=" + timestamp;
            // For information about how to construct the userName parameter, see Connect an AMQP client to IoT Platform.
            string userName = clientId + "|authMode=aksign,signMethod=hmacmd5,consumerGroupId=" + consumerGroupId
               + ",iotInstanceId=" + iotInstanceId + ",authId=" + AccessKey + ",timestamp=" + timestamp + "|";
            // Calculate the signature. For information about how to construct the password, see Connect an AMQP client to IoT Platform.
            string password = doSign(param, AccessSecret, "HmacMD5");
            DoConnectAmqp(userName, password);
            ManualResetEvent resetEvent = new ManualResetEvent(false);
            resetEvent.WaitOne();
        }
        static void DoConnectAmqp(string userName, string password)
        {
            address = new Address(Host, Port, userName, password);
            // Create a connection.
            ConnectionFactory cf = new ConnectionFactory();
            // Optional: Use a local TLS certificate.
            //cf.SSL.ClientCertificates.Add(GetCert());
            //cf.SSL.RemoteCertificateValidationCallback = ValidateServerCertificate;
            cf.SASL.Profile = SaslProfile.External;
            cf.AMQP.IdleTimeout = 120000;
            // Customize the cf.AMQP.ContainerId and cf.AMQP.HostName parameters.
            cf.AMQP.ContainerId = "client.1.2"; 
            cf.AMQP.HostName = "contoso.com";
            cf.AMQP.MaxFrameSize = 8 * 1024;
            var connection = cf.CreateAsync(address).Result;
            // Register a callback to handle connection closure.
            connection.AddClosedCallback(ConnClosed);
            // Receive messages.
            DoReceive(connection);
        }
        static void DoReceive(Connection connection)
        {
            // Create a session.
            var session = new Session(connection);
            // Create a receiver link to receive messages.
            var receiver = new ReceiverLink(session, "queueName", null);
            receiver.Start(20, (link, message) =>
            {
                object messageId = message.ApplicationProperties["messageId"];
                object topic = message.ApplicationProperties["topic"];
                string body = Encoding.UTF8.GetString((Byte[])message.Body);
                // Note: Avoid long-running tasks in this callback. If you need to perform business logic, run it in a separate thread. This prevents the consumer from being blocked, which can lead to message redelivery.
                Console.WriteLine("receive message, topic=" + topic + ", messageId=" + messageId + ", body=" + body);
                // Acknowledge the message.
                link.Accept(message);
            });
        }
        // If a connection error occurs, the client attempts to reconnect.
        // This is a simple retry example. For production environments, consider implementing a more robust reconnection strategy, such as exponential backoff.
        static void ConnClosed(IAmqpObject _, Error e)
        {
            Console.WriteLine("An error occurred: " + e);
            if(Count < 3)
            {
                Count += 1;
                Thread.Sleep(IntervalTime * Count);
            }
            else
            {
                Thread.Sleep(120000);
            }
            // Reconnect.
            DoConnectAmqp(address.User, address.Password);
        }
        static X509Certificate GetCert()
        {
            string certPath = Environment.CurrentDirectory + "/root.crt";
            X509Certificate crt = new X509Certificate(certPath);
            return crt;
        }
        static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
        static long GetCurrentMilliseconds()
        {
            DateTime dt1970 = new DateTime(1970, 1, 1);
            DateTime current = DateTime.Now;
            return (long)(current - dt1970).TotalMilliseconds;
        }
        // Signature method. Supported algorithms: hmacmd5, hmacsha1, and hmacsha256.
        static string doSign(string param, string accessSecret, string signMethod)
        {
            //signMethod = HmacMD5
            byte[] key = Encoding.UTF8.GetBytes(accessSecret);
            byte[] signContent = Encoding.UTF8.GetBytes(param);
            var hmac = new HMACMD5(key);
            byte[] hashBytes = hmac.ComputeHash(signContent);
            return Convert.ToBase64String(hashBytes);
        }
    }
}

Configurez les paramètres du code précédent comme indiqué dans le tableau suivant. Pour plus d'informations, consultez la section Connecter un client AMQP à IoT Platform.

Important

Spécifiez des valeurs de paramètres valides. Dans le cas contraire, le client AMQP ne parviendra pas à se connecter à IoT Platform.

Paramètre

Description

Host

Le point de terminaison de connexion AMQP.

Pour plus d'informations sur le point de terminaison que vous pouvez spécifier pour la variable ${YourHost}, consultez la rubrique Gérer le point de terminaison d'une instance.

AccessKey

Connectez-vous à la console IoT Platform, placez le curseur sur l'icône de profil en haut à droite, puis cliquez sur AccessKey Management pour obtenir l'ID AccessKey et le secret AccessKey.

Remarque

Si vous utilisez un utilisateur RAM, vous devez attacher la stratégie AliyunIOTFullAccess à cet utilisateur afin de lui accorder les autorisations nécessaires pour gérer les ressources IoT Platform. Dans le cas contraire, la connexion échouera. Pour plus d'informations, consultez la rubrique Accéder à IoT Platform en tant qu'utilisateur RAM.

AccessSecret

consumerGroupId

L'ID du groupe de consommateurs dans l'instance IoT Platform.

Connectez-vous à la console IoT Platform. Dans l'instance correspondante, accédez à Message Forwarding > Server-side Subscription > Consumer Group List pour afficher l'ID de votre groupe de consommateurs.

iotInstanceId

L'ID de l'instance. Vous trouverez cette valeur dans l'onglet Overview de la console IoT Platform.

  • Si un ID d'instance est affiché, définissez ce paramètre sur l'ID de l'instance.

  • Si l'onglet Overview n'est pas affiché ou si votre instance ne possède pas d'ID, laissez ce paramètre vide au format iotInstanceId = "".

clientId

L'ID client. Vous devez définir cet ID. Sa longueur maximale est de 64 caractères. Nous vous recommandons d'utiliser un identifiant unique, tel que l'UUID, l'adresse MAC ou l'adresse IP du serveur sur lequel se trouve votre client AMQP.

Une fois le client AMQP connecté et démarré, connectez-vous à la console IoT Platform. Sur l'onglet Consumer Groups de la page Message Forwarding > > > Server-side Subscription de l'instance, cliquez sur View à côté du groupe de consommateurs. La page Consumer Group Details affiche ce paramètre. Cela vous aide à identifier les différents clients.

Résultats de l'exemple

  • Succès : La sortie suivante indique une connexion réussie et la réception de messages.

    receive message, topic=/xxx/xxx/thing/event/property/post, messageId=xxx, body={"deviceType":"xxx","iotId":"xxx","requestId":"xxx","checkFailedData":{},"productKey":"xxx"}
    receive message, topic=/xxx/xxx/thing/event/property/post, messageId=xxx, body={"deviceType":"xxx","iotId":"xxx","requestId":"xxx","checkFailedData":{},"productKey":"xxx"}
    receive message, topic=/xxx/xxx/thing/event/property/post, messageId=xxx, body={"deviceType":"xxx","iotId":"xxx","requestId":"xxx","checkFailedData":{},"productKey":"xxx"}

    Paramètre

    Exemple

    Description

    topic

    //*/thing/event/property/post

    La rubrique pour la soumission des propriétés de l'appareil.

    messageId

    2****7

    L'ID du message.

    body

    {"deviceType":"CustomCategory","iotId":"4EwuVV","requestId":"161268","checkFailedData":{},"productKey":"g4***S","gmtCreate":1612682173249,"deviceName":"Esensor","items":{"temperature":{"value":-1,"time":1612682173247},"humidity":{"value":74,"time":1612682173247}}}

    Le corps du message.

  • Échec : La sortie suivante indique un échec de la connexion.

    Thread xxx has exited with code 0 (0x0).
    Exception thrown: xxx (in xxx L)
    An unhandled exception of type 'Sys xxx n' occurred in m xxx 11
    One or more errors occurred.

Références

Pour plus d'informations sur les codes d'erreur liés aux messages d'abonnement côté serveur, consultez la section Codes d'erreur liés aux messages.