Menjadwalkan dan menyiarkan pekerjaan (Python)

Gunakan Azure IoT Hub untuk menjadwalkan dan melacak pekerjaan yang memperbarui jutaan perangkat. Gunakan pekerjaan untuk:

  • Memperbarui properti yang diinginkan
  • Memperbarui tag
  • Memanggil metode langsung

Secara konseptual, pekerjaan membungkus salah satu tindakan ini dan melacak kemajuan eksekusi terhadap kumpulan perangkat, yang didefinisikan oleh kueri kembar perangkat. Misalnya, aplikasi backend dapat menggunakan pekerjaan untuk memanggil metode reboot pada 10.000 perangkat, yang ditentukan oleh kueri kembar perangkat dan dijadwalkan pada waktu mendatang. Aplikasi itu kemudian dapat melacak kemajuan saat masing-masing perangkat tersebut menerima dan menjalankan metode reboot.

Pelajari lebih lanjut tentang setiap kemampuan ini di artikel ini:

Catatan

Fitur yang dijelaskan dalam artikel ini hanya tersedia di tingkat standar IoT Hub. Untuk informasi selengkapnya tentang tingkat IoT Hub dasar dan standar/gratis, lihat Memilih tingkat IoT Hub yang tepat untuk solusi Anda.

Artikel ini menunjukkan cara membuat dua aplikasi Python:

  • Aplikasi perangkat simulasi Python, simDevice.py, yang mengimplementasikan metode langsung yang disebut lockDoor, yang dapat dipanggil oleh aplikasi back-end.

  • Aplikasi konsol Python, scheduleJobService.py, yang membuat dua pekerjaan. Satu pekerjaan memanggil metode langsung lockDoor dan pekerjaan lain mengirimkan pembaruan properti yang diinginkan ke beberapa perangkat.

Catatan

Lihat Azure IoT SDK untuk informasi selengkapnya tentang alat SDK yang tersedia untuk membangun aplikasi perangkat dan back-end.

Prasyarat

  • Akun Azure aktif. (Jika Anda tidak memiliki akun, Anda dapat membuat akun gratis hanya dalam beberapa menit.)

  • Sebuah IoT hub. Buat akun menggunakan CLI atau portal Azure.

  • Perangkat yang terdaftar. Daftarkan perangkat di portal Azure.

  • Python versi 3.7 atau yang lebih baru disarankan. Pastikan untuk menggunakan penginstalan 32-bit atau 64-bit seperti yang dipersyaratkan oleh pengaturan Anda. Saat diminta selama instalasi, pastikan untuk menambahkan Python ke variabel lingkungan khusus platform Anda.

Membuat aplikasi perangkat yang disimulasikan

Di bagian ini, Anda membuat aplikasi konsol Python yang merespons metode langsung yang disebut cloud, yang memicu metode lockDoor simulasi.

  1. Pada perintah Anda, jalankan perintah berikut untuk menginstal paket azure-iot-device:

    pip install azure-iot-device
    
  2. Menggunakan editor teks, buat file simDevice.py baru di direktori kerja Anda.

  3. Tambahkan variabel dan pernyataan import berikut di awal file simDevice.py. Ganti deviceConnectionString dengan string koneksi perangkat yang Anda buat di atas:

    import time
    from azure.iot.device import IoTHubDeviceClient, MethodResponse
    
    CONNECTION_STRING = "{deviceConnectionString}"
    
  4. Tentukan fungsi berikut, yang akan menginisiasi klien dan mengonfigurasinya untuk menanggapi metode lockDoor, serta menerima pembaruan perangkat kembar:

    def create_client():
        # Instantiate the client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        # Define behavior for responding to the lockDoor direct method
        def method_request_handler(method_request):
            if method_request.name == "lockDoor":
                print("Locking Door!")
    
                resp_status = 200
                resp_payload = {"Response": "lockDoor called successfully"}
                method_response = MethodResponse.create_from_method_request(
                    method_request=method_request,
                    status=resp_status,
                    payload=resp_payload
                )
                client.send_method_response(method_response)
    
        # Define behavior for receiving a twin patch
        def twin_patch_handler(twin_patch):
            print("")
            print("Twin desired properties patch received:")
            print(twin_patch)
    
        # Set the handlers on the client
        try:
            print("Beginning to listen for 'lockDoor' direct method invocations...")
            client.on_method_request_received = method_request_handler
            print("Beginning to listen for updates to the Twin desired properties...")
            client.on_twin_desired_properties_patch_received = twin_patch_handler
        except:
            # If something goes wrong while setting the handlers, clean up the client
            client.shutdown()
            raise
    
  5. Tambahkan kode berikut untuk menjalankan sampel:

    def main():
        print ("Starting the IoT Hub Python jobs sample...")
        client = create_client()
    
        print ("IoTHubDeviceClient waiting for commands, press Ctrl-C to exit")
        try:
            while True:
                time.sleep(100)
        except KeyboardInterrupt:
            print("IoTHubDeviceClient sample stopped!")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    
    if __name__ == '__main__':
        main()
    
  6. Simpan dan tutup file simDevice.py.

Catatan

Untuk mempermudah, artikel ini tidak menerapkan kebijakan coba lagi. Dalam kode produksi, Anda harus menerapkan kebijakan percobaan kembali (seperti backoff eksponensial), seperti yang disarankan dalam artikel, Penanganan Kesalahan Sementara.

Mendapatkan string koneksi IoT Hub

Dalam artikel ini, Anda membuat layanan backend yang memanggil metode langsung pada perangkat dan memperbarui kembar perangkat. Layanan memerlukan izin sambungkan layanan untuk memanggil metode langsung pada perangkat. Layanan ini juga memerlukan izin baca registri dan tulis registri untuk membaca dan menulis registri identitas. Tidak ada kebijakan akses bersama default yang hanya berisi izin ini, jadi Anda perlu membuatnya.

Untuk membuat kebijakan akses bersama yang memberikan izin sambungkan layanan, baca registri, dan tulis registri dan untuk mendapatkan string koneksi untuk kebijakan ini, ikuti langkah-langkah berikut:

  1. Buka hub IoT di portal Azure. Cara termudah untuk sampai ke hub IoT Anda adalah memilih Grup sumber daya, memilih grup sumber daya tempat hub IoT Anda berada, lalu memilih hub IoT Anda dari daftar sumber daya.

  2. Di panel sisi kiri hub IoT Anda, pilih Kebijakan akses bersama.

  3. Dari menu teratas di atas daftar kebijakan, pilih Tambahkan kebijakan akses bersama.

  4. Di panel Tambahkan kebijakan akses bersama, masukkan nama deskriptif untuk kebijakan Anda; misalnya: serviceAndRegistryReadWrite. Di bawah Izin, pilih Registry Write dan Service Connect (Registry Read dipilih secara otomatis saat Anda memilih Registry Write ) lalu pilih Tambahkan.

    Cuplikan layar cara menambahkan kebijakan akses baru di IoT Hub portal Azure.

  5. Kembali ke halaman Kebijakan akses bersama, pilih kebijakan baru Anda dari daftar kebijakan.

  6. Di panel baru yang muncul, pilih ikon salin untuk String koneksi utama dan simpan nilainya.

    Cuplikan layar cara mendapatkan string koneksi utama dari kebijakan akses di IoT Hub portal Azure.

Untuk mengetahui informasi selengkapnya tentang kebijakan dan izin akses bersama IoT Hub, lihat Kontrol akses dan izin.

Menjadwalkan pekerjaan untuk memanggil metode langsung dan memperbarui properti kembar perangkat

Di bagian ini, Anda membuat aplikasi konsol Python yang memulai lockDoor jarak jauh pada perangkat menggunakan metode langsung dan juga memperbarui properti kembar perangkat yang diinginkan.

  1. Pada perintah Anda, jalankan perintah berikut untuk menginstal paket azure-iot-hub:

    pip install azure-iot-hub
    
  2. Dengan menggunakan editor teks, buat file scheduleJobService.py baru di direktori kerja Anda.

  3. Tambahkan variabel dan pernyataan import berikut di awal file scheduleJobService.py. Ganti tempat penampung {IoTHubConnectionString} dengan string koneksi hub IoT yang telah Anda salin sebelumnya di Mendapatkan string koneksi hub IoT. Ganti tempat penampung {deviceId} dengan ID perangkat (nama) dari perangkat terdaftar Anda:

    import os
    import sys
    import datetime
    import time
    import threading
    import uuid
    import msrest
    
    from azure.iot.hub import IoTHubJobManager, IoTHubRegistryManager
    from azure.iot.hub.models import JobProperties, JobRequest, Twin, TwinProperties, CloudToDeviceMethod
    
    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
    METHOD_NAME = "lockDoor"
    METHOD_PAYLOAD = "{\"lockTime\":\"10m\"}"
    UPDATE_PATCH = {"building":43,"floor":3}
    TIMEOUT = 60
    WAIT_COUNT = 5
    
    # Create IoTHubJobManager
    iothub_job_manager = IoTHubJobManager.from_connection_string(CONNECTION_STRING)
    
    
  4. Tambahkan metode berikut untuk menjalankan pekerjaan yang memanggil metode langsung dan kembar perangkat:

    def device_method_job(job_id, device_id, execution_time):
        print ( "" )
        print ( "Scheduling job: " + str(job_id) )
    
        job_request = JobRequest()
        job_request.job_id = job_id
        job_request.type = "scheduleDeviceMethod"
        job_request.start_time = datetime.datetime.utcnow().isoformat()
        job_request.cloud_to_device_method = CloudToDeviceMethod(method_name=METHOD_NAME, payload=METHOD_PAYLOAD)
        job_request.max_execution_time_in_seconds = execution_time
        job_request.query_condition = "DeviceId in ['{}']".format(device_id)
    
        new_job_response = iothub_job_manager.create_scheduled_job(job_id, job_request)
    
    def device_twin_job(job_id, device_id, execution_time):
        print ( "" )
        print ( "Scheduling job " + str(job_id) )
    
        job_request = JobRequest()
        job_request.job_id = job_id
        job_request.type = "scheduleUpdateTwin"
        job_request.start_time = datetime.datetime.utcnow().isoformat()
        job_request.update_twin = Twin(etag="*", properties=TwinProperties(desired=UPDATE_PATCH))
        job_request.max_execution_time_in_seconds = execution_time
        job_request.query_condition = "DeviceId in ['{}']".format(device_id)
    
        new_job_response = iothub_job_manager.create_scheduled_job(job_id, job_request)
    
    
  5. Tambahkan kode berikut untuk menjadwalkan pekerjaan dan memperbarui status pekerjaan. Juga termasuk rutinitas main:

    def iothub_jobs_sample_run():
        try:
            method_job_id = uuid.uuid4()
            device_method_job(method_job_id, DEVICE_ID, TIMEOUT)
    
            print ( "" )
            print ( "Direct method called with Job Id: " + str(method_job_id) )
    
            twin_job_id = uuid.uuid4()
            device_twin_job(twin_job_id, DEVICE_ID, TIMEOUT)
    
            print ( "" )
            print ( "Device twin called with Job Id: " + str(twin_job_id) )
    
            while True:
                print ( "" )
    
                method_job_status = iothub_job_manager.get_scheduled_job(method_job_id)
                print ( "...job " + str(method_job_id) + " " + method_job_status.status )
    
                twin_job_status = iothub_job_manager.get_scheduled_job(twin_job_id)
                print ( "...job " + str(twin_job_id) + " " + twin_job_status.status )
    
                print ( "Job status posted, press Ctrl-C to exit" )
                time.sleep(WAIT_COUNT)
    
        except msrest.exceptions.HttpOperationError as ex:
            print ( "" )
            print ( "Http error {}".format(ex.response.text) )
            return
        except Exception as ex:
            print ( "" )
            print ( "Unexpected error {}".format(ex) )
            return
        except KeyboardInterrupt:
            print ( "" )
            print ( "IoTHubService sample stopped" )
    
    if __name__ == '__main__':
        print ( "Starting the IoT Hub jobs Python sample..." )
        print ( "    Connection string = {0}".format(CONNECTION_STRING) )
        print ( "    Device ID         = {0}".format(DEVICE_ID) )
    
        iothub_jobs_sample_run()
    
  6. Simpan dan tutup file scheduleJobService.py.

Menjalankan aplikasi

Sekarang, Anda siap untuk menjalankan aplikasi.

  1. Pada perintah di direktori yang bekerja, jalankan perintah berikut untuk mulai mendengarkan metode langsung reboot:

    python simDevice.py
    
  2. Pada perintah lain di direktori yang bekerja, jalankan perintah berikut untuk memicu pekerjaan untuk mengunci pintu dan memperbarui kembar:

    python scheduleJobService.py
    
  3. Anda melihat respons perangkat terhadap metode langsung dan pembaruan kembar perangkat di konsol.

    Pekerjaan IoT Hub sampel 1 -- output perangkat

    Pekerjaan IoT Hub sampel 2 -- output perangkat

Langkah berikutnya

Dalam artikel ini, Anda menjadwalkan pekerjaan untuk menjalankan metode langsung dan memperbarui properti kembar perangkat.

Untuk terus menjelajahi IoT Hub dan pola pengelolaan perangkat, perbarui gambar di tutorial Pembaruan Perangkat untuk Azure IoT Hub menggunakan Gambar Referensi Raspberry Pi 3 B+.