برنامج تعليمي: تطوير وحدة Java IoT Edge باستخدام حاويات لينكس

ينطبق على:yes icon IoT Edge 1.1 IoT Edge 1.2 yes icon

يمكنك استخدام وحدات Azure IoT Edge النمطية لنشر التعليمات البرمجية التي تنفذ منطق عملك مباشرةً على أجهزة IoT Edge لديك. هذا البرنامج التعليمي يرشدك من خلال إنشاء ونشر وحدة IoT Edge التي تقوم بتصفية بيانات الاستشعار. ستستخدم جهاز IoT Edge المحاكي الذي قمت بإنشائه في Deploy Azure IoT Edge على جهاز محاك في مقالات التشغيل السريع. في هذا البرنامج التعليمي، تتعلم كيفية:

  • استخدم Visual Studio Code لإنشاء وحدة IoT Edge Java النمطية استنادًا إلى حزمة قالب Azure IoT Edge maven و Azure IoT Java device SDK.
  • استخدم Visual Studio Code وDocker لإنشاء صورة Docker ونشرها على السجل الخاص بك
  • نشر الوحدة النمطية إلى جهاز IoT Edge.
  • عرض البيانات التي تم إنشاؤها.

تقوم وحدة IoT Edge التي تقوم بإنشائها في هذا البرنامج التعليمي بتصفية بيانات درجة الحرارة التي تم إنشاؤها بواسطة جهازك. يرسل رسائل فقط تجاه المنبع إذا كانت درجة الحرارة فوق عتبة محددة. هذا النوع من التحليل على الحافة مفيد لتقليل كمية البيانات التي يتم توصيلها وتخزينها في السحابة.

إذا لم يكن لديك اشتراك Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.

المتطلبات الأساسية

يوضح هذا البرنامج التعليمي كيفية تطوير وحدة نمطية في Java باستخدام Visual Studio Code، وكيفية نشرها على جهاز IoT Edge. لا يدعم IoT Edge وحدات Java النمطية التي تم إنشاؤها كحاويات Windows.

استخدم الجدول التالي لفهم الخيارات الخاصة بك؛ لتطوير ونشر وحدات Java النمطية:

Java تعليمة Visual Studio برمجية Visual Studio 2017/2019
Linux AMD64 Use VS Code for Java modules on Linux AMD64
Linux ARM32 Use VS Code for Java modules on Linux ARM32

قبل بدء هذا البرنامج التعليمي، يجب الانتهاء من البرنامج التعليمي السابق لإعداد بيئة التطوير الخاصة بك لتطوير حاوية Linux: تطوير وحدات IoT Edge النمطية للأجهزة العاملة بنظام Linux. من خلال استكمال أي من هذه البرامج التعليمية، يجب أن تكون لديك المتطلبات الأساسية التالية في المكان:

لتطوير وحدة IoT Edge النمطية في Java يتم تثبيت المتطلبات الأساسية الإضافية التالية على جهاز التطوير الخاص بك:

  • Java Extension Pack لـ Visual Studio Code.

  • Java SE Development Kit 11، وقم بتعيين JAVA_HOME متغير البيئة للإشارة إلى تثبيت JDK الخاص بك.

  • Maven

    تلميح

    تضيف عمليات تثبيت Java و Maven متغيرات البيئة إلى النظام الخاص بك. أعد تشغيل أي مثيلات طرفية مفتوحة Visual Studio التعليمات البرمجية أو PowerShell أو موجه الأوامر بعد إكمال التثبيت. تضمن هذه الخطوة أن هذه المرافق يمكنها التعرف على أوامر Java و Maven من الآن فصاعدًا.

إنشاء مشروع وحدة نمطية

تنشئ الخطوات التالية مشروع وحدة IoT Edge الذي يعتمد على حزمة قالب Azure IoT Edge و Azure IoT Java device SDK. يمكنك إنشاء المشروع باستخدام Visual Studio Code و Azure IoT Tools.

إنشاء مشروع جديد

إنشاء قالب حل Java الذي يمكنك تخصيصه باستخدام التعليمات البرمجية الخاصة بك.

  1. في Visual Studio Code، حدد View>Command Palette لفتح لوحة أوامر VS Code.

  2. في لوحة الأوامر، أدخل الأمر Azure IoT Edge: New IoT Edge solution وشغّله. اتبع المطالبات في لوح الأوامر لإنشاء الحل الخاص بك.

    الحقل القيمة
    حدد مجلدًا اختر الموقع على جهاز التطوير الخاص بك لأجل VS Code لإنشاء ملفات الحل.
    توفير اسم حل أدخل اسمًا وصفيًّا للحل الذي تستخدمه أو اقبل EdgeSolution الافتراضي.
    تحديد قالب الوحدة النمطية اختر وحدة Java النمطية.
    توفير اسم وحدة نمطية قم بتسمية وحدتك النمطية ⁩JavaModule⁦.
    توفير مستودع صور Docker للوحدة النمطية يتضمن مستودع الصور اسم سجل الحاوية واسم صورة الحاوية. صورة الحاوية الخاصة بك مملوءة مسبقًا بالاسم الذي قدمته في الخطوة الأخيرة. استبدل localhost:5000 بقيمة خادم تسجيل الدخول من سجل حاوية Azure. يمكنك استرداد ملقم تسجيل الدخول من صفحة نظرة عامة من تسجيل الحاوية في مدخل Azure.

    يبدو مستودع الصور النهائي مثل <اسم> التسجيل .azurecr.io/javamodule.
    قم بتوفير قيمة لـ groupId أدخل قيمة معرف المجموعة أو اقبل com.edgemoduleالافتراضي.

    Provide Docker image repository

إذا كانت هذه هي المرة الأولى التي تنشئ فيها وحدة Java نمطية، فقد يستغرق تنزيل حزم maven عدة دقائق. عندما يكون الحل جاهزًا، تقوم نافذة VS Code بتحميل مساحة عمل حل IoT Edge. تحتوي مساحة عمل الحل على خمسة مكونات عالية المستوى:

  • يحتوي مجلد الوحدات النمطية على رمز Java للوحدة النمطية وملفات Docker لإنشاء الوحدة النمطية الخاصة بك كصورة حاوية.
  • يقوم الملف . env بتخزين بيانات اعتماد تسجيل الحاوية الخاصة بك.
  • يحتوي الملف deployment.template.json على المعلومات التي يستخدمها وقت تشغيل IoT Edge لنشر الوحدات النمطية على جهاز معين.
  • يحتوي الملف deployment.debug.template.json على إصدار تصحيح للوحدات النمطية.
  • لن تقوم بتحرير مجلد . vscode أو ملف . gitignore في هذا البرنامج التعليمي.

إذا لم تحدد سجل حاوية عند إنشاء الحل الخاص بك، ولكنك قبلت قيمة localhost:5000 الافتراضية، فلن يكون لديك ملف .env.

أضف بيانات اعتماد التسجيل الخاصة بك

ملف البيئة يخزن بيانات الاعتماد الخاصة بسجل الحاوية ويشاركها مع وقت التشغيل IoT Edge. يحتاج وقت التشغيل إلى بيانات الاعتماد هذه لسحب الصور الخاصة بك إلى جهاز IoT Edge.

يحاول ملحق IoT Edge سحب بيانات اعتماد تسجيل الحاوية من Azure وملأها في ملف البيئة. تحقق لمعرفة ما إذا كانت بيانات الاعتماد الخاصة بك مضمنة بالفعل. إذا لم يكن كذلك، فأضفها الآن:

  1. في مستكشف التعليمات البرمجية VS فتح الملف .env.
  2. قم بتحديث الحقول باستخدام قيم اسم المستخدم وكلمة المرور التي نسختها من سجل حاوية Azure.
  3. احفظ هذا الملف.

ملاحظة

يستخدم هذا البرنامج التعليمي بيانات اعتماد تسجيل دخول المسؤول لسجل Azure Container، والتي تعتبر ملائمة لسيناريوهات التطوير والاختبار. عندما تكون جاهزًا لسيناريوهات الإنتاج، نوصي بخيار مصادقة أقل امتيازًا مثل كيانات الخدمة. لمزيد من المعلومات، راجع إدارة الوصول إلى سجل الحاوية.

حدد بنية الهدف

حاليًّا، يمكن لـ Visual Studio Code تطوير وحدات Java النمطية لأجهزة Linux AMD64 و Linux ARM32v7. تحتاج إلى تحديد البنية التي تستهدفها مع كل حل، لأن الحاوية مبنية ويتم تشغيلها بشكل مختلف لكل نوع من أنواع الهندسة المعمارية. الافتراضي هو Linux AMD64.

  1. افتح لوحة الأوامر وابحث عن Azure IoT Edge: تعيين المنصة الهدف الافتراضي؟ لحل Edge، أو حدد رمز الاختصار في الشريط الجانبي أسفل النافذة.

  2. في لوحة الأوامر، حدد بنية الهدف من قائمة الخيارات. في هذا البرنامج التعليمي، نستخدم جهاز Ubuntu الظاهري كجهاز IoT Edge، لذلك سنتخذ amd64 الافتراضي.

تحديث الوحدة النمطية باستخدام التعليمات البرمجية المخصصة

  1. في مستكشف VS Code، افتح الوحدات النمطية>JavaModule>src>main>جافا>كوم>edgemodule>App.java.

  2. أضف التعليمات البرمجية التالية في الجزء العلوي من الملف لاستيراد فئات مرجعية جديدة.

    import java.io.StringReader;
    import java.util.concurrent.atomic.AtomicLong;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.json.Json;
    import javax.json.JsonObject;
    import javax.json.JsonReader;
    
    import com.microsoft.azure.sdk.iot.device.DeviceTwin.Pair;
    import com.microsoft.azure.sdk.iot.device.DeviceTwin.Property;
    import com.microsoft.azure.sdk.iot.device.DeviceTwin.TwinPropertyCallBack;
    
  3. أضف التعريف التالي إلى فئة التطبيق. يحدد هذا المتغير درجة الحرارة. لن يتم إبلاغ IoT Hub بدرجة حرارة الجهاز المقاسة حتى تتجاوز هذه القيمة.

    private static final String TEMP_THRESHOLD = "TemperatureThreshold";
    private static AtomicLong tempThreshold = new AtomicLong(25);
    
  4. استبدل أسلوب تنفيذ MessageCallbackMqtt بالتعليمات البرمجية التالية. يتم استدعاء هذه الطريقة عندما تتلقى الوحدة النمطية رسالة من MQTT مركز IoT Edge. فهو يعمل على تصفية الرسائل التي تبلغ عن درجات حرارة أقل من الحد الأدنى لدرجة الحرارة التي تم ضبطها عبر الوحدة المزدوجة.

    protected static class MessageCallbackMqtt implements MessageCallback {
        private int counter = 0;
        @Override
        public IotHubMessageResult execute(Message msg, Object context) {
            this.counter += 1;
    
            String msgString = new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET);
            System.out.println(
                   String.format("Received message %d: %s",
                            this.counter, msgString));
            if (context instanceof ModuleClient) {
                try (JsonReader jsonReader = Json.createReader(new StringReader(msgString))) {
                    final JsonObject msgObject = jsonReader.readObject();
                    double temperature = msgObject.getJsonObject("machine").getJsonNumber("temperature").doubleValue();
                    long threshold = App.tempThreshold.get();
                    if (temperature >= threshold) {
                        ModuleClient client = (ModuleClient) context;
                        System.out.println(
                            String.format("Temperature above threshold %d. Sending message: %s",
                            threshold, msgString));
                        client.sendEventAsync(msg, eventCallback, msg, App.OUTPUT_NAME);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return IotHubMessageResult.COMPLETE;
        }
    }
    
  5. أضف الفئتين الداخليتين الثابتتين التاليتين إلى فئة التطبيق. تقوم هذه الفئات بتحديث متغير حد درجة الحرارة عندما تتغير الخاصية المطلوبة للوحدة النمطية المزدوجة. تحتوي جميع الوحدات النمطية على وحدة مزدوجة خاصة بها، ما يتيح لك تكوين التعليمات البرمجية التي تعمل داخل وحدة نمطية مباشرة من السحابة.

    protected static class DeviceTwinStatusCallBack implements IotHubEventCallback {
        @Override
        public void execute(IotHubStatusCode status, Object context) {
            System.out.println("IoT Hub responded to device twin operation with status " + status.name());
        }
    }
    
    protected static class OnProperty implements TwinPropertyCallBack {
        @Override
        public void TwinPropertyCallBack(Property property, Object context) {
            if (!property.getIsReported()) {
                if (property.getKey().equals(App.TEMP_THRESHOLD)) {
                    try {
                        long threshold = Math.round((double) property.getValue());
                        App.tempThreshold.set(threshold);
                    } catch (Exception e) {
                        System.out.println("Faile to set TemperatureThread with exception");
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
  6. أضف الأسطر التالية في إلى الطريقةmain بعد client.open() للاشتراك في تحديثات الوحدة النمطية المزدوجة.

    client.startTwin(new DeviceTwinStatusCallBack(), null, new OnProperty(), null);
    Map<Property, Pair<TwinPropertyCallBack, Object>> onDesiredPropertyChange = new HashMap<Property, Pair<TwinPropertyCallBack, Object>>() {
        {
            put(new Property(App.TEMP_THRESHOLD, null), new Pair<TwinPropertyCallBack, Object>(new OnProperty(), null));
        }
    };
    client.subscribeToTwinDesiredProperties(onDesiredPropertyChange);
    client.getTwin();
    
  7. احفظ ملف App.java.

  8. في مستكشف VS Code، افتح ملفdeployment.template.json في مساحة عمل حل IoT Edge.

  9. أضف الوحدة النمطية JavaModule المزدوجة إلى بيان النشر. أدرج محتوى JSON التالي في الجزء السفلي من القسم moduleContent، بعد الوحدة النمطية المزدوجة $edgeHub:

      "JavaModule": {
          "properties.desired":{
              "TemperatureThreshold":25
          }
      }
    

    Add module twin to deployment template

  10. احفظ ملف publish.template.json.

قم ببناء الوحدة الخاصة بك وادفعها

في المقطع السابق، قمت بإنشاء حل IoT Edge وإضافة تعليمات برمجية إلى JavaModule التي ستقوم بتصفية الرسائل حيث درجة حرارة الجهاز التي تم الإبلاغ عنها تحت الحدود المقبولة. الآن، قم بإنشاء الحل كصورة حاوية ودفعه إلى سجل الحاوية الخاص بك.

  1. افتح المحطة الطرفية المدمجة بـ VS Code من خلال تحديد View>Terminal.

  2. قم بتسجيل الدخول إلى Docker بإدخال الأمر التالي في المحطة الطرفية. قم بتسجيل الدخول باستخدام اسم المستخدم وكلمة المرور وخادم تسجيل الدخول من سجل الحاويات Azure. يمكنك استرداد هذه القيم من قسم Access keys في السجل الخاص بك في منصة Azure.

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

    قد تتلقى تحذيرًا أمنيًا يوصي باستخدام --password-stdin. على الرغم من أن أفضل الممارسات موصى بها لسيناريوهات الإنتاج، إلا أنها خارج نطاق هذا البرنامج التعليمي. لمزيد من المعلومات، راجع مرجع تسجيل دخول docker.

  3. في مستكشف VS Code، انقر بزر الماوس الأيمن فوق ملف publish.template.json وحدد Build and Push IoT Edge Solution.

    يبدأ أمر الإنشاء والدفع ثلاث عمليات. أولًا، يقوم بإنشاء مجلد جديد في الحل يُسمى config والذي يحتوي على بيان النشر الكامل، والذي تم إنشاؤه من المعلومات الموجودة في قالب النشر وملفات الحل الأخرى. ثانياً، يقوم بتشغيل docker build لإنشاء صورة الحاوية بناءً على ملف dockerfile المناسب للبنية المستهدفة. بعد ذلك، يقوم بتشغيل docker push لدفع مستودع الصور إلى سجل الحاوية الخاص بك.

    قد تستغرق هذه العملية عدة دقائق في المرة الأولى ولكن أسرع في المرة التالية التي تقوم بتشغيل الأوامر.

نشر الوحدات النمطية على الجهاز

استخدم مستكشف التعليمات البرمجية Visual Studio وملحق أدوات إنترنت Azure IoT لنشر مشروع الوحدة النمطية على جهاز IoT Edge. لديك بالفعل بيان نشر مُجهز للسيناريو الخاص بك، الملف deployment.amd64.json في مجلد التكوين. كل ما عليك القيام به الآن هو تحديد جهاز لتلقي النشر.

تأكد من أن جهاز IoT Edge الخاص بك يعمل.

  1. في مستكشف Visual Studio Code ضمن قسم Azure IoT Hub، قم بتوسيع الأجهزة لمشاهدة قائمة أجهزة إنترنت الأشياء الخاصة بك.

  2. انقر بزر الماوس الأيمن فوق اسم جهاز IoT Edge الخاص بك، ثم حدد Create Deployment for Single Device.

  3. افتح الملف deployment.amd64.json في المجلد config ثم انقر فوق Select Edge Deployment Manifest. لا تستخدم الملف deployment.template.js.

  4. تحت جهازك، قم بتوسيع الوحدات النمطية لمشاهدة قائمة بالوحدات التي تم نشرها وتشغيلها. انقر فوق زر التحديث. من المفترض أن ترى JavaModule الجديدة تعمل بجانب الوحدة النمطية SimulatedTemperatureSensor و $ edgeAgent و $edgeHub.

    قد يستغرق الأمر بضع دقائق لبدء تشغيل الوحدات النمطية. يحتاج وقت تشغيل IoT Edge إلى استلام بيان النشر الجديد الخاص به، وسحب صور الوحدة النمطية من وقت تشغيل الحاوية، ثم بدء تشغيل كل وحدة نمطية جديدة.

عرض البيانات التي تم إنشاؤها

بمجرد تطبيق بيان النشر على جهاز IoT Edge، يقوم خلال وقت تشغيل IoT Edge على الجهاز بتجميع معلومات النشر الجديدة وبدء التنفيذ عليها. يتم إيقاف أي وحدات نمطية تعمل على الجهاز غير مضمنة في بيان النشر. يتم بدء تشغيل أي وحدات مفقودة من الجهاز.

  1. في مستكشف Visual Studio Code، انقر بزر الماوس الأيمن فوق اسم جهاز IoT Edge وحدد Start Monitoring Built-in Event Endpoint.

  2. عرض الرسائل التي تصل إلى مركز IoT. قد يستغرق وصول الرسائل بعض الوقت. جهاز IoT Edge عليه تلقي نشر جديد وبدء تشغيل كافة الوحدات النمطية. بعد ذلك، تنتظر التغييرات التي أجريناها على رمز JavaModule حتى تصل درجة حرارة الجهاز إلى 25 درجة قبل إرسال الرسائل. كما أنها تضيف نوع الرسالة Alert إلى أي رسائل تصل إلى حد درجة الحرارة.

تحرير الوحدة النمطية المزدوجة

استخدمنا وحدة JavaModule المزدوجة في بيان النشر لتعيين حد درجة الحرارة عند 25 درجة. يمكنك استخدام الوحدة النمطية المزدوجة لتغيير الوظيفة دون الحاجة إلى تحديث رمز الوحدة النمطية.

  1. في Visual Studio Code، قم بعرض مزيد من التفاصيل الموجودة ضمن جهاز IoT Edge لرؤية الوحدات النمطية قيد التشغيل.

  2. انقر بزر الماوس الأيمن فوق JavaModule، وحدد Edit module twin.

  3. ابحث عن TemperatureThreshold في الخصائص المطلوبة. تغيير قيمته إلى درجة حرارة جديدة من 5 درجات إلى 10 درجات أعلى من آخر درجة حرارة مبلغ عنها.

  4. احفظ ملف الوحدة النمطية المزدوجة.

  5. انقر بزر الماوس الأيمن في أي مكان في جزء تحرير الوحدة النمطية المزدوجة وحدد تحديث الوحدة النمطية المزدوجة.

  6. وراقب الرسائل الواردة من الجهاز إلى السحابة. يجب أن تشاهد الرسائل تتوقف حتى يتم الوصول إلى حد درجة الحرارة الجديد.

تنظيف الموارد

إذا كنت تخطط للمتابعة إلى المقالة التالية الموصى بها، يمكنك الاحتفاظ بالموارد والتكوينات التي قمت بإنشائها وإعادة استخدامها. يمكنك أيضًا الاستمرار في استخدام نفس جهاز IoT Edge كجهاز اختبار.

وإلا، يمكنك حذف التكوينات المحلية وموارد Azure التي قمت بإنشائها في هذه المقالة لتجنب الرسوم.

حذف موارد Azure

حذف موارد Azure ومجموعات الموارد لا رجعة فيه. تأكد من عدم حذفك لمجموعة المورد (الموارد) الخاطئة عن غير قصد. إذا قمت بإنشاء مركز IoT داخل مجموعة موارد موجودة لديها موارد تريد الاحتفاظ بها، فاحذف فقط مورد محور IoT نفسه، وليس مجموعة الموارد.

لحذف الموارد:

  1. سجّل الدخول إلى مدخل Microsoft Azure، ثم حدد Resource groups.

  2. حدد اسم مجموعة الموارد التي تحتوي على موارد اختبار IoT Edge.

  3. راجع قائمة الموارد الموجودة في مجموعة الموارد الخاصة بك. إذا كنت تريد حذفها جميعاً، يمكنك تحديد Delete resource group. إذا كنت تريد حذف بعضها فقط، فيمكنك النقر فوق كل مورد لحذفها بشكل فردي.

الخطوات التالية

في هذا البرنامج التعليمي، قمت بإنشاء وحدة IoT Edge التي تصفي البيانات الأولية التي تم إنشاؤها بواسطة جهاز IoT Edge.

تابع إلى البرامج التعليمية التالية لمعرفة كيف يساعدك Azure IoT Edge على نشر خدمات Azure السحابية لمعالجة البيانات وتحليلها على الحافة.