هذه المكتبة مخصصة للاستخدام مع أي تطبيق Universal Windows Platform (UWP) الذي يحتاج إلى التواصل مع التطبيقات الأخرى. أستخدمه على نطاق واسع في تطبيقات Windows IoT الشخصية التي تعمل على Raspberry Pis.
يمكن إضافة DiscoveryClient إلى أي تطبيق من خلال سطرين فقط:
var discoveryClient = new DiscoveryClient("1234", "4567");
discoveryClient.Initialize("My Unique Name", serializableStateObject);
سيقوم السطر الأول بإنشاء مثيل للعميل بمنافذ TCP وUDP المطلوبة للعمل عليها. يقوم السطر الثاني بتعيين الاسم الفريد لهذا الجهاز ومؤشر إلى كائن يحمل جميع معلومات الحالة الخاصة بالجهاز. يوصى باستخدام JObject. عند البدء، سيرسل الجهاز حزمة IDENTIFY وحزمة DISCOVER للعثور على كافة الأجهزة الأخرى الموجودة على الشبكة.
بمجرد تهيئة العميل، يمكنك الوصول إلى الأجهزة بأسمائها باستخدام LINQ:
var iotDevice = discoveryClient.Devices.FirstOrDefault(device => device.Name == "iotDeviceName");
بمجرد حصولك على كائن، يمكنك الوصول إلى الاسم وIpAdress وDeviceInfo - وهو كائن يحتوي على أي معلومات يقدمها الجهاز.
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")}");
نظرًا لأن العميل يقوم بالتعرف على الأجهزة الأخرى عند بدء التشغيل ويحاول اكتشافها، فيجب أن يعمل كل شيء :) ولكن نظرًا لأننا نعيش في العالم الحقيقي، فقد ترغب في إرسال طلب اكتشاف بشكل دوري للتأكد من أنك على علم بجميع الأجهزة الأخرى. يمكنك القيام بذلك باستخدام وظيفة Discover ().
var discoveryTimer = new Timer((state) =>
{
discoveryClient.Discover();
}, null, 0, 30000);
يؤدي استدعاء Discover() إلى بث رسالة UDP مع قائمة بالأجهزة المعروفة. سينظر كل جهاز إلى القائمة ويستجيب إذا لم يكن موجودًا أو إذا تغير عنوان IP الخاص به. وهذا يعني أيضًا أن أسماء الأجهزة يجب أن تكون فريدة.
في بعض الأحيان قد ترغب في معرفة متى تتم إضافة جهاز أو متى يتم تحديث حالة الجهاز. يستخدم العميل عناصر مراقبة System.Reactive التي يمكنك الاشتراك فيها:
عندما تمت إضافة الجهاز
using System.Reactive.Linq;
using System.Threading;
var whenDeviceAdded = discoveryClient
.WhenDeviceAdded
.ObserveOn(SynchronizationContext.Current)
.Subscribe(device =>
{
Debug.WriteLine("A device was added");
});
عندما يتم تحديث الجهاز
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) للتأكد من تشغيل التعليمات البرمجية على مؤشر ترابط واجهة المستخدم. لا تنس التخلص من الاشتراكات عند الانتهاء ;)
بمجرد اكتشاف الجهاز، من الممكن إرسال الرسائل مباشرة إلى هذا الجهاز. ويتم ذلك باستخدام TCP لضمان تسليم الرسالة. يقوم كل جهاز بتشغيل واجهة برمجة تطبيقات راحة خفيفة الوزن تستمع إلى الرسائل الواردة. يمكن أن تكون الرسالة بسيطة مثل الحرف ولكن من المفيد إرسال كائن متسلسل.
أرسل رسالة مباشرة
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
var jMessage = new JObject();
jMessage.Add("powerLevel", 100);
var success = await discoveryClient.SendDirectMessage("myDevice", jMessage.ToString());
عندما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");
});