現在、シスコが提供している API の 1つに Mobility Services Engine(MSE)のAPIがあります。これを利用することで、Cisco CMXで取得している位置情報をアプリケーション開発者が簡単に利用できるようになります。Cisco Japan Blog でもいくつかの記事で、Cisco CMX のユースケースが紹介されていますが、そのなかの 1 つで紹介されている「ヒートマップ」を作成することを最終目標に、この API を見ていきたいと思います。
CMX 環境は、実機はもちろん、前回の記事で紹介した無料リモート ラボ「Sandbox」でも構築可能です。ただし REST(Representational State Transfer) API を利用するので、実機の場合、バージョン 7.5以上の MSE が必要となります。今回の記事は Sandbox を利用して動作を確認しています。
ブラウザで REST API へ簡易アクセス
REST は、ウェブブラウザの送受信に用いられる HTTP を使ってリソースを取得する仕組みです。
まずは百聞は一見にしかずということで、ブラウザを使ってクライアントの位置情報を取得する API にアクセスしてみます。(以下、すべて大文字の単語は環境に合わせた値、イタリック体はレスポンスです)
https:///api/contextaware/v1/location/clients/
デフォルトのデータ フォーマットである XML でレスポンスが返ってきているのが確認できると思います。
<Locations totalPages=...>
<WirelessClientLocation ssId=...>
<MapInfo mapHierarchyString="CAMPUS>BUILDING>FLOOR" floorRefId=...>
<Dimension length=.../>
</MapInfo>
<MapCoordinate x="123.45" y="67.89" unit="FEET"/>
<Statistics currentServerTime=.../>
</WirelessClientLocation>
...
</Locations>
REST API を使ってどんな情報が取得できるかは、ブラウザだけでも確認できます。ぜひ、他の API についてもリファレンスを参考にしながら試してみてください。
Python で API へアクセス
API で取得した情報を処理するためにはプログラミングが必要です。SDN などネットワーキングの世界でもプログラミングの比重が高くなってきているので、ネットワーク エンジニアにもプログラミングの知識が役立つ機会が多くなっているかと思います。
今回は対話的にプログラミング処理を行える Python のインタラクティブ モードを使います。コマンドのように1行ずつ処理を行うので、CLI に慣れ親しんでいるネットワーク エンジニアには抵抗なく利用できるプログラム言語です。
Python 2系と HTTP ライブラリである Requests モジュールを入れた環境を用意し、シェル(Windowsの場合、コマンドプロンプト)で「python」と入力するとプロンプト >>> が表示され、インタラクティブモードが起動しますので、まずは「変数 = 値」という形式で変数に MSE の情報を代入しておきます。
>>> mse_url = ‘https://<MSE>/api/contextaware/v1/’
>>> username = ‘USERNAME’
>>> password = ‘PASSWORD’
print 文で print の後の文字列をコンソールへ出力できるので、代入した値を確認できます。
>>> print mse_url, username, password
https://<MSE>/api/contextaware/v1/ USERNAME PASSWORD
次に Requests モジュールをインポートして、ブラウザでアクセスした API と同じクライアントの位置情報を取得する API へアクセスしてみます。レスポンスのデータ フォーマットは XML と JSON の 2種類があるので、今後、ブラウザで試した XML とは別の JSON で行います。
>>> import requests
>>> get_clients = requests.get(mse_url + 'location/clients/', auth=(username, password), headers = {'Accept': 'application/json'})
>>> print get_clients.text
{"Locations":{"totalPages":...,"entries":[{"macAddress":...,"MapInfo":{"mapHierarchyString":"CAMPUS>BUILDING>FLOOR","floorRefId":...,"Dimension":{"length":...}},"MapCoordinate":{"x":123.45,"y":67.89,"unit":"FEET"},"Statistics":{"currentServerTime":...}},...]}}
XML と同等の情報を取得できることがわかります。
次に Python で値を扱うため、JSON の配列とオブジェクトをそれぞれ Python のリストと辞書へ変換します。
>>> get_clients_json = get_clients.json()
>>> print get_clients_json
{u'Locations': {u'totalPages': ..., u'entries': [{u'macAddress': ..., u'Statistics': {u'currentServerTime': ...}, ..., u'MapCoordinate': {u'y': 67.89, u'x': 123.45, u'unit': u'FEET'}, ..., u'MapInfo': {u'floorRefId': ..., u'Dimension': {u'offsetX': ...}, u'mapHierarchyString': u'CAMPUS>BUILDING>FLOOR'}}, ...]}}
これで Python で情報を処理する準備が整いました。次回は、この情報を使って、マップ情報を処理していきます。
最後に補足として、JSON モジュールをインポートして、JSON の構造を理解しやすいようにインデントを入れた形でのエンコーディングをご覧ください。
>>> import json
>>> print json.dumps(get_clients_json, indent=4)
{
"Locations": {
"totalPages": ...,
...,
"entries": [
{
"macAddress":
...,
"Statistics": {
"currentServerTime":
...
},
...,
"MapCoordinate": {
"y": 67.89,
"x": 123.45,
"unit": "FEET"
},
...,
"MapInfo": {
"floorRefId": ...,
"Dimension": {
"offsetX": ...,
...
},
"mapHierarchyString": "CAMPUS>BUILDING>FLOOR"
}
},
...
]
}
}
API で取得できる情報が可視化されているのが分かります。なお、インタラクティブ モードは Ctrl-D や quit() で終了できます。
今回の内容は MSE の API だけでなく、SDN コントローラなど他のシステムでも REST と JSON の API であれば同様なので、CMX に携わっていない方にもぜひ参考にしていただきたいと思います。