2018年8月2日木曜日

②患者基本情報データの取得1

患者基本情報データの取得では、スマホとOpenDolphinまたはORCAサーバの通信内容を分析して、スマホに表示する患者基本情報データを取得していく。


図1:ORCAの患者さんの基本情報を登録する画面


まずは、図1のように、患者さんの基本情報である住所、電話番号、禁忌、アレルギー、感染症の情報を適当にORCAで記載していった。


次に5月24日の研究で行ったようにWiresharkを用いて、通信内容の分析を行っていく。
どこをどう動かしたら、うまく通信内容の分析ができ、スマホに表示する患者基本情報データを取得できるのか、よく分からないので、まずは、試しとして、スマホの中にある、Monacaのアプリを図2の「OpenDolphinクライアント」を押して、図3の画面にした時に流れる通信内容をWiresharkを使って、分析してみることにした。
図2:Monacaのホーム画面




図3:「OpenDolphinクライアント」を押した後の画面


図4:図2から図3にした際のWiresharkの画面
取得したパケットは上記の図4の様なものである。ここからprtocolが「HTTP」、Infoが「GET~」から始まるパケットを探すと1つしかなかった。それに対して、[追跡]>[HTTPストリーム]でパケットの再構築を行った。するとポップアップが表示されるので、show and save data asの項目を「UTF-8形式」に変更し、save as...よりパケットの保存を行う。尚、この際拡張子は「.txt」とする。


そのパケットの結果が以下である(以下はJSON Pretty Printを用い、すでにデータを整形し置き換えている)。


#1 GET /dolphin/openSource/pvt2/pvtList HTTP/1.1

.GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415016
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 2414
Date: Thu, 02 Aug 2018 05:59:17 GMT

{
  "list": [
    {
      "memo": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "patientModel": {
        "romanName": null,
        "nationality": null,
        "nationalityDesc": null,
        "maritalStatus": null,
        "jpegPhoto": null,
        "mobilePhone": "080-1234-5678",
        "relations": null,
        "reserve1": null,
        "reserve2": null,
        "reserve3": null,
        "reserve4": null,
        "reserve5": null,
        "reserve6": null,
        "memo": null,
        "email": "taro@google.co.jp",
        "facilityId": "1.3.6.1.4.1.9414.70.1",
        "telephone": null,
        "patientId": "00011",
        "healthInsurances": [
          {
            "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTcxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz5jODhjNjZjZC0zNWE2LTQ5YTUtOGJjNS02MTgzNWQ3MmNkYzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJTvvJHvvJDvvJbvvJHvvJLvvJTvvJI8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yZ77yW77yT77yVPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPnRydWU8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZUNsYXNzIj4KICAgPHN0cmluZz7ljZTkvJrjgZHjgpPjgb08L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZUNsYXNzQ29kZSI+CiAgIDxzdHJpbmc+MDk8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZUNsYXNzQ29kZVN5cyI+CiAgIDxzdHJpbmc+TU1MMDAzMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iaW5zdXJhbmNlTnVtYmVyIj4KICAgPHN0cmluZz4wMTQwMDAxOTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0icGF5T3V0UmF0aW8iPgogICA8c3RyaW5nPjAuMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InN0YXJ0RGF0ZSI+CiAgIDxzdHJpbmc+MjAxNy0xMS0yNzwvc3RyaW5nPgogIDwvdm9pZD4KIDwvb2JqZWN0Pgo8L2phdmE+Cg==",
            "id": 2398
          }
        ],
        "kanaName": "テストタロウ ",
        "gender": "male",
        "genderDesc": "M",
        "birthday": "1996-05-16",
        "simpleAddressModel": null,
        "appMemo": "診察1",
        "pvtDate": null,
        "ownerUUID": null,
        "fullName": "テスト太郎",
        "id": 6
      },
      "deptName": "内科",
      "deptCode": "01",
      "doctorName": "○○ ○○",
      "doctorId": "10002",
      "jmariNumber": "JPN000000000000",
      "pvtDate": "2018-07-23T13:31:08",
      "department": "内科,01,○○ ○○,10002,JPN000000000000,",
      "firstInsurance": "09 協会けんぽ",
      "insuranceUid": "c88c66cd-35a6-49a5-8bc5-61835d72cdc0",
      "lastDocDate": null,
      "appointment": null,
      "id": 2399,
      "state": 0
    }
  ]
}

前回、通信内容を分析した際と同じようなパケットキャプチャが今回も取得された。
テストで作成した、テスト太郎の基本情報やテスト太郎さんを担当する医師の名前や科、「beanBytes」を解析すると、保険情報だったので、テスト太郎さんの保険情報がこの通信で流れていることが分かった。


今回は、少し、見当違いのことをしているかもしれないと感じたので、どこをどうする通信内容を分析したら、スマホに表示する患者基本情報データを取得することができるのか、これから、しっかりと調べていきたい。


【コメント】

この試みはMonacaで開発したスマホアプリとOpenDolphinまたはORCAサーバの通信をPCでキャプチャしようとしてますが、それは無理です。なぜなら、スマホとサーバの通信内容は、たとえ同じネットワーク内といえども他の通信機器(この場合はPC)でキャプチャすることはできないからです。理由はスイッチングハブが宛先ポート番号を見て、関係のないポートへはデータを流さないからです。
ですから、この実験で図4に示すようなパケットがWiresharkによってキャプチャされるはずはあり得ません。考えられる原因は、(Wiresharkでパケットキャプチャしている)このPCでもOpenDolphinクライアントを立ち上げており、PCとOpenDolphinサーバとの通信データを、スマホアプリの通信データと間違えてキャプチャしていることです。それを確認するにはキャプチャしたデータのIPアドレスを見ればわかります。もし、IPアドレスがPCのIPアドレスであれば、ここに書いた通りのことが起きています。キャプチャしたパケットデータを保存していたら(実験するときは必ずあとでわかるように適切なファイル名を付けて保存すること)それを開いてサーバ(172.16.108.251)と通信しているクライアントのIPアドレスを確認してください。

私が調べた限りでは、ORCAに登録した感染情報やアレルギー情報など、スマホアプリに取り込みたい情報はOpenDolphinへは転送されていないようです。したがって、OpenDolphinクライアントとOpenDolphinサーバの通信をいくら調べても欲しい情報は手に入りません。
ところが幸いにORCAも「日医標準レセプトAPI」というWebAPIを提供しています。これを使えばORCAに登録したすべての患者基本情報をスマホアプリで取得できます。[詳細仕様]→[日医標準レセプトソフトAPI仕様(Ver 4.8.0以降)]と進んでいくと、API一覧表が表示され、その先頭に[患者基本情報]というのがあります。その行の右端にある[患者基本情報の取得]をクリックするとリクエスト、レスポンスに関する詳細な仕様が出てきます。[レスポンス一覧]を見ればどの項目がどの項目名になっているかわかります。
ただし、このORCAのAPIはレスポンスがJSON形式ではなくXML形式になっている点に注意してください(ただし、ver 5.0以降では引数のformatによってJSON形式を返すことが出来るようになっています)。

ORCAのAPIを使ったスマホアプリの作成は2年前のゼミ生がやっています。彼らのブログを参考にしてください。アプリのソースプログラムは[ORCA Client Ver 0.1]にあります。彼らと私たちのプログラムの違いは、私たちはJavascriptのフレームワークとしてAngularJSを利用している点です。彼らはアプリ画面の編集やプログラムの制御にjQuery以外は何もフレームワークを使っていないため、プログラミングが結構煩雑です。ですから、彼らのプログラムを咀嚼して(何なら彼らのプログラムを実装して動かしてみて)、それを参考にしながらAngularJS版に改変していけばよいと思います。

0 件のコメント:

コメントを投稿

レーダーチャートの表示2

前回 レーダーチャートの表示を行うことが出来たので、今回は実際の値を代入したグラフの描画を試みる。 .controller('RaderChartController', ['$scope', 'Countries', funct...