انطلق و Vue و 3 أيام للتطوير: نظام في الوقت الحقيقي لمراقبة المرضى

في نوفمبر 2019 ، سمع الناس عن الحالات الأولى لمرض قاتل غير معروف في الصين. يعلم الجميع الآن أن هذا المرض يسمى COVID-19. يبدو أن الوباء غيّر العالم إلى الأبد. الفيروس خطير ومعدٍ للغاية. والبشرية لا تعرف الكثير عنها بعد. آمل حقًا أن يتم العثور على علاج لهذا المرض قريبًا. إن طبيعة الفيروس تجعل من الصعب للغاية منع انتشاره. في سريلانكا ، حيث أعيش ، نواجه نفس الوضع مثل الناس في البلدان الأخرى. أريد أن أتحدث هنا عن كيف تمكن المبرمجون من تقديم كل المساعدة الممكنة لأولئك الذين يحاربون المرض وجهاً لوجه.





المخاطر المتعلقة برعاية المرضى


يمكن أن يصاب الشخص حتى لو ارتكب خطأً صغيراً. يجب على الأطباء بشكل دوري زيارة عنابر العزل المعدية للتحقق من العلامات الحيوية للمرضى. بعد زيارة مركز الاعتقال ، يجب تدمير البدلات الواقية. وكل هذا لمجرد إلقاء نظرة على المؤشرات المعروضة على شاشات الأجهزة الطبية.

خاطبنا ممثلو السلطات الصحية باقتراح لتطوير نظام للرصد عن بعد للمرضى. هناك حلول مراقبة متكاملة مكلفة للغاية. لكن سريلانكا ليست دولة غنية.

بداية العمل


لذا ، قمنا (أنا و Keshara ) ببعض الأبحاث ووجدنا أن الأجهزة التي يجب أخذها من المؤشرات ، والشاشات الموجودة بجانب السرير ، تستخدم بروتوكول HL7 المشترك (المستوى الصحي 7) لتبادل البيانات الطبية (مثل المؤشرات الحيوية).

لقد أمضينا بعض الوقت في دراسة هذا البروتوكول. لقد بدا غريبا بعض الشيء بالنسبة لنا. لم نعمل معه من قبل. بالنسبة لنا كان تحديا جديدا.

إليك ما تبدو عليه رسائل HL7.


حزمة HL7

في القسم ،Messageيتم تقديم البيانات الطبية للمريض كما هو موضح أدناه. <CR>- هذا\rهو حرف تغذية سطر يستخدم لفصل الرسائل.

MSH|^~\&|||||||ORU^R01|103|P|2.3.1|<CR>
PID|||14140f00-7bbc-0478-11122d2d02000000||WEERASINGHE^KESHARA||19960714|M|<CR>
PV1||I|^^ICU&1&3232237756&4601&&1|||||||||||||||A|||<CR>
OBR||||Mindray Monitor|||0|<CR>
OBX||NM|52^||189.0||||||F<CR>
OBX||NM|51^||100.0||||||F<CR>
OBX||ST|2301^||2||||||F<CR>
OBX||CE|2302^Blood||0^N||||||F<CR>
OBX||CE|2303^Paced||2^||||||F<CR>
OBX||ST|2308^BedNoStr||BED-001||||||F<CR>

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

تمكنا من العثور على مكتبات جيدة لمعالجة رسائل HL7 المكتوبة بلغات مختلفة.

لماذا اخترنا Go؟


إليك ما يكتبونه عن Go: "Go أو Golang هي لغة مكتوبة بشكل ثابت يعتمد بناءها على بناء الجملة C. ولكن تتميز Go ببعض الميزات الإضافية مثل وجود جامع القمامة في اللغة (كما هو الحال في Java) ، والعمل الآمن مع الأنواع وبعض الميزات لـ الكتابة الديناميكية. تم تطوير Go بواسطة Google في عام 2007. تم إنشاء اللغة من قبل مجموعة من المتخصصين ذوي المهارات العالية. هؤلاء هم روبرت جريسمر وروب بايك وكين طومسون ".

تم تصميم Go مع دعم تنفيذ التعليمات البرمجية متعددة الخيوط ، ويتم إنشاء الآليات المقابلة في اللغة. يحتوي Go على ما يسمى goroutins والقنوات ، والتي يسمح استخدامها للمبرمج بسرعة وبأقل جهد ممكن تطوير البرامج بمستوى عالٍ من التوازي.

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

بحثنا عن مكتبات جيدة لدعم بروتوكول HL7 المكتوب في Go ، وفي النهاية وجدنا أن هذا المكتب مناسب . كتب مؤلفه ، من بين أمور أخرى ، مادة جيدة حول HL7.

تسهل هذه المكتبة بشكل كبير العمل مع رسائل HL7.

لماذا اخترنا Vue؟


من وثائق Vue ، يمكنك معرفة ما يلي: "Vue (منطوقة / vjuː / ، شيء يشبه العرض) هو إطار عمل تقدمي لإنشاء واجهات المستخدم. على عكس الأطر المتجانسة ، أصبحت Vue مناسبة للنشر التدريجي ".

بفضل استخدام Vue ، تمكنا من إنشاء واجهات تفاعلية لطيفة بسهولة. لقد اخترنا Vue لأنها أداة قوية ومريحة لإنشاء واجهات. بالإضافة إلى ذلك ، استخدمنا Vuetify كمكتبة واجهة مستخدم.

شاشة بجانب السرير


بعد أن قمنا بدراسة دليل Mindray Bedside Monitor للمبرمجين (هناك الكثير من هذه الأجهزة في المستشفى ، لذلك اخترناها) ، أنشأنا نموذجًا أوليًا صغيرًا لفك تشفير رسائل HL7. تمكن النموذج الأولي من فك تشفير الرسائل بشكل صحيح وتحويلها إلى تنسيق JSON بشكل صحيح. قمنا بذلك باستخدام واجهة النتائج غير المرغوب فيها الموضحة في الدليل.


Mindray uMec10

ولكن عندما كان لدينا جهاز حقيقي تحت تصرفنا ، رفض العمل. بعد ذلك ، بدأت أنا و Keshara في تحليل الحزم في Wireshark ، محاولين اكتشاف ما كان يفعله الجهاز بالفعل. كما اتضح ، لم يستخدم الجهاز هذا البروتوكول. استخدم واجهة Realtime Result Interface - واجهة قديمة نوعًا ما لم تعد معتمدة من قبل الشركة المصنعة.

استرداد الرسائل من حزم HL7


إليك كيفية استرداد رسائل HL7 من الأجهزة. استخدمنا كائنًا لهذه المهمة bufio.Reader، نظرًا لأنه يوفر للمطور آليات معالجة تدفق فعالة. بدلاً من الوصول إلى طبقة الشبكة في كل مرة ، Readerسمح لنا بقراءة البيانات بكفاءة من اتصال TCP.

func (d *Device) ProcessHL7Packet() (hl7.Message, error) {
    //   ,   0x0B
    b, err := d.ReadByte()
    if err != nil {
        return nil, fmt.Errorf("error reading start byte: %s", err)
    }
    if b != byte(0x0B) {
        return nil, fmt.Errorf("invalid header")
    }

    //  
    payloadWithDelimiter, err := d.ReadBytes(byte(0x1C))
    if err != nil {
        return nil, fmt.Errorf("error reading payload: %s", err)
    }

    //       
    b, err = d.ReadByte()
    if err != nil {
        return nil, fmt.Errorf("error reading end byte %s", err)
    }
    if b != byte(0x0D) {
        return nil, fmt.Errorf("invalid message end")
    }

    //   2  hl7-
    payload := payloadWithDelimiter[:len(payloadWithDelimiter)-1]
    log.Debugf("Length of payload %d\n", len(payload))
    m, _, err := hl7.ParseMessage(payload)
    if err != nil {
        return nil, fmt.Errorf("error parsing hl7: %s\n", err)
    }
    return m, err
}

بنية النظام



بنية النظام ( أصلية )

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

لقد اخترنا PostgreSQL باعتباره نظام إدارة قواعد البيانات ، لأن هذا النظام مستقر وموثوق. باستخدام HA ، يمكنك إنشاء نظام تخزين بيانات موثوق به لنظام المراقبة. بالإضافة إلى ذلك ، يدعم النظام الذي اخترناه معالجة كميات كبيرة من بيانات الإدخال ، والتي كانت ميزة إضافية بالنسبة لنا.

في المستقبل ، باستخدام TimescaleDB ، نخطط لإنشاء نظام تحليلات في الوقت الحقيقي. ونتيجة لذلك ، أصبح PostgreSQL خيارنا المثالي ، حيث يمكن تثبيت TimescaleDB فوق PostgreSQL.

قمنا بتقسيم Health 24 API وبوابة Health 24 بناءً على اعتبارات إدارة النظام. عند إنشاء البوابة ، سعينا جاهدين للدمج والموثوقية. بفضل استخدام Golang ، كان حل هذه المشكلة سهلاً وممتعًا.

دخول العالم الحقيقي


يبلغ مراقبو السرير عن وجودهم عن طريق بث رسائل UDP. نحن بحاجة إلى التقاط ومعالجة هذه الحزم لاستخراج البيانات منها الضرورية لتنظيم الوصول إلى الأجهزة.

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


اكتشاف الجهاز

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

من خلال استخدام قنوات Go ، يمكننا بسهولة تخزين البيانات ذات الصلة في قاعدة بيانات PostgreSQL لتحليلها لاحقًا.

تسمح لك القنوات بتنظيم تفاعل مناسب بين الغوروتينات. كان استخدامها مريحًا للغاية.

تجربتي مع مشروع Kache ، وهي قاعدة بيانات تستند إلى الذاكرة المتوافقةمع Redis ، كانت مفيدة بالنسبة لي في حل الصعوبات المختلفة التي واجهتنا أثناء عملنا.

إخراج العلامات الحيوية في الوقت الحقيقي


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

باستخدام Vuetify ، أنشأنا تصميم واجهة يشبه واجهة شاشة بجانب السرير.

لإدارة حالة التطبيق ، استخدمنا Vuex وقمنا بتطوير خدمة تنبيه تأخذ في الاعتبار أولوية المهام ، والتي يتم استخدامها لتنبيه موظفي المستشفى في حالة المواقف الخطرة.

قمنا بدمج API والواجهة الأمامية باستخدام Socket.io، مما سمح لنا بإنشاء قناة اتصال فعالة ، يتم نقل البيانات من خلالها في الوقت الحقيقي.

أود أن أقول مرة أخرى شكرا ل Keshara للعمل الممتاز على الواجهة الأمامية.


لوحة تحكم في الوقت الفعلي

نشر النظام


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

بفضل دعمهم ، تمكنا من إنشاء شبكة موثوقة. بعد ذلك ، أطلقنا Ubuntu 18.04 على الخادم وبدأنا في نشر النظام.

قام Keshara بالكثير في هذا المجال ، حيث خاطر بالتعاقد مع COVID-19 في المستشفى.


Keshara ينشر نظاما في المستشفى

اختتام النظام في الإنتاج


إليك مقطع فيديو يوضح كيفية العمل مع النظام.


الدكتور ويكراماسينغ يختبر النظام





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

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

هذا لا يشير إلى أننا أنشأنا نظامًا مستحيل تحسينه بالفعل. نحن نعمل باستمرار على تحسينه وتصحيح الأخطاء وتحقيق الاستقرار العالي للنظام.

نتيجة لذلك ، يجب أن نحذر الأطباء من أنه يجب عليهم استخدام هذا النظام بحذر.

ملخص


يعمل العاملون الطبيون في طليعة المعركة مع الفيروس دون راحة. يجب أن نقدم لهم كل المساعدة الممكنة. نحن ، طلاب تكنولوجيا الكمبيوتر ، فعلنا كل ما في وسعنا لدعمهم.

يسمح نظام المراقبة عن بعد لحالة المرضى بحل بعض المشاكل دون الاتصال المباشر بالمرضى ، مما يعني أنه يساعد الأطباء على القيام بعملهم بشكل أكثر كفاءة وأمانًا.

نشكر كل من طوّر أدوات ومكتبات رائعة مفتوحة المصدر ، والتي بدونها لن يكون مشروعنا مقدرًا على رؤية الضوء.

كان قرار استخدام Golang فكرة رائعة. سمح لنا استخدام هذه اللغة بإنشاء نظام مستقر للغاية في غضون أيام قليلة. ويمكن قول الشيء نفسه عن فيو. بفضل هذا الإطار ، تمكنا من إنشاء واجهة عالية الجودة وسهلة الاستخدام بسرعة كبيرة.

معا يمكننا هزيمة COVID-19.

القراء الأعزاء! كيف يمكنك بناء نظام مشابه للنظام الموصوف في هذه المقالة؟


All Articles