ไลบรารีนี้มีไว้สำหรับใช้กับแอป 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 observables ที่คุณสามารถสมัครรับข้อมูล:
เมื่อเพิ่มอุปกรณ์แล้ว
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) ถูกใช้เพื่อให้แน่ใจว่าโค้ดทำงานบนเธรด UI อย่าลืมกำจัดการสมัครสมาชิกเมื่อคุณทำเสร็จแล้ว ;)
เมื่อค้นพบอุปกรณ์แล้ว จะสามารถส่งข้อความไปยังอุปกรณ์นั้นได้โดยตรง ทำได้โดยใช้ TCP เพื่อให้แน่ใจว่าข้อความจะถูกส่งออกไป อุปกรณ์แต่ละเครื่องใช้งาน API ส่วนที่เหลือแบบน้ำหนักเบาซึ่งจะคอยฟังข้อความขาเข้า ข้อความอาจเรียบง่ายเหมือนกับอักขระ แต่จะมีประโยชน์มากกว่าในการส่งอ็อบเจ็กต์แบบซีเรียลไลซ์
ส่งข้อความโดยตรง
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");
});