Topik ini menjelaskan cara menggunakan SDK untuk .NET guna menghubungkan klien Advanced Message Queuing Protocol (AMQP) ke Alibaba Cloud IoT Platform dan menerima pesan dari IoT Platform melalui fitur langganan sisi server.
Prasyarat
ID grup konsumen yang berlangganan pesan dari suatu topik telah diperoleh.
Anda dapat menggunakan grup konsumen default bernama DEFAULT_GROUP atau membuat grup konsumen di konsol IoT Platform. Untuk informasi lebih lanjut, lihat Kelola Grup Konsumen.
Anda dapat menggunakan grup konsumen untuk berlangganan pesan dari suatu topik. Untuk informasi lebih lanjut, lihat Konfigurasikan Langganan Sisi Server AMQP.
Lingkungan pengembangan
Tabel berikut menjelaskan persyaratan untuk lingkungan pengembangan.
Kerangka kerja | Versi yang didukung |
.NET Framework | 3.5, 4.0, 4.5, atau yang lebih baru |
.NET Micro Framework | 4.2 atau yang lebih baru |
.NET nanoFramework | 1.0 atau yang lebih baru |
.NET Compact Framework | 3.9 atau yang lebih baru |
.Net Core pada Windows 10 dan Ubuntu 14.04 | 1.0 atau yang lebih baru |
Mono | 4.2.1 atau yang lebih baru |
Unduh SDK
Kami merekomendasikan penggunaan pustaka AMQP.Net Lite. Untuk mengunduh pustaka dan melihat petunjuknya, kunjungi AMQP.Net Lite.
Tambahkan dependensi
Tambahkan dependensi berikut ke file packages.config:
<packages>
<package id="AMQPNetLite" version="2.2.0" targetFramework="net47" />
</packages>Kode contoh
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
{
// Titik akhir. Untuk informasi lebih lanjut, lihat topik "Menghubungkan klien AMQP ke IoT Platform".
static string Host = "${YourHost}";
static int Port = 5671;
// Jika pasangan AccessKey dikodekan secara langsung dalam kode proyek, pasangan AccessKey tersebut mungkin terungkap jika kode proyek bocor. Dalam hal ini, sumber daya dalam akun Anda menjadi tidak aman. Contoh kode berikut memberikan contoh tentang cara mendapatkan pasangan AccessKey dari variabel lingkungan. Contoh ini hanya untuk referensi.
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}";
// iotInstanceId: ID instance IoT Platform.
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 + "×tamp=" + timestamp;
// Struktur parameter userName. Untuk informasi lebih lanjut, lihat topik "Menghubungkan klien AMQP ke IoT Platform".
string userName = clientId + "|authMode=aksign,signMethod=hmacmd5,consumerGroupId=" + consumerGroupId
+ ",iotInstanceId=" + iotInstanceId + ",authId=" + AccessKey + ",timestamp=" + timestamp + "|";
// Hitung tanda tangan. Untuk informasi lebih lanjut tentang cara membangun kata sandi, lihat topik "Menghubungkan klien AMQP ke 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);
// Buat koneksi.
ConnectionFactory cf = new ConnectionFactory();
// Gunakan sertifikat TLS lokal jika diperlukan.
//cf.SSL.ClientCertificates.Add(GetCert());
//cf.SSL.RemoteCertificateValidationCallback = ValidateServerCertificate;
cf.SASL.Profile = SaslProfile.External;
cf.AMQP.IdleTimeout = 120000;
// Konfigurasikan parameter cf.AMQP.ContainerId dan cf.AMQP.HostName.
cf.AMQP.ContainerId = "client.1.2";
cf.AMQP.HostName = "contoso.com";
cf.AMQP.MaxFrameSize = 8 * 1024;
var connection = cf.CreateAsync(address).Result;
// Fitur pengecualian koneksi dinonaktifkan.
connection.AddClosedCallback(ConnClosed);
// Terima pesan.
DoReceive(connection);
}
static void DoReceive(Connection connection)
{
// Buat sesi.
var session = new Session(connection);
// Buat tautan penerima dan terima pesan.
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);
// Catatan: Jangan implementasikan logika yang memakan waktu. Jika Anda perlu menentukan logika bisnis, gunakan thread baru. Jika tidak, konsumsi pesan mungkin diblokir. Pesan mungkin dikirim ulang karena latensi konsumsi.
Console.WriteLine("menerima pesan, topik=" + topic + ", messageId=" + messageId + ", isi=" + body);
// Kirim pesan ACK.
link.Accept(message);
});
}
// Jika terjadi pengecualian, klien mencoba menghubungkan ulang ke IoT Platform.
// Anda dapat menggunakan algoritma backoff eksponensial untuk meningkatkan mekanisme penanganan pengecualian dan kebijakan penyambungan ulang.
static void ConnClosed(IAmqpObject _, Error e)
{
Console.WriteLine("terjadi kesalahan: " + e);
if(Count < 3)
{
Count += 1;
Thread.Sleep(IntervalTime * Count);
}
else
{
Thread.Sleep(120000);
}
// Bentuk kembali koneksi.
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;
}
// Algoritma tanda tangan. Nilai valid: hmacmd5, hmacsha1, dan 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);
}
}
}Anda dapat mengonfigurasi parameter dalam kode sebelumnya sesuai dengan deskripsi parameter pada tabel berikut. Untuk informasi lebih lanjut tentang parameter lainnya, lihat Menghubungkan Klien AMQP ke IoT Platform.
Pastikan Anda menentukan nilai parameter yang valid. Jika tidak, klien AMQP gagal terhubung ke IoT Platform.
Parameter | Deskripsi |
Host | Titik akhir yang digunakan oleh klien AMQP untuk menghubungkan ke IoT Platform. Untuk informasi lebih lanjut tentang titik akhir yang dapat Anda tentukan untuk variabel |
AccessKey | Masuk ke konsol IoT Platform, arahkan pointer ke foto profil di sudut kanan atas, lalu klik AccessKey Management untuk mendapatkan ID AccessKey dan rahasia AccessKey. Catatan Jika Anda menggunakan Pengguna Resource Access Management (RAM), Anda harus melampirkan kebijakan AliyunIOTFullAccess ke pengguna RAM. Kebijakan ini memungkinkan pengguna RAM mengelola sumber daya IoT Platform. Jika tidak, koneksi ke IoT Platform gagal. Untuk informasi lebih lanjut, lihat Akses IoT Platform sebagai pengguna RAM. |
AccessSecret | |
consumerGroupId | ID grup konsumen dari instance IoT Platform. Untuk melihat ID grup konsumen, lakukan langkah-langkah berikut: Masuk ke konsol IoT Platform dan klik kartu instance yang ingin Anda kelola. Di panel navigasi di sebelah kiri, pilih . ID grup konsumen ditampilkan di tab Consumer Groups. |
iotInstanceId | ID instance IoT Platform. Anda dapat melihat ID instance di tab Ikhtisar di konsol IoT Platform.
|
clientId | ID klien. Anda harus menentukan ID kustom. ID harus memiliki panjang 1 hingga 64 karakter. Kami merekomendasikan Anda menggunakan pengenal unik sebagai ID klien, seperti UUID, alamat MAC, atau alamat IP server tempat klien berjalan. Setelah klien AMQP terhubung ke IoT Platform dan dimulai, lakukan langkah-langkah berikut untuk melihat detail klien: Masuk ke konsol IoT Platform dan klik kartu instance yang ingin Anda kelola. Di panel navigasi di sebelah kiri, pilih . Pada tab Consumer Groups, temukan grup konsumen yang ingin Anda kelola dan klik View di kolom Tindakan. ID setiap klien ditampilkan di tab Consumer Group Status. Anda dapat menggunakan ID klien untuk mengidentifikasi klien dengan mudah. |
Hasil contoh
Jika informasi serupa dengan output berikut ditampilkan, klien AMQP berhasil terhubung ke IoT Platform dan dapat menerima pesan.

Parameter
Contoh
Deskripsi
topik
/***********/******/thing/event/property/post
Topik yang digunakan untuk mengirimkan properti perangkat.
messageId
2**************7
ID pesan.
isi
{"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}}}
Isi pesan.
Jika informasi serupa dengan output berikut ditampilkan, klien AMQP gagal terhubung ke IoT Platform.

Referensi
Untuk informasi lebih lanjut tentang kode kesalahan yang terkait dengan fitur langganan sisi server, lihat bagian Kode Kesalahan Terkait Pesan dari topik "Log IoT Platform".