はじめに
- NECさんとさくらインターネットさんが、データ流通システムの実証実験をされています
- オープンデータへのアクセスをElixirで楽しみたいとおもいます
-
curl
のコマンド例がドキュメントに書いてあるのできっとできるのでしょうが、やってみたことはとにかくアウトプットしてみることにしています
実証環境のご紹介 (PDF)
- そもそもこれが、一体全体何なのか私に説明を求められても説明はできません(断言します)
- こちらのPDFの内容がわかりやすいようにおもいましたのでご紹介しておきます
-
FIWAREがポイントのようにおもいます
- The Open Source Platform for Our Smart Digital Future
-
WireCloudというデータの可視化機能でこんな可視化ができます
- 実証環境のご紹介 (PDF)の通り進めただけです
- より詳しくは、ハンズオン詳細資料 (PDF)に書いてあります
- 私がやろうとしている「オープンデータへのアクセス」はこの可視化のもとになったデータをJSON形式で読み取るというものだとおもいます
準備
-
実証実験申し込みをします
- 申し込みから3日程度のちに、FIWARE実証実験 アカウント発行のお知らせというメールが届きました
- 私が申し込んだときは3種類のIDが発行されていました
- これからつかうものはマーケットプレイスアカウントです
- 申し込みが済んだらまずは、https://documents.fiware-testbed.jp/ を順にみていくとよさそうです
- 何度もご紹介しますが、「実証環境のご紹介 (PDF)」がリンクされていますのでまず確認するとよいとおもいます
- Elixir 1.12をインストールします
Let's get started
-
オープンデータへのアクセスをElixirに書いてある
curl
のコマンドをElixirが好きなのでElixirで置き換えてやってみました - 以下、感じてください
opendata_access.exs
# install Hex
Mix.install([
{:httpoison, "~> 1.8"},
{:jason, "~> 1.2"}
])
# トークン取得 (マーケットプレイスアカウントを使う)
body = %{
username: "userXXX@fiware-testbed.jp",
password: "xxxxxxxxxxxxxxxxx"
} |> Jason.encode!()
token =
HTTPoison.post!("https://orion.fiware-testbed.jp/token", body, [{"Content-type", "application/json"}])
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("access_token")
# エンティティの取得
headers = [{"X-Auth-Token", token}, {"Fiware-Service", "NEC"}, {"Fiware-ServicePath", "/fukuoka_aed"}]
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?type=PointOfInterest", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()
# エンティティ件数の取得
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?options=count", headers)
|> Map.get(:headers)
|> Enum.filter(fn {key, _} -> key == "fiware-total-count" end)
|> Enum.at(0)
|> elem(1)
|> String.to_integer()
|> IO.puts()
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?offset=990&limit=6", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()
# ジオフィルタリング
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0020", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("address")
|> IO.inspect()
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "address"))
|> IO.inspect()
# コンパクト表現(Key-Values)
## オプション指定なし
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()
## オプション指定あり
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=keyValues", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=values&attrs=name,description", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=values&attrs=description,name", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()
Run!!!
# elixir opendata_access.exs
- 「オープンデータへのアクセス」の実行結果と同じ値が得られることを確認できます
Wrapping Up
-
curl
のコマンド例の通りにElixirでデータアクセスができました - 次は自分の家の温度・湿度データを送ってみるということをやってみたいとおもっています
- @kikuzo さんから教えてもらいましたところ、すでにいただいている認証情報でデータを送ることができます!
- とりあえず curl でやってみました例を以下に記録しておきます
-
ガイドは「IoT Agent利用マニュアル」 が該当するとおもっています別途、利用するための設定情報を発行していただく必要があるようですFIWARE実証実験 アカウント発行のお知らせというタイトルのメールの送信元に問い合わせてみているというのがいまの私のステータスです