Gunakan .NET SDK untuk menghubungkan klien AMQP ke Alibaba Cloud IoT Platform dan menerima pesan langganan sisi server.
Prasyarat
Anda telah memperoleh ID kelompok konsumen dan berlangganan ke pesan topik yang diperlukan.
Kelola kelompok konsumen AMQP: Anda dapat menggunakan kelompok konsumen default (DEFAULT_GROUP) di IoT Platform atau membuat kelompok konsumen baru.
Konfigurasikan langganan sisi server AMQP: Berlangganan ke pesan topik yang diperlukan menggunakan kelompok konsumen.
Lingkungan pengembangan
Tabel berikut mencantumkan framework dan versi yang didukung.
|
Framework |
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 pustaka AMQP.Net Lite. Untuk mengunduh pustaka dan melihat instruksinya, 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 selengkapnya, lihat Hubungkan klien AMQP ke IoT Platform.
static string Host = "${YourHost}";
static int Port = 5671;
// Menyimpan ID AccessKey dan Rahasia AccessKey secara langsung dalam kode menimbulkan risiko keamanan. Kami menyarankan agar Anda menggunakan Variabel lingkungan untuk menyimpan kredensial Anda. Contoh ini menunjukkan cara mengambil ID AccessKey dan Rahasia AccessKey dari Variabel lingkungan.
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}";
// ID instans.
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;
// Untuk informasi tentang cara menyusun parameter userName, lihat Hubungkan klien AMQP ke IoT Platform.
string userName = clientId + "|authMode=aksign,signMethod=hmacmd5,consumerGroupId=" + consumerGroupId
+ ",iotInstanceId=" + iotInstanceId + ",authId=" + AccessKey + ",timestamp=" + timestamp + "|";
// Hitung signature. Untuk informasi tentang cara menyusun password, lihat Hubungkan 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();
// Opsional: Gunakan sertifikat TLS lokal.
//cf.SSL.ClientCertificates.Add(GetCert());
//cf.SSL.RemoteCertificateValidationCallback = ValidateServerCertificate;
cf.SASL.Profile = SaslProfile.External;
cf.AMQP.IdleTimeout = 120000;
// Sesuaikan 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;
// Daftarkan callback untuk menangani penutupan koneksi.
connection.AddClosedCallback(ConnClosed);
// Terima pesan.
DoReceive(connection);
}
static void DoReceive(Connection connection)
{
// Buat session.
var session = new Session(connection);
// Buat receiver link untuk menerima 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: Hindari tugas berdurasi panjang dalam callback ini. Jika Anda perlu menjalankan logika bisnis, jalankan di thread terpisah. Hal ini mencegah konsumen diblokir, yang dapat menyebabkan pengiriman ulang pesan.
Console.WriteLine("receive message, topic=" + topic + ", messageId=" + messageId + ", body=" + body);
// Akui pesan tersebut.
link.Accept(message);
});
}
// Jika terjadi error koneksi, klien akan mencoba menghubungkan ulang.
// Ini adalah contoh retry sederhana. Untuk lingkungan produksi, pertimbangkan untuk menerapkan strategi penghubungan ulang yang lebih andal, seperti 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);
}
// Hubungkan ulang.
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;
}
// Metode signature. Algoritma yang didukung: 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);
}
}
}
Konfigurasikan parameter dalam kode di atas sesuai penjelasan pada tabel berikut. Untuk informasi selengkapnya, lihat Hubungkan klien AMQP ke IoT Platform.
Tentukan nilai parameter yang valid. Jika tidak, klien AMQP gagal terhubung ke IoT Platform.
|
Parameter |
Deskripsi |
|
Host |
Titik akhir koneksi AMQP. Untuk informasi selengkapnya tentang titik akhir yang dapat Anda tentukan untuk variabel |
|
AccessKey |
Login ke Konsol IoT Platform, arahkan kursor ke ikon profil di pojok kanan atas, lalu klik AccessKey Management untuk memperoleh ID AccessKey dan Rahasia AccessKey. Catatan
Jika Anda menggunakan Pengguna RAM, Anda harus menyambungkan kebijakan AliyunIOTFullAccess ke Pengguna RAM tersebut untuk memberikan izin mengelola sumber daya IoT Platform. Jika tidak, koneksi akan gagal. Untuk informasi selengkapnya, lihat Akses IoT Platform sebagai Pengguna RAM. |
|
AccessSecret |
|
|
consumerGroupId |
ID kelompok konsumen dalam instans IoT Platform. Login ke Konsol IoT Platform. Di instans yang sesuai, buka untuk melihat ID kelompok konsumen Anda. |
|
iotInstanceId |
ID instans. Anda dapat menemukan nilai ini di tab Overview di Konsol IoT Platform.
|
|
clientId |
ID klien. Anda harus menentukan ID ini sendiri. Panjang ID maksimal 64 karakter. Kami menyarankan agar Anda menggunakan pengidentifikasi unik, seperti UUID, alamat MAC, atau alamat IP server tempat klien AMQP Anda berada. Setelah klien AMQP terhubung dan mulai berjalan, login ke Konsol IoT Platform. Di tab Consumer Groups pada halaman untuk instans tersebut, klik View di sebelah kelompok konsumen. Halaman Consumer Group Details akan menampilkan parameter ini. Hal ini membantu Anda mengidentifikasi klien yang berbeda. |
Hasil contoh
-
Berhasil: Output berikut menunjukkan koneksi berhasil dan penerimaan pesan.
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"}Parameter
Contoh
Deskripsi
topic
/***********/******/thing/event/property/post
Topik untuk mengirimkan properti perangkat.
messageId
2**************7
ID pesan.
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}}}
Isi pesan.
-
Gagal: Output berikut menunjukkan koneksi gagal.
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.
Referensi
Untuk informasi selengkapnya tentang kode kesalahan pesan langganan sisi server, lihat Kode kesalahan terkait pesan.