Pergi, Vue, dan 3 hari untuk mengembangkan: sistem waktu nyata untuk memantau pasien

Pada November 2019, orang-orang mendengar tentang kasus pertama penyakit mematikan yang tidak diketahui di Cina. Sekarang semua orang tahu bahwa penyakit ini disebut COVID-19. Rupanya, wabah itu selamanya mengubah dunia yang kita tahu. Virus itu berbahaya dan sangat menular. Dan umat manusia belum tahu banyak tentangnya. Saya sangat berharap bahwa obat untuk penyakit ini akan segera ditemukan. Sifat virus sedemikian rupa sehingga sangat sulit untuk mencegah penyebarannya. Di Sri Lanka, tempat saya tinggal, kita dihadapkan pada situasi yang sama dengan orang-orang di negara lain. Di sini saya ingin berbicara tentang bagaimana programmer dapat memberikan semua bantuan yang mungkin kepada mereka yang memerangi penyakit tatap muka.





Risiko terkait perawatan pasien


Seseorang dapat terinfeksi bahkan jika dia membuat kesalahan kecil. Dokter secara berkala harus mengunjungi bangsal isolasi untuk memeriksa tanda-tanda vital pasien. Setelah mengunjungi pusat penahanan, pakaian pelindung harus dihancurkan. Dan semua ini hanya untuk melihat indikator yang ditampilkan di layar perangkat medis.

Perwakilan dari otoritas kesehatan berbicara kepada kami dengan proposal untuk mengembangkan sistem pemantauan jarak jauh pasien. Ada solusi pemantauan turnkey yang sangat mahal. Tapi Sri Lanka bukan negara kaya.

Awal pekerjaan


Jadi, kami (I dan Keshara ) melakukan penelitian dan menemukan bahwa perangkat yang perlu diambil dari indikator, monitor samping tempat tidur, menggunakan protokol HL7 umum (Tingkat Kesehatan 7) untuk bertukar data medis (seperti indikator vital).

Kami menghabiskan waktu mempelajari protokol ini. Dia tampak agak aneh bagi kami. Kami belum pernah bekerja dengannya sebelumnya. Bagi kami itu adalah tantangan baru.

Seperti apa tampilan pesan HL7.


Paket HL7

Di bagian ini,Messagedata medis pasien disajikan seperti yang ditunjukkan di bawah ini. <CR>- Ini\radalah karakter umpan baris yang digunakan untuk memisahkan pesan.

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>

Terlihat aneh, kan? Tampaknya bagi kami. Ini menggunakan format Pipehat. Simbol digunakan di sini untuk memisahkan segmen data |. Saya tidak akan berbicara banyak tentang protokol itu sendiri. Ada banyak bahan di Internet tentang ini.

Kami berhasil menemukan perpustakaan yang bagus untuk memproses pesan HL7 yang ditulis dalam berbagai bahasa.

Mengapa kami memilih Go?


Inilah yang mereka tulis tentang Go: “Go atau Golang adalah bahasa yang diketik secara statis yang sintaksisnya didasarkan pada sintaksis C. Tapi Go ditandai oleh beberapa fitur tambahan seperti keberadaan pengumpul sampah dalam bahasa (seperti di Jawa), pekerjaan yang aman dengan jenis dan beberapa fitur untuk pengetikan dinamis. Go dikembangkan oleh Google pada tahun 2007. Bahasa ini diciptakan oleh sekelompok spesialis yang sangat terampil. Ini adalah Robert Griesmer, Rob Pike dan Ken Thompson. "

Go dirancang dengan dukungan untuk eksekusi kode multi-threaded, mekanisme yang sesuai dibangun ke dalam bahasa. Go memiliki apa yang disebut goroutin dan saluran, yang penggunaannya memungkinkan pemrogram dengan cepat dan dengan upaya minimal mengembangkan program dengan tingkat paralelisme yang tinggi.

Karena itu, kami memutuskan untuk memilih Go. Jika kita berbicara tentang masalah yang menghadang kita, maka kita berpikir bahwa, dalam menyelesaikannya, kita harus berurusan dengan kebutuhan untuk bekerja dengan banyak tugas paralel. Selain itu, Go executables dikompilasi secara statis, yang menyederhanakan instalasi program pada komputer rumah sakit, menghilangkan kebutuhan untuk perawatan ketergantungan.

Kami mencari perpustakaan yang bagus untuk mendukung protokol HL7 yang ditulis dalam Go, dan pada akhirnya kami menemukan ini cocok . Penulisnya, antara lain, menulis materi bagus tentang HL7.

Perpustakaan ini sangat memudahkan pekerjaan dengan pesan HL7.

Mengapa kami memilih Vue?


Dari dokumentasi Vue , Anda dapat menemukan yang berikut: “Vue (diucapkan / vjuː /, kira-kira seperti tampilan) adalah kerangka kerja progresif untuk membuat antarmuka pengguna. Tidak seperti kerangka kerja monolit, Vue dibuat cocok untuk penempatan bertahap. ”

Berkat penggunaan Vue, kami dapat dengan mudah membuat antarmuka reaktif yang bagus. Kami memilih Vue karena itu adalah alat yang kuat dan nyaman untuk membuat antarmuka. Selain itu, kami menggunakan Vuetify sebagai perpustakaan UI.

Monitor samping tempat tidur


Setelah kami mempelajari manual Mindray Bedside Monitor untuk programmer (ada banyak perangkat seperti itu di rumah sakit, jadi kami memilihnya), kami membuat prototipe kecil untuk mendekode pesan HL7. Prototipe ini dapat men-decode pesan dengan benar dan mengubahnya dengan benar ke format JSON. Kami melakukan ini menggunakan Antarmuka Hasil Tidak Diminta yang dijelaskan dalam manual.


Mindray uMec10

Tapi ketika kami memiliki perangkat nyata yang kami miliki, itu menolak untuk bekerja. Setelah itu, Keshara dan saya mulai menganalisis paket di Wireshark, mencoba mencari tahu apa yang sebenarnya dilakukan perangkat. Ternyata, perangkat tidak menggunakan protokol ini. Ini menggunakan Antarmuka Hasil Realtime - antarmuka yang agak lama yang tidak lagi didukung oleh pabrikan.

Mengambil Pesan dari Paket HL7


Berikut cara mengambil pesan HL7 dari perangkat. Kami menggunakan objek untuk tugas ini bufio.Reader, karena memberikan pengembang dengan mekanisme pemrosesan aliran yang efisien. Alih-alih mengakses lapisan jaringan setiap kali, Readeritu memungkinkan kami untuk secara efisien membaca data dari koneksi 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
}

Sistem arsitektur



Arsitektur sistem ( asli )

Sistem ini dirancang sedemikian rupa sehingga, dalam jangka panjang, ia bekerja dengan andal. Kami telah dengan cermat memilih alat terbaik untuk menyelesaikan tantangan yang kami hadapi.

Kami memilih PostgreSQL sebagai DBMS, karena sistem ini stabil dan dapat diandalkan. Dengan menggunakan HA, Anda dapat membuat sistem penyimpanan data yang andal untuk sistem pemantauan. Selain itu, sistem yang kami pilih mendukung pemrosesan volume besar data input, yang merupakan nilai tambah bagi kami.

Di masa depan, menggunakan TimescaleDB, kami berencana untuk membuat sistem analitik waktu-nyata. Akibatnya, PostgreSQL menjadi pilihan ideal kami, karena TimescaleDB dapat diinstal di atas PostgreSQL.

Kami membagi API 24 Kesehatan dan gateway 24 Kesehatan berdasarkan pertimbangan manajemen sistem. Saat membuat gateway, kami mengupayakan kekompakan dan keandalan. Berkat penggunaan Golang, pemecahan masalah ini mudah dan menyenangkan.

Memasuki dunia nyata


Monitor di samping tempat tidur melaporkan keberadaan mereka dengan menyiarkan pesan UDP. Kami perlu menangkap dan memproses paket-paket ini untuk mengekstrak data dari mereka yang diperlukan untuk mengatur akses ke perangkat.

Menggunakan Go, kami menciptakan layanan terpisah yang dirancang untuk mendeteksi transmisi siaran UDP dan untuk mendaftarkan perangkat baru di sistem. Langkah selanjutnya dalam pekerjaan kami adalah menghubungkan perangkat ke gateway. Kami telah membuat on Go layanan lain yang dirancang untuk mendukung koneksi TCP yang sesuai.


Penemuan perangkat

Karena gateway diperlukan untuk terhubung ke perangkat sebagai klien, kami harus mengoordinasikan dan memutuskan koneksi perangkat. Selain itu, status setiap monitor harus dipantau di gateway.

Melalui penggunaan saluran Go, kami dapat dengan mudah menyimpan data yang relevan dalam database PostgreSQL untuk analisis selanjutnya.

Saluran memungkinkan Anda untuk mengatur interaksi yang nyaman antara goroutine. Menggunakannya sangat nyaman.

Pengalaman saya dengan proyek Kache , yang merupakan basis data berbasis memori yang kompatibel dengan Redis, berguna bagi saya dalam menyelesaikan berbagai kesulitan yang menghadang kami dalam pekerjaan kami.

Output real-time dari tanda-tanda vital


Saat mengembangkan bagian server dari proyek, kami juga menangani bagian kliennya. Itu ditujukan untuk dokter dan ditujukan untuk menunjukkan data yang dibaca dari monitor samping tempat tidur. Bagian depan sebagian besar ditempati oleh Keshara. Hasilnya, antarmuka sistem yang sangat bagus dibuat hanya dalam 3 hari.

Menggunakan Vuetify , kami menciptakan tata letak antarmuka yang tampak seperti antarmuka monitor samping tempat tidur.

Untuk mengelola keadaan aplikasi, kami menggunakan Vuex dan mengembangkan layanan peringatan yang mempertimbangkan prioritas tugas, yang digunakan untuk memberi tahu staf rumah sakit jika terjadi situasi berbahaya.

Kami menggabungkan API dan antarmuka menggunakan Socket.io, yang memungkinkan kami untuk membuat saluran komunikasi yang efektif, data yang dilaluinya dikirimkan secara real time.

Saya ingin mengucapkan terima kasih sekali lagi kepada Keshara untuk pekerjaan luar biasa di frontend.


Dasbor waktu nyata

Penerapan sistem


Monitor di samping tempat tidur mengirim sejumlah besar data ke jaringan. Kami memutuskan untuk menggunakan VLAN terpisah untuk perangkat, dan VLAN lain untuk API. Tujuannya adalah untuk memungkinkan pemrosesan lalu lintas yang andal tanpa menciptakan kemacetan di jaringan rumah sakit. Selain itu, kami dibantu oleh profesor universitas kami, Dr. Asitha Bandaranaike dan Sunet Namal Karunaratna .

Berkat dukungan mereka, kami dapat membangun jaringan yang andal. Selanjutnya, kami meluncurkan Ubuntu 18.04 di server dan mulai menggunakan sistem.

Keshara telah melakukan banyak hal di bidang ini, mempertaruhkan kontrak COVID-19 di rumah sakit.


Keshara menyebarkan sistem di rumah sakit

Kesimpulan sistem dalam produksi


Berikut adalah video yang menunjukkan cara bekerja dengan sistem.


Wikramasinghe menguji sistem tersebut





Kami telah membuat kompleks program di atas atas permintaan perwakilan dari otoritas kesehatan. Proyek ini tidak komersial. Bahkan dengan mempertimbangkan keberadaan sistem ini di rumah sakit, kami sangat menyarankan agar dokter mengunjungi pasien dan secara pribadi memeriksa tanda-tanda vital mereka.

Karena kompleks ini berkembang sangat cepat, dalam pandemi, kami merilisnya, hanya melengkapi dengan yang paling penting: kemampuan untuk memantau. Selain itu, kami melakukan pengujian yang panjang, menggunakan banyak perangkat selama pengujian. Sampai sekarang, dia telah menunjukkan dirinya baik.

Ini tidak menunjukkan bahwa kami telah menciptakan sistem yang sudah mustahil untuk diperbaiki. Kami terus berupaya memperbaikinya dan memperbaiki kesalahan, mencapai stabilitas sistem yang tinggi.

Akibatnya, kita harus memperingatkan dokter bahwa mereka harus menggunakan sistem ini dengan hati-hati.

Ringkasan


Pekerja medis di garis depan pertempuran dengan virus bekerja tanpa istirahat. Kami harus memberi mereka semua kemungkinan bantuan. Kami, siswa teknologi komputer, melakukan segala yang kami bisa untuk mendukung mereka.

Sistem pemantauan jarak jauh dari kondisi pasien memungkinkan penyelesaian beberapa masalah tanpa kontak langsung dengan pasien, yang berarti membantu dokter untuk melakukan pekerjaan mereka dengan lebih efisien dan aman.

Kami berterima kasih kepada semua orang yang telah mengembangkan alat dan perpustakaan open source yang luar biasa, tanpanya proyek kami tidak akan ditakdirkan untuk melihat cahaya.

Keputusan untuk menggunakan Golang adalah ide yang brilian. Dengan menggunakan bahasa ini, kami dapat membuat sistem yang sangat stabil hanya dalam beberapa hari. Hal yang sama dapat dikatakan tentang Vue. Berkat kerangka kerja ini, kami dapat dengan cepat membuat antarmuka berkualitas tinggi dan ramah pengguna.

Bersama kita bisa mengalahkan COVID-19.

Pembaca yang budiman! Bagaimana Anda membangun sistem yang mirip dengan yang dijelaskan dalam artikel ini?


All Articles