Feladatok ütemezése és közvetítése (.NET)
A Azure IoT Hub használatával ütemezheti és nyomon követheti a több millió eszközt frissítő feladatokat. Feladatok használata a következőhöz:
Eszköz kívánt tulajdonságainak frissítése
Címkék frissítése
Közvetlen metódusok meghívása
A feladatok az alábbi műveletek egyikét burkolják, és nyomon követik a végrehajtást egy ikereszköz-lekérdezés által meghatározott eszközkészleten. Egy háttéralkalmazás például egy feladat használatával meghívhat egy közvetlen metódust 10 000 olyan eszközön, amely újraindítja az eszközöket. Megadhatja az eszközkészletet ikereszköz-lekérdezéssel, és ütemezheti, hogy a feladat egy későbbi időpontban fusson. A feladat nyomon követi az előrehaladást, amint az egyes eszközök megkapják és végrehajtják a közvetlen újraindítási metódust.
Ha többet szeretne megtudni ezekről a képességekről, tekintse meg a következő témakört:
Ikereszköz és tulajdonságok: Ismerkedés az ikereszközökkel, valamint az ikereszközök megismerése és használata az IoT Hub
Közvetlen metódusok: IoT Hub fejlesztői útmutató – közvetlen metódusok
Megjegyzés
A cikkben ismertetett funkciók csak a IoT Hub standard szintjén érhetők el. Az alapszintű és standard/ingyenes IoT Hub szintekkel kapcsolatos további információkért lásd: A megoldáshoz megfelelő IoT Hub szint kiválasztása.
Ez a cikk bemutatja, hogyan hozhat létre két .NET-konzolalkalmazást:
Egy SimulateDeviceMethods nevű eszközalkalmazás, amely a LockDoor nevű közvetlen metódust valósítja meg, amelyet a háttéralkalmazás hívhat meg.
Egy ScheduleJob nevű háttéralkalmazás, amely két feladatot hoz létre. Az egyik feladat meghívja a lockDoor közvetlen metódust, egy másik feladat pedig több eszközre küldi a kívánt tulajdonságfrissítéseket.
Megjegyzés
Az eszköz- és háttéralkalmazások készítéséhez elérhető SDK-eszközökről az Azure IoT SDK-k című témakörben olvashat bővebben.
Előfeltételek
A Visual Studióval.
Egy IoT Hub. Hozzon létre egyet a parancssori felülettel vagy a Azure Portal.
Regisztrált eszköz. Regisztráljon egyet a Azure Portal.
Győződjön meg arról, hogy a 8883-as port nyitva van a tűzfalon. A cikkben szereplő eszközminta MQTT protokollt használ, amely a 8883-es porton keresztül kommunikál. Ez a port bizonyos vállalati és oktatási hálózati környezetben blokkolva lehet. További információkért és a probléma megkerülésének módjaiért lásd: Csatlakozás IoT Hub -hez (MQTT).
Szimulált eszközalkalmazás létrehozása
Ebben a szakaszban egy .NET-konzolalkalmazást hoz létre, amely a megoldás háttérrendszere által meghívott közvetlen metódusra válaszol.
A Visual Studióban válassza az Új projekt létrehozása lehetőséget, majd válassza a Konzolalkalmazás (.NET-keretrendszer) projektsablont. A folytatáshoz válassza a Tovább gombot.
Az Új projekt konfigurálása területen nevezze el a SimulateDeviceMethods projektet, majd válassza a Tovább gombot.
Fogadja el a .NET-keretrendszer alapértelmezett verzióját, majd válassza a Létrehozás lehetőséget a projekt létrehozásához.
A Megoldáskezelő kattintson a jobb gombbal a SimulateDeviceMethods projektre, majd válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget.
A NuGet Package Managerben válassza a Tallózás lehetőséget , keressen rá, majd válassza a Microsoft.Azure.Devices.Client elemet. Válassza a Telepítés gombot.
Ez a lépés letölti, telepíti és hozzáadja az Azure IoT-eszköz SDK NuGet-csomagjára és függőségeire mutató hivatkozást.
Adja hozzá a következő
using
utasításokat a Program.cs fájl elejéhez:using Microsoft.Azure.Devices.Client; using Microsoft.Azure.Devices.Shared; using Newtonsoft.Json; using System.Threading.Tasks; using System.Text;
Adja hozzá a Program osztályhoz a következő mezőket: Cserélje le a helyőrző értékét az előző szakaszban feljegyzett eszköz kapcsolati sztring:
static string DeviceConnectionString = "<yourDeviceConnectionString>"; static DeviceClient Client = null;
Adja hozzá a következő kódot a közvetlen metódus implementálásához az eszközön:
static Task<MethodResponse> LockDoor(MethodRequest methodRequest, object userContext) { Console.WriteLine(); Console.WriteLine("Locking Door!"); Console.WriteLine("\nReturning response for method {0}", methodRequest.Name); string result = "'Door was locked.'"; return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200)); }
Adja hozzá az alábbi módszert az ikereszköz-figyelő implementálásához az eszközön:
private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, object userContext) { Console.WriteLine("Desired property change:"); Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); }
Végül adja hozzá a következő kódot a Main metódushoz az IoT Hubhoz való csatlakozás megnyitásához és a metódusfigyelő inicializálásához:
try { Console.WriteLine("Connecting to hub"); Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, TransportType.Mqtt); Client.SetMethodHandlerAsync("LockDoor", LockDoor, null); Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null); Console.WriteLine("Waiting for direct method call and device twin update\n Press enter to exit."); Console.ReadLine(); Console.WriteLine("Exiting..."); Client.SetMethodHandlerAsync("LockDoor", null, null); Client.CloseAsync().Wait(); } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", ex.Message); }
Mentse a munkáját, és hozza létre a megoldást.
Megjegyzés
Az egyszerűség érdekében ez a cikk nem valósít meg újrapróbálkozési szabályzatokat. Az éles kódban újrapróbálkozási szabályzatokat (például kapcsolat-újrapróbálkozási szabályzatokat) kell implementálnia az átmeneti hibakezelésben javasolt módon.
Az IoT Hub kapcsolati sztring lekérése
Ebben a cikkben létrehoz egy háttérszolgáltatást, amely ütemez egy feladatot egy közvetlen metódus meghívására egy eszközön, ütemez egy feladatot az ikereszköz frissítésére, és figyeli az egyes feladatok előrehaladását. Ezeknek a műveleteknek a végrehajtásához a szolgáltatásnak a beállításjegyzék olvasási és beállításjegyzék-írási engedélyére van szüksége. Alapértelmezés szerint minden IoT Hub egy registryReadWrite nevű megosztott hozzáférési szabályzattal jön létre, amely megadja ezeket az engedélyeket.
A registryReadWrite szabályzathoz tartozó IoT Hub kapcsolati sztring az alábbi lépésekkel szerezheti be:
A Azure Portal válassza az Erőforráscsoportok lehetőséget. Válassza ki azt az erőforráscsoportot, ahol a központ található, majd válassza ki a központot az erőforrások listájából.
A központ bal oldali paneljén válassza a Megosztott hozzáférési szabályzatok lehetőséget.
A szabályzatok listájában válassza a beállításjegyzékReadWrite szabályzatát .
Másolja ki az Elsődleges kapcsolati sztring, és mentse az értéket.
A IoT Hub megosztott hozzáférési szabályzatokkal és engedélyekkel kapcsolatos további információkért lásd: Hozzáférés-vezérlés és engedélyek.
Feladatok ütemezése közvetlen metódus meghívásához és ikereszköz-frissítések küldéséhez
Ebben a szakaszban létrehoz egy .NET-konzolalkalmazást (C#használatával), amely feladatokkal hívja meg a LockDoor közvetlen metódust, és a kívánt tulajdonságfrissítéseket több eszközre küldi.
A Visual Studióban válassza azÚj>projekt fájlja> lehetőséget. Az Új projekt létrehozása területen válassza a Konzolalkalmazás (.NET-keretrendszer) lehetőséget, majd válassza a Tovább gombot.
Az Új projekt konfigurálása területen nevezze el a project ScheduleJob nevet, majd válassza a Létrehozás lehetőséget.
Fogadja el a .NET-keretrendszer alapértelmezett verzióját, majd válassza a Létrehozás lehetőséget a projekt létrehozásához.
A Megoldáskezelő kattintson a jobb gombbal a ScheduleJob projektre, majd válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget.
A NuGet-csomagkezelőben válassza a Tallózás lehetőséget, keresse meg és válassza a Microsoft.Azure.Devices elemet, majd válassza a Telepítés lehetőséget.
Ez a lépés letölti, telepíti és hozzáad egy hivatkozást az Azure IoT service SDK NuGet-csomaghoz és függőségeihez.
Adja hozzá a következő
using
utasításokat a Program.cs fájl elejéhez:using Microsoft.Azure.Devices; using Microsoft.Azure.Devices.Shared;
Adja hozzá a következő
using
utasítást, ha még nem szerepel az alapértelmezett utasításokban.using System.Threading; using System.Threading.Tasks;
Adja hozzá a Program osztályhoz a következő mezőket: Cserélje le a helyőrzőket az IoT Hub kapcsolati sztring lekérése és az eszköz neve című témakörben korábban másolt IoT Hub kapcsolati sztring.
static JobClient jobClient; static string connString = "<yourIotHubConnectionString>"; static string deviceId = "<yourDeviceId>";
Adja hozzá a Program osztályhoz a következő módszert:
public static async Task MonitorJob(string jobId) { JobResponse result; do { result = await jobClient.GetJobAsync(jobId); Console.WriteLine("Job Status : " + result.Status.ToString()); Thread.Sleep(2000); } while ((result.Status != JobStatus.Completed) && (result.Status != JobStatus.Failed)); }
Adja hozzá a Program osztályhoz a következő módszert:
public static async Task StartMethodJob(string jobId) { CloudToDeviceMethod directMethod = new CloudToDeviceMethod("LockDoor", TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5)); JobResponse result = await jobClient.ScheduleDeviceMethodAsync(jobId, $"DeviceId IN ['{deviceId}']", directMethod, DateTime.UtcNow, (long)TimeSpan.FromMinutes(2).TotalSeconds); Console.WriteLine("Started Method Job"); }
Adjon hozzá egy másik metódust a Program osztályhoz:
public static async Task StartTwinUpdateJob(string jobId) { Twin twin = new Twin(deviceId); twin.Tags = new TwinCollection(); twin.Tags["Building"] = "43"; twin.Tags["Floor"] = "3"; twin.ETag = "*"; twin.Properties.Desired["LocationUpdate"] = DateTime.UtcNow; JobResponse createJobResponse = jobClient.ScheduleTwinUpdateAsync( jobId, $"DeviceId IN ['{deviceId}']", twin, DateTime.UtcNow, (long)TimeSpan.FromMinutes(2).TotalSeconds).Result; Console.WriteLine("Started Twin Update Job"); }
Megjegyzés
További információ a lekérdezési szintaxisról: IoT Hub lekérdezési nyelv.
Végül adja a következő sorokat a Main metódushoz:
Console.WriteLine("Press ENTER to start running jobs."); Console.ReadLine(); jobClient = JobClient.CreateFromConnectionString(connString); string methodJobId = Guid.NewGuid().ToString(); StartMethodJob(methodJobId); MonitorJob(methodJobId).Wait(); Console.WriteLine("Press ENTER to run the next job."); Console.ReadLine(); string twinUpdateJobId = Guid.NewGuid().ToString(); StartTwinUpdateJob(twinUpdateJobId); MonitorJob(twinUpdateJobId).Wait(); Console.WriteLine("Press ENTER to exit."); Console.ReadLine();
Mentse a munkáját, és hozza létre a megoldást.
Az alkalmazások futtatása
Most már készen áll az alkalmazások futtatására.
A Visual Studio Megoldáskezelő kattintson a jobb gombbal a megoldásra, majd válassza az Indítási projektek beállítása lehetőséget.
Válassza a Common Properties Startup Project ( Közös tulajdonságok>indítási projektje) lehetőséget, majd válassza a Több indítási projekt lehetőséget.
Győződjön meg arról, hogy
SimulateDeviceMethods
a lista tetején van, majd a következővelScheduleJob
: . Állítsa mindkét műveletet a Start értékre , és válassza az OK gombot.Futtassa a projekteket a Start gombra kattintva, vagy nyissa meg a Hibakeresés menüt, és kattintson a Hibakeresés indítása parancsra.
Az eszköz és a háttéralkalmazások kimenetét is láthatja.
Következő lépések
Ebben a cikkben a feladatokat egy közvetlen metódus futtatására és az ikereszköz tulajdonságainak frissítésére ütemezte.
A IoT Hub és az eszközkezelési minták megismeréséhez frissítsen egy képet az Eszközfrissítésben Azure IoT Hub oktatóanyaghoz a Raspberry Pi 3 B+ referenciarendszerkép használatával.