Pustaka ini dimaksudkan untuk digunakan dengan aplikasi Universal Windows Platform (UWP) apa pun yang perlu berkomunikasi dengan aplikasi lain. Saya menggunakannya secara luas di aplikasi Windows IoT pribadi saya yang berjalan di Raspberry Pis.
DiscoveryClient dapat ditambahkan ke aplikasi apa pun hanya dengan dua baris:
var discoveryClient = new DiscoveryClient("1234", "4567");
discoveryClient.Initialize("My Unique Name", serializableStateObject);
Baris pertama akan membuat instance klien dengan port TCP dan UDP yang diinginkan untuk dioperasikan. Baris kedua menetapkan nama unik perangkat ini dan penunjuk ke objek yang menyimpan semua informasi status perangkat. Disarankan agar Anda menggunakan JObject. Setelah inisiasi, perangkat akan mengirimkan paket IDENTIFIKASI dan paket DISCOVER untuk menemukan semua perangkat lain di jaringan.
Setelah klien diinisialisasi, Anda dapat mengakses perangkat berdasarkan namanya menggunakan LINQ:
var iotDevice = discoveryClient.Devices.FirstOrDefault(device => device.Name == "iotDeviceName");
Setelah Anda memiliki objek, Anda memiliki akses ke Nama, Alamat Ip, dan Info Perangkat - objek yang berisi informasi apa pun yang disediakan perangkat.
string iotDeviceIpAddress = iotDevice.IpAddress;
string iotDeviceName = iotDevice.Name;
JObject iotDeviceInfo = iotDevice.DeviceInfo;
Debug.WriteLine($"{iotDevice.Name} at {iotDevice.IpAddress} has a state of {iotDevice.DeviceInfo.GetValue<string>("state")}");
Karena klien mengidentifikasi saat permulaan dan mencoba menemukan perangkat lain, semuanya seharusnya berfungsi :) tetapi karena kita hidup di dunia nyata, Anda mungkin ingin mengirim permintaan penemuan secara berkala untuk memastikan Anda mengetahui semua perangkat lain. Anda dapat melakukannya dengan fungsi Discover().
var discoveryTimer = new Timer((state) =>
{
discoveryClient.Discover();
}, null, 0, 30000);
Memanggil Discover() menyiarkan pesan UDP dengan daftar perangkat yang dikenal. Tiap perangkat akan melihat daftarnya dan merespons jika perangkat tersebut tidak ada atau jika alamat IP-nya telah berubah. Ini juga berarti nama perangkat harus unik.
Terkadang Anda ingin mengetahui kapan perangkat ditambahkan atau kapan status perangkat diperbarui. Klien menggunakan observasi System.Reactive yang dapat Anda langgani:
Ketika Perangkat Ditambahkan
using System.Reactive.Linq;
using System.Threading;
var whenDeviceAdded = discoveryClient
.WhenDeviceAdded
.ObserveOn(SynchronizationContext.Current)
.Subscribe(device =>
{
Debug.WriteLine("A device was added");
});
Saat Perangkat Diperbarui
using System.Reactive.Linq;
using System.Threading;
var whenDeviceUpdated = discoveryClient
.WhenDeviceUpdated
.ObserveOn(SynchronizationContext.Current)
.Subscribe(device =>
{
Debug.WriteLine("A device was updated");
});
ObserveOn(SynchronizationContext.Current) digunakan untuk memastikan bahwa kode berjalan di thread UI. Jangan lupa untuk membuang langganan setelah selesai ;)
Setelah perangkat ditemukan, pesan dapat dikirim langsung ke perangkat tersebut. Ini dilakukan dengan menggunakan TCP untuk memastikan bahwa pesan terkirim. Setiap perangkat menjalankan rest api ringan yang mendengarkan pesan masuk. Sebuah pesan bisa sesederhana karakter tetapi lebih berguna jika mengirimkan objek berseri.
Kirim Pesan Langsung
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
var jMessage = new JObject();
jMessage.Add("powerLevel", 100);
var success = await discoveryClient.SendDirectMessage("myDevice", jMessage.ToString());
Ketika DirectMessage
using System.Reactive.Linq;
using System.Threading;
var whenDirectMessage = discoveryClient
.WhenDirectMessage
.ObserveOn(SynchronizationContext.Current)
.Subscribe(message => {
var jMessage = JObject.Parse(message);
var powerLevel = message.GetValue<int>("powerLevel");
});