ORCA APIを利用する(Post)


仕事が少し落ち着いたので前回に引き継き日医オープンソースORCAの話題である。
前回はGetの場合であるが、殆どのAPIがPostでのリクエストに対応しているのでその場合のサンプルです。
例によって厳密なエラー処理などしていないので流用する場合は注意してください。

以下は特定の患者の診療歴を取得する場合の例です。
bodyを変更する事ですべてのAPIが利用できます。

Dim body As String
body = “<data>” & vbCrLf & _
“<medicalgetreq type=””record””>” & vbCrLf & _
“<InOut type=””string””>O</InOut>” & vbCrLf & _
“<Patient_ID type=””string””>000001</Patient_ID>” & vbCrLf & _
“<Perform_Date type=””string””></Perform_Date>” & vbCrLf & _
“<For_Months type=””string””>99</For_Months>” & vbCrLf & _
“</medicalgetreq>” & vbCrLf & _
“</data>”

Dim oruser As String = “ormaster”
Dim orpasswd As String = “ormaster”
Dim URL As String = “http://192.168.0.2:8000/api01rv2/medicalgetv2?class=01”

Dim CONTENT_TYPE As String = “application/xml”
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(“UTF-8”)
Dim Result As String

Dim record_in_byte As Byte() = Encoding.UTF8.GetBytes(body)
Dim req As HttpWebRequest = CType(HttpWebRequest.Create(URL), HttpWebRequest)
req.ServicePoint.Expect100Continue = False

req.Method = “POST”
req.ContentType = CONTENT_TYPE
req.ContentLength = record_in_byte.Length
req.Credentials = New NetworkCredential(oruser, orpasswd)
req.PreAuthenticate = True
req.KeepAlive = False


Try
Dim reqstream As System.IO.Stream = req.GetRequestStream()
reqstream.Write(record_in_byte, 0, record_in_byte.Length)
reqstream.Close()

Dim res As WebResponse = req.GetResponse()
Dim str As System.IO.Stream = res.GetResponseStream()

Dim strread As New System.IO.StreamReader(str, enc)

Dim FOO As String = strread.ReadToEnd()
Result = FOO

strread.Close()
str.Close()
res.Close()

Catch exc As WebException
Result = “ERROR”
If exc.Status = WebExceptionStatus.ProtocolError Then
Dim err As HttpWebResponse = DirectCast(exc.Response, HttpWebResponse)

Dim errcode As Integer = CInt(err.StatusCode)

‘Console.WriteLine(err.ResponseUri)
‘Console.WriteLine(“{0}:{1}”, errcode, err.StatusDescription)

err.Close()
Else
‘Console.WriteLine(exc.Message)
End If
End Try

‘以降Resultをparseする()

 

ORCA APIを利用する(Get)


ニッチな話題ですがお仕事で扱っている日医がオープンソースとして主に診療所等など用に公開しているORCAについて外部アプリケーションから患者の氏名などのデータを利用する案件があったのでメモ。

ORCAからデータを取得するにはAPIを使用するかPostgresqlのDBから直接読み込む方法があるがスマートな方法であるAPIを使用する事にした。

以下VB.Netでのサンプル。
このサンプルは唯一getメソッド?でアクセルするタイプのAPIです。
(https://www.orca.med.or.jp/receipt/tec/api/patientget.html)

サンプルはエラー処理などキチンとしていないのでもし再利用する方がいましたらその辺注意してください。
またC#のサンプルが本家にありますのでそちらも参考にしてください。

Dim USER As String = “ormaster”
Dim PASSWD As String = “ormasterpass”
Dim URL As String

URL = “http://192.168.0.5:8000/api01rv2/patientgetv2?id=<ptnum>”
URL = Replace(URL, “<ptnum>”, “1”) ‘患者番号

Dim ResultXML As String

Dim req As HttpWebRequest = CType(HttpWebRequest.Create(URL), HttpWebRequest)
req.Method = “GET”
req.Credentials = New NetworkCredential(USER, PASSWD)
req.PreAuthenticate = True
Dim res As HttpWebResponse = Nothing

Try
res = DirectCast(req.GetResponse(), HttpWebResponse)

Catch wex As WebException
If wex.Status = WebExceptionStatus.ProtocolError Then
Dim err As HttpWebResponse = DirectCast(wex.Response, HttpWebResponse)

        Dim errcode As Integer = CInt(err.StatusCode)

        Console.WriteLine(err.ResponseUri)
Console.WriteLine(“Response server => {0}”, err.Server)
Console.WriteLine(“{0}:{1}”, errcode, err.StatusDescription)

        err.Close()
Else
Console.WriteLine(wex.Message)
End If
End Try

If res IsNot Nothing Then
Dim str As Stream = res.GetResponseStream()
Dim strread As New StreamReader(str)

    ResultXML = strread.ReadToEnd()

    strread.Close()
str.Close()
res.Close()
End If

GC.Collect()
req.Abort()

‘正常に取れたらResultXMLをparseする

RFIDリーダーをテストする


しばらく前に秋葉原の秋月電子にて購入して放置していた「RFID Reader USB」を試してみた。
なんでかと言えばお仕事で関わっている会社さんで扱っている医療系システムに何か応用できないかと思ったからである。
DSC_0772

http://akizukidenshi.com/catalog/g/gM-06826/

4,800円だったので面白そうと思い何かの用で秋葉原に行った際に衝動買いしたものでリーダーとサンプルタグが何種類か同梱されている。
ちなみにこれとは別に125kHzようにRFIDタグカードを50枚別口で買って持っている。

秋月電子のページに詳しい事は書いてあるがざっと重要な部分を紹介する。

  • リーダーはバーチャルCOM I/FでPCと接続される
  • 125KHz EM4100のタグに対応。
  • 読み込みのみで書き込みはできない。

主流は13.56MHzと860~960MHzのものであるようだ。
しかしながらamazonなどでお手軽価格で手に入るのは125KHzのタグなので実験等には最も適していると思われる。

秋月電子のHPにも商品内容の写真はあるが

DSC_0773

同梱物はリーダー基板とサンプルタグ数種。
正方形と円形のものは厚さ1mmに満たないクレジットカードのような暑さ、大きさのものである。
青いのはキーホルダー的なもの。

ちょっと心配だったのがUSB COMのドライバーである。
製造元のParallax社のHPにて確認するも、ドキュメント類はあるがドライバーは無い。
ならばと、PCに接続してみたが難なくCOMポートとして認識した。
(Windows10環境)

DSC_0775

動作を確認するためのサンプル的なものはソースはあるがアプリは見つからなかったのでXojoでサクッと作成。
タグ情報を読み込む事ができた。
ちなみに読み込める距離はタグの位置によって異なるが基板に重ねる方向は感度が悪く10~20mm程度、横方向(上記写真の丸型タグ)だと最大で50mm位です。

データは0x0aに続いて5bytesの数値を10桁のアスキー文字列かしたもの、最後に0x0dが読み込む際にCOMポートから送られてくる事がわかった。
例:

0x0a|0x30|0x31|0x32|0x33|0x34|0x35|0x36|0x37|0x38|0x39|0x0d
の計12Bytes。

それとタグが読める範囲にあると繰り返し同じタグ情報を送ってくるので実際に使用する場合はその辺の対策がソフトウェア的に必要である。

RFIDReadertest

サンプルアプリで読み込んだ様子。別口で購入したRFIDタグカードも問題なく読み込めました。
50枚セットで購入したカード1400円/50枚で1枚あたり28円で比較的安価ですのでいろいろな用途に応用できるような気がします。

それとこのリーダーとは違いますがRF522というRFID用のモジュールがamazonなどで数百円で売られているけど、RaspberryPiに繋いで遊んでみたいですね。(13.56MHzです)

Xojoでオンラインサインアップのようなものを作る


よくネットにあるオンラインサインアップのようなものをXojoで作ってみた。
テスト段階なので単純にフォームに入れられたメールアドレスにメールを送信するだけのものですがユーザーのデータを記録するDBと本登録の機構を追加すれば最低限使用できるような形になるかと思います。
実際にはhttps等を使用したほうがよろしいかと思いますがXojoであればこんな感じの物も簡単に構築できます。

デモサイトは↓

http://124.41.69.194/567/labo/testonlinesignup/testonlinesignup.cgi

メールアドレスや入力されたパスワードは記録しません。
またパスワードの部分は何も処理してませんので入力しなくても動作します。
送信されるメールにURLが記載されておりますがそのURLは存在しません。