Azure IoT Connector لقوالب تعيين FHIR (معاينة)

توضح هذه المقالة كيفية تكوين Azure IoT Connector لموارد التشغيل البيني السريع للرعاية الصحية (FHIR®)* باستخدام قوالب التعيين.

يتطلب Azure IoT Connector ل FHIR نوعين من قوالب التعيين المستندة إلى JSON. النوع الأول، تعيين الجهاز، مسؤول عن تعيين حمولات الجهاز المرسلة إلى devicedata نقطة نهاية مركز أحداث Azure. يستخرج الأنواع ومعرفات الأجهزة ووقت تاريخ القياس وقيمة (قيم) القياس. النوع الثاني ، تعيين FHIR ، يتحكم في تعيين مورد FHIR. يسمح بتكوين طول فترة المراقبة ، ونوع بيانات FHIR المستخدم لتخزين القيم ، ورمز (أكواد) المصطلحات.

تتكون قوالب التعيين في مستند JSON استنادا إلى نوعها. ثم تتم إضافة مستندات JSON هذه إلى IoT Connector Azure الخاص بك ل FHIR من خلال مدخل Azure. تتم إضافة مستند تعيين الجهاز من خلال صفحة تكوين تعيين الجهاز ومستند تعيين FHIR من خلال صفحة تكوين تعيين FHIR .

ملاحظة

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

تعيين الجهاز

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

الخاصية الوصف
النوع الاسم / النوع لتصنيف القياس. يتم استخدام هذه القيمة للربط بقالب تعيين FHIR المطلوب. يمكن إخراج قوالب متعددة إلى نفس النوع مما يسمح لك بتعيين تمثيلات مختلفة عبر أجهزة متعددة إلى إخراج مشترك واحد.
HappenenceTimeUtc الوقت الذي حدث فيه القياس.
DeviceId معرف الجهاز. يجب أن تتطابق هذه القيمة مع معرف على مورد الجهاز الموجود على خادم FHIR الوجهة.
الخصائص استخراج خاصية واحدة على الأقل بحيث يمكن حفظ القيمة في مورد المراقبة الذي تم إنشاؤه. الخصائص عبارة عن مجموعة من أزواج القيم الرئيسية المستخرجة أثناء التطبيع.

فيما يلي مثال مفاهيمي لما يحدث أثناء التطبيع.

Normalization Example

حمولة المحتوى نفسها هي رسالة Azure Event Hub، والتي تتكون من ثلاثة أجزاء: النص الأساسي والخصائص وSystemProperties. صفيف Body بايت يمثل سلسلة مشفرة UTF-8. أثناء تقييم القالب، يتم تحويل صفيف البايت تلقائيا إلى قيمة السلسلة. Properties هي مجموعة قيم رئيسية لاستخدامها من قبل منشئ الرسالة. SystemProperties هي أيضا مجموعة قيم رئيسية محجوزة بواسطة إطار عمل Azure Event Hub مع إدخالات يتم تعبئتها تلقائيا.

{
	"Body": {
		"content": "value"
	},
	"Properties": {
		"key1": "value1",
		"key2": "value2"
	},
	"SystemProperties": {
		"x-opt-sequence-number": 1,
		"x-opt-enqueued-time": "2019-02-01T22:46:01.8750000Z",
		"x-opt-offset": 1,
		"x-opt-partition-key": "1"
	}
}

التعيين باستخدام مسار JSON

تعتمد أنواع قوالب محتوى الأجهزة الثلاثة المدعومة اليوم على مسار JSON لمطابقة كل من القالب المطلوب والقيم المستخرجة. يمكن العثور على مزيد من المعلومات حول مسار JSON هنا. تستخدم جميع أنواع القوالب الثلاثة تنفيذ JSON .NET لحل تعبيرات مسار JSON.

JsonPathContentTemplate

يسمح JsonPathContentTemplate بمطابقة القيم واستخراجها من رسالة مركز الأحداث باستخدام مسار JSON.

الخاصية الوصف مثال
النوعالاسم النوع المراد إقرانه بالقياسات التي تطابق القالب. heartrate
TypeMatchExpression تعبير مسار JSON الذي يتم تقييمه مقابل حمولة مركز الأحداث. إذا تم العثور على JToken مطابق ، اعتبار القالب مطابقا. يتم تقييم جميع التعبيرات اللاحقة مقابل JToken المستخرجة المتطابقة هنا. $..[?(@heartRate)]
الطابع الزمنيالتعبير تعبير مسار JSON لاستخراج قيمة الطابع الزمني ل HappenenceTimeUtc الخاص بالقياس. $.endDate
DeviceIdExpression تعبير مسار JSON لاستخراج معرف الجهاز. $.deviceId
PatientIdExpression اختياري: تعبير مسار JSON لاستخراج معرف المريض. $.patientId
EncounterIdExpression اختياري: تعبير مسار JSON لاستخراج معرف اللقاء. $.encounterId
القيم[]. اسم القيمة الاسم المراد إقرانه بالقيمة المستخرجة بواسطة التعبير اللاحق. يستخدم لربط القيمة/المكون المطلوب في قالب تعيين FHIR. hr
القيم[]. القيمةالتعبير تعبير مسار JSON لاستخراج القيمة المطلوبة. $.heartRate
القيم[]. مطلوب سيتطلب وجود القيمة في الحمولة. إذا لم يتم العثور عليه، فلن يتم إنشاء قياس وسيتم طرح InvalidOperationException . true
أمثلة

معدل ضربات القلب

الرسالة

{
    "Body": {
        "heartRate": "78",
        "endDate": "2019-02-01T22:46:01.8750000Z",
        "deviceId": "device123"
    },
    "Properties": {},
    "SystemProperties": {}
}

القالب

{
    "templateType": "JsonPathContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]",
        "deviceIdExpression": "$.deviceId",
        "timestampExpression": "$.endDate",
        "values": [
            {
                "required": "true",
                "valueExpression": "$.heartRate",
                "valueName": "hr"
            }
        ]
    }
}

ضغط الدم

الرسالة

{
    "Body": {
        "systolic": "123",
        "diastolic" : "87",
        "endDate": "2019-02-01T22:46:01.8750000Z",
        "deviceId": "device123"
    },
    "Properties": {},
    "SystemProperties": {}
}

القالب

{
    "typeName": "bloodpressure",
    "typeMatchExpression": "$..[?(@systolic && @diastolic)]",
    "deviceIdExpression": "$.deviceId",
    "timestampExpression": "$.endDate",
    "values": [
        {
            "required": "true",
            "valueExpression": "$.systolic",
            "valueName": "systolic"
        },
        {
            "required": "true",
            "valueExpression": "$.diastolic",
            "valueName": "diastolic"
        }
    ]
}

Project قياسات متعددة من رسالة واحدة

الرسالة

{
    "Body": {
        "heartRate": "78",
        "steps": "2",
        "endDate": "2019-02-01T22:46:01.8750000Z",
        "deviceId": "device123"
    },
    "Properties": {},
    "SystemProperties": {}
}

القالب 1

{
    "templateType": "JsonPathContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]",
        "deviceIdExpression": "$.deviceId",
        "timestampExpression": "$.endDate",
        "values": [
            {
                "required": "true",
                "valueExpression": "$.heartRate",
                "valueName": "hr"
            }
        ]
    }
}

القالب 2

{
    "templateType": "JsonPathContent",
    "template": {
        "typeName": "stepcount",
        "typeMatchExpression": "$..[?(@steps)]",
        "deviceIdExpression": "$.deviceId",
        "timestampExpression": "$.endDate",
        "values": [
            {
                "required": "true",
                "valueExpression": "$.steps",
                "valueName": "steps"
            }
        ]
    }
}

Project قياسات متعددة من الصفيف في الرسالة

الرسالة

{
    "Body": [
        {
            "heartRate": "78",
            "endDate": "2019-02-01T22:46:01.8750000Z",
            "deviceId": "device123"
        },
        {
            "heartRate": "81",
            "endDate": "2019-02-01T23:46:01.8750000Z",
            "deviceId": "device123"
        },
        {
            "heartRate": "72",
            "endDate": "2019-02-01T24:46:01.8750000Z",
            "deviceId": "device123"
        }
    ],
    "Properties": {},
    "SystemProperties": {}
}

القالب

{
    "templateType": "JsonPathContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@heartRate)]",
        "deviceIdExpression": "$.deviceId",
        "timestampExpression": "$.endDate",
        "values": [
            {
                "required": "true",
                "valueExpression": "$.heartRate",
                "valueName": "hr"
            }
        ]
    }
}

IotJsonPathContentTemplate

يشبه IotJsonPathContentTemplate قالب JsonPathContentTemplate باستثناء أن DeviceIdExpression و TimetampExpression غير مطلوبين.

الافتراض عند استخدام هذا القالب هو أن الرسائل التي يتم تقييمها تم إرسالها باستخدام مجموعات تطوير البرامج (SDKs) لجهاز Azure IoT Hub أو ميزة تصدير البيانات (القديمة) في Azure IoT Central. عند استخدام مجموعات تطوير البرامج (SDK) هذه، تكون هوية الجهاز (على افتراض أن معرف الجهاز من Azure Iot Hub/Central مسجل كمعرف لمورد جهاز على خادم FHIR الوجهة) والطابع الزمني للرسالة معروفان. إذا كنت تستخدم مجموعات تطوير البرامج (SDK) الخاصة بجهاز Azure IoT Hub ولكنك تستخدم خصائص مخصصة في نص الرسالة لهوية الجهاز أو الطابع الزمني للقياس، فلا يزال بإمكانك استخدام JsonPathContentTemplate.

ملاحظة: عند استخدام IotJsonPathContentTemplate، يجب حل TypeMatchExpression للرسالة بأكملها ك JToken. انظر الأمثلة أدناه.

أمثلة

معدل ضربات القلب

الرسالة

{
    "Body": {
        "heartRate": "78"        
    },
    "Properties": {
        "iothub-creation-time-utc" : "2019-02-01T22:46:01.8750000Z"
    },
    "SystemProperties": {
        "iothub-connection-device-id" : "device123"
    }
}

القالب

{
    "templateType": "JsonPathContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@Body.heartRate)]",
        "deviceIdExpression": "$.deviceId",
        "timestampExpression": "$.endDate",
        "values": [
            {
                "required": "true",
                "valueExpression": "$.Body.heartRate",
                "valueName": "hr"
            }
        ]
    }
}

ضغط الدم

الرسالة

{
    "Body": {
        "systolic": "123",
        "diastolic" : "87"
    },
    "Properties": {
        "iothub-creation-time-utc" : "2019-02-01T22:46:01.8750000Z"
    },
    "SystemProperties": {
        "iothub-connection-device-id" : "device123"
    }
}

القالب

{
    "typeName": "bloodpressure",
    "typeMatchExpression": "$..[?(@Body.systolic && @Body.diastolic)]",
    "values": [
        {
            "required": "true",
            "valueExpression": "$.Body.systolic",
            "valueName": "systolic"
        },
        {
            "required": "true",
            "valueExpression": "$.Body.diastolic",
            "valueName": "diastolic"
        }
    ]
}

IotCentralJsonPathContentTemplate

لا يتطلب IotCentralJsonPathContentTemplate أيضا DeviceIdExpression وTimetampExpression، ويستخدم عند إرسال الرسائل التي يتم تقييمها من خلال ميزة تصدير البيانات في Azure IoT Central. عند استخدام هذه الميزة، يتم تسجيل هوية الجهاز (على افتراض أن معرف الجهاز من Azure Iot Central كمعرف لمورد جهاز على خادم FHIR الوجهة) والطابع الزمني للرسالة معروفان. إذا كنت تستخدم ميزة تصدير البيانات في Azure IoT Central ولكنك تستخدم خصائص مخصصة في نص الرسالة لهوية الجهاز أو الطابع الزمني للقياس، فلا يزال بإمكانك استخدام JsonPathContentTemplate.

ملاحظة: عند استخدام IotCentralJsonPathContentTemplate، يجب حل TypeMatchExpression للرسالة بأكملها ك JToken. انظر الأمثلة أدناه.

أمثلة

معدل ضربات القلب

الرسالة

{
    "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
    "messageSource": "telemetry",
    "deviceId": "1vzb5ghlsg1",
    "schema": "default@v1",
    "templateId": "urn:qugj6vbw5:___qbj_27r",
    "enqueuedTime": "2020-08-05T22:26:55.455Z",
    "telemetry": {
        "HeartRate": "88",
    },
    "enrichments": {
      "userSpecifiedKey": "sampleValue"
    },
    "messageProperties": {
      "messageProp": "value"
    }
}

القالب

{
    "templateType": "IotCentralJsonPathContent",
    "template": {
        "typeName": "heartrate",
        "typeMatchExpression": "$..[?(@telemetry.HeartRate)]",
        "values": [
            {
                "required": "true",
                "valueExpression": "$.telemetry.HeartRate",
                "valueName": "hr"
            }
        ]
    }
}

ضغط الدم

الرسالة

{
    "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
    "messageSource": "telemetry",
    "deviceId": "1vzb5ghlsg1",
    "schema": "default@v1",
    "templateId": "urn:qugj6vbw5:___qbj_27r",
    "enqueuedTime": "2020-08-05T22:26:55.455Z",
    "telemetry": {
        "BloodPressure": {
            "Diastolic": "87",
            "Systolic": "123"
        }
    },
    "enrichments": {
      "userSpecifiedKey": "sampleValue"
    },
    "messageProperties": {
      "messageProp": "value"
    }
}

القالب

{
    "templateType": "IotCentralJsonPathContent",
    "template": {
        "typeName": "bloodPressure",
        "typeMatchExpression": "$..[?(@telemetry.BloodPressure.Diastolic && @telemetry.BloodPressure.Systolic)]",
        "values": [
            {
                "required": "true",
                "valueExpression": "$.telemetry.BloodPressure.Diastolic",
                "valueName": "bp_diastolic"
            },
            {
                "required": "true",
                "valueExpression": "$.telemetry.BloodPressure.Systolic",
                "valueName": "bp_systolic"
            }
        ]
    }
}

رسم خرائط FHIR

بمجرد استخراج محتوى الجهاز في نموذج عادي ، يتم جمع البيانات وتجميعها وفقا لمعرف الجهاز ونوع القياس والفترة الزمنية. يتم إرسال مخرجات هذه المجموعة لتحويلها إلى مورد FHIR (الملاحظة حاليا). هنا يتحكم قالب تعيين FHIR في كيفية تعيين البيانات في ملاحظة FHIR. هل يجب إنشاء ملاحظة لنقطة زمنية أو على مدار ساعة؟ ما هي الرموز التي ينبغي إضافتها إلى الملاحظة؟ هل يجب تمثيل القيمة على أنها SampledData أم كمية؟ أنواع البيانات هذه هي جميع الخيارات التي تتحكم في تكوين تعيين FHIR.

CodeValueFhirTemplate

يعد CodeValueFhirTemplate حاليا القالب الوحيد المدعوم في تعيين FHIR في الوقت الحالي. يسمح لك بتحديد الرموز والفترة الفعالة وقيمة الملاحظة. يتم دعم أنواع قيم متعددة: SampledData و CodeableConcept و Quantity. جنبا إلى جنب مع هذه القيم القابلة للتكوين، يتم التعامل مع معرف مورد المراقبة والربط بموارد الجهاز والمريض المناسبة تلقائيا.

الخاصية الوصف
النوعالاسم نوع القياس الذي يجب أن يرتبط به هذا القالب. يجب أن يكون هناك قالب واحد على الأقل لتعيين الجهاز ينتج هذا النوع.
الفترةالفاصل الزمني الفترة الزمنية التي يجب أن تمثلها الملاحظة التي تم إنشاؤها. القيم المدعومة هي 0 (مثيل) و 60 (ساعة) و 1440 (يوم).
الفئة أي عدد من CodeableConcepts لتصنيف نوع الملاحظة التي تم إنشاؤها.
رموز واحد أو أكثر من الترميز لتطبيقه على الملاحظة التي تم إنشاؤها.
الرموز []. رمز رمز الترميز.
الرموز []. نظام نظام الترميز.
الرموز []. عرض شاشة الترميز.
القيمة القيمة التي يجب استخراجها وتمثيلها في الملاحظة. لمزيد من المعلومات، راجع قوالب نوع القيمة.
المكونات اختياري: مكون واحد أو أكثر لإنشاء على الملاحظة.
المكونات[]. رموز واحد أو أكثر من الترميز لتطبيقه على المكون.
المكونات[]. قيمة القيمة المراد استخراجها وتمثيلها في المكون. لمزيد من المعلومات، راجع قوالب نوع القيمة.

قوالب نوع القيمة

فيما يلي قوالب أنواع القيم المدعومة حاليا. في المستقبل ، قد تتم إضافة المزيد من القوالب.

عينةالبيانات

يمثل نوع بيانات SampledData FHIR. تتم كتابة قياسات الملاحظة إلى دفق قيمة يبدأ من نقطة زمنية ويزداد إلى الأمام باستخدام الفترة المحددة. في حالة عدم وجود قيمة ، E سيتم كتابة في دفق البيانات. إذا كانت الفترة بحيث تشغل قيمتان أخريان نفس الموضع في دفق البيانات، استخدام أحدث قيمة. يتم تطبيق نفس المنطق عند تحديث ملاحظة باستخدام SampledData.

الخاصية الوصف
الفترة الافتراضية الفترة الافتراضية بالمللي ثانية للاستخدام.
الوحدة الوحدة المراد تعيينها على أصل SampledData.

كميه

يمثل نوع بيانات FHIR الكمية . في حالة وجود أكثر من قيمة واحدة في التجميع، يتم استخدام القيمة الأولى فقط. عندما تصل قيمة جديدة ، يتم تعيين الخرائط إلى نفس الملاحظة ، وسوف تحل محل القيمة القديمة.

الخاصية الوصف
الوحدة تمثيل الوحدة.
رمز شكل مشفر للوحدة.
النظام النظام الذي يحدد نموذج الوحدة المشفرة.

مفهوم الترميز

يمثل نوع بيانات FHIR الخاص ب CodeableConcept . لا يتم استخدام القيمة الفعلية.

الخاصية الوصف
النص تمثيل النص العادي.
رموز واحد أو أكثر من الترميز لتطبيقه على الملاحظة التي تم إنشاؤها.
الرموز []. رمز رمز الترميز.
الرموز []. نظام نظام الترميز.
الرموز []. عرض شاشة الترميز.

أمثلة

معدل ضربات القلب - عينةالبيانات

{
    "templateType": "CodeValueFhir",
    "template": {
        "codes": [
            {
                "code": "8867-4",
                "system": "http://loinc.org",
                "display": "Heart rate"
            }
        ],
        "periodInterval": 60,
        "typeName": "heartrate",
        "value": {
            "defaultPeriod": 5000,
            "unit": "count/min",
            "valueName": "hr",
            "valueType": "SampledData"
        }
    }
}

الخطوات - أخذ العيناتالبيانات

{
    "templateType": "CodeValueFhir",
    "template": {
        "codes": [
            {
                "code": "55423-8",
                "system": "http://loinc.org",
                "display": "Number of steps"
            }
        ],        
        "periodInterval": 60,
        "typeName": "stepsCount",
        "value": {
            "defaultPeriod": 5000,
            "unit": "",
            "valueName": "steps",
            "valueType": "SampledData"
        }
    }
}

ضغط الدم - عينةالبيانات

{
    "templateType": "CodeValueFhir",
    "template": {
        "codes": [
            {
                "code": "85354-9",
                "display": "Blood pressure panel with all children optional",
                "system": "http://loinc.org"
            }
        ],
        "periodInterval": 60,
        "typeName": "bloodpressure",
        "components": [
            {
                "codes": [
                    {
                        "code": "8867-4",
                        "display": "Diastolic blood pressure",
                        "system": "http://loinc.org"
                    }
                ],
                "value": {
                    "defaultPeriod": 5000,
                    "unit": "mmHg",
                    "valueName": "diastolic",
                    "valueType": "SampledData"
                }
            },
            {
                "codes": [
                    {
                        "code": "8480-6",
                        "display": "Systolic blood pressure",
                        "system": "http://loinc.org"
                    }
                ],
                "value": {
                    "defaultPeriod": 5000,
                    "unit": "mmHg",
                    "valueName": "systolic",
                    "valueType": "SampledData"
                }
            }
        ]
    }
}

ضغط الدم - الكمية

{
    "templateType": "CodeValueFhir",
    "template": {
        "codes": [
            {
                "code": "85354-9",
                "display": "Blood pressure panel with all children optional",
                "system": "http://loinc.org"
            }
        ],
        "periodInterval": 0,
        "typeName": "bloodpressure",
        "components": [
            {
                "codes": [
                    {
                        "code": "8867-4",
                        "display": "Diastolic blood pressure",
                        "system": "http://loinc.org"
                    }
                ],
                "value": {
                    "unit": "mmHg",
                    "valueName": "diastolic",
                    "valueType": "Quantity"
                }
            },
            {
                "codes": [
                    {
                        "code": "8480-6",
                        "display": "Systolic blood pressure",
                        "system": "http://loinc.org"
                    }
                ],
                "value": {
                    "unit": "mmHg",
                    "valueName": "systolic",
                    "valueType": "Quantity"
                }
            }
        ]
    }
}

تمت إزالة الجهاز - CodeableConcept

{
    "templateType": "CodeValueFhir",
    "template": {
        "codes": [
            {
                "code": "deviceEvent",
                "system": "https://www.mydevice.com/v1",
                "display": "Device Event"
            }
        ],
        "periodInterval": 0,
        "typeName": "deviceRemoved",
        "value": {
            "text": "Device Removed",
            "codes": [
                {
                    "code": "deviceRemoved",
                    "system": "https://www.mydevice.com/v1",
                    "display": "Device Removed"
                }
            ],
            "valueName": "deviceRemoved",
            "valueType": "CodeableConcept"
        }
    }
}

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

اطلع على الأسئلة المتداولة على Azure IoT Connector ل FHIR (معاينة).

*في مدخل Azure، يشار إلى Azure IoT Connector ل FHIR باسم IoT Connector (معاينة). FHIR هي علامة تجارية مسجلة لشركة HL7 ويتم استخدامها بإذن من HL7.