-
Notifications
You must be signed in to change notification settings - Fork 1
2. Specification
Device Connectシステムは、マルチOS、マルチプラットフォームのランタイム環境上において、スマートデバイスと接続するためのAPI (RESTful) を提供します。これにより、スマートデバイスとの接続方法・連携方法の利便性を向上することを目的としています。
Device Connectシステムが提供する機能一覧は以下の通りです。
- 連携可能な周辺機器一覧を表示する機能
- 接続I/F(Bluetooth, BLE, Wi-Fi, NFC)の違いのわかりにくさの解消
- 機器プロファイルによる統一的なAPI
- ユーザによるアプリケーション認可機能
- etc.
Device Connectシステムでは、シンプルで手軽なHTTP通信と、効率的なWebSocket通信によるイベント処理を行い操作できるようにします。
以下の3つのデザインパターンを元にAPIの設計を行っています。
- One shot data
- Event driven data
- Streaming data
シンプルなRESTでDevice Conenct Managerにアクセスすることで、ウェアラブルデバイスやIoTデバイスの情報を取得、操作を行います。
例) アクセスした瞬間の心拍センサーの値を取得
WebSocketを使用して、ウェアラブルデバイスやIoTデバイスで発生するイベントを連続的に受信します。
例) 心拍センサーの値に変化があった瞬間の値を連続的に自動取得
Device Connect Managerは、各デバイスプラグインがWebサーバを立ち上げたURIをアプリケーションに中継します。
アプリケーションでは、受け取ったURIを直接参照することで、Device Connect Managerを経由せずに映像リソースなどのデータを受信します。
例) カメラ映像を要求した場合に、OSやGotAPIの内部構造を経由せずに映像リソースとしてアプリから直接利用
アプリケーションと各デバイスプラグインが立ち上げたWebサーバ間の通信においては、特に規定は行なっていません。
デバイスプラグインの仕様に合わせて、アプリケーションが処理する必要があります。
Device Connect Managerは、GotAPIで定義されているGotAPI Serverを実装したアプリケーションになります。
Device Connect Managerは OMA GotAPI v1.1 上で定義されている機能を実装しています。
詳しくは、GotAPIの資料を参照してください。
GotAPIでは、標準化したAPIを定義しています。
Device Connectシステムでは、GotAPIが定義している以下のAPIを実装しています。
GotAPIサーバ(Device Connect Manager)が起動しているか確認します。
GotAPI Auth Serverにユーザ認可を求めます。
ユーザに認可された場合にアクセストークンを取得することができます。
Availability、Authorization以外のAPIにアクセスする場合には、ここで取得したアクセストークンを一緒に送らないとアクセスすることができません。
クライアントIDを生成します。
アクセストークンを生成します。
GotAPIサーバ(Device Connect Manager)に接続されているサービス(デバイス)一覧を取得します。
例) ServiceDiscoveryでサービスを検索します。
GET /gotapi/servicediscovery?accessToken=xxxxx HTTP/1.1
Host: localhost:4035
Origin: www.example.com
{
"product":"Device Connect Manager",
"version":"x.x",
"result":0,
"services":[
{
"id":"device1.localhost.deviceconnect.org",
"name":"Service1",
"type":"Bluetooth",
"online":true,
"config":""
},
{
"id":"device2.localhost.deviceconnect.org",
"name":"Service2",
"type":"WiFi",
"online":false,
"config":""
}
]
}GotAPIサーバ(Device Connect Manager)からサービス(デバイス)の詳細な情報を取得します。
例) ServiceDiscoveryで発見したサービスのidを指定して詳細な情報を取得します。
GET /gotapi/serviceinformation?accessToken=xxxxx&serviceId=device1.localhost.deviceconnect.org HTTP/1.1
Host: localhost:4035
Origin: www.example.com
{
"product":"Device Connect Manager",
"version":"x.x",
"result":0,
"connect":{
"wifi":true
},
"supports":[
"system",
"battery",
"vibration"
],
"supportApis": [
// 省略
]
}
OMA GotAPI v1.1 の規定に従い、アプリケーションは、リクエストにOriginヘッダを付加する必要があります。
GotAPIのセキュリティ機能であるアプリケーション認可機能やホワイトリスト機能は、Originヘッダの情報を元に処理されます。
HTMLアプリケーションとNativeアプリケーションで付加するヘッダが異なります。
- HTMLアプリケーションの場合
RFC6454上で定義されるOriginをOriginヘッダに指定します。
GET /gotapi/availability HTTP/1.1
Host: 127.0.0.1:4035
Origin: http://xxx.example.com/
- Nativeアプリケーションの場合
X-GotAPI-OriginヘッダにNativeアプリケーションの識別子(Androidの場合はパッケージ名等)を指定します。
GET /gotapi/availability HTTP/1.1
Host: 127.0.0.1:4035
X-GotAPI-Origin: com.example.android.app
なお、本機能はDevice Connect Managerの設定画面で有効/無効を切り替えることができます。
本機能を無効にした場合は、Originが不要になるためにアプリケーション認可機能やホワイトリスト機能も同時に無効になります。
なお、Device Connect Managerでは、両方のヘッダが指定された場合は、Originヘッダを優先して使用します。
ユーザーが認可していないアプリケーションからのアクセスをブロックする機能です。
アプリケーションは、初めてDevice Connectシステムにアクセスする際、ユーザーからの認可とともに、アクセストークンを取得する必要があります。
アクセストークン無しでデバイスにアクセスしようとした場合、Device Connectシステムはアプリケーションに対してエラーを返却します。
なお、本機能はDevice Connect Managerの設定画面で有効/無効を切り替えることができます。
ホワイトリストに含まれないアプリケーションからのアクセスを禁止する機能です。
また、ユーザに対してアプリケーションのホワイトリスト管理機能及びUIと本機能の有効/無効を操作するUIを提供します。
これによりユーザ操作によって切り替え可能にします。
本機能が有効になっている場合、アプリケーションから受信したリクエストメッセージのOriginヘッダをチェックし、Originがホワイトリストに含まれていない場合、エラーを返却します。
アプリケーション側で、Device Connectシステムの正当性を検証できるように、アプリケーションからのリクエストへの応答にHMACを付加します。
本機能の使用・不使用はアプリケーション側に委ねられています。
Device Connect Managerでは、GotAPIのセキュリティ以外にも以下の制限を設けています。
Device Connect Managerは、127.0.0.1(localhost)以外の外部IPからのアクセスを許可することができます。
外部IPからのアクセスを許可している場合には、Device Connect Managerがインストールされている端末と同じネットワーク内のPC端末などから操作を行うことができます。
外部IPからのアクセスを許可する場合には、意図しない人からのアクセスが考えられますので、デフォルトでは無効に設定してあります。
ただ、機能にアクセスしようとした時点で、アプリケーション認可機能がDevice Connect Managerがインストールされている端末で実行され認可が求められます。
よって、認可を受けていない外部IPからのアクセスでは、操作することはできません。
Device Connect Managerで使用するポートを監視を行い、Device Connect Manager以外のアプリケーションが起動している場合には、警告を表示してユーザに確認を行います。
ユーザは、Device Connect Manager以外のアプリがポートを使用していることに気がつくことができ、Device Connect Managerになりすましをしているアプリケーションを発見することができるようになります。
iOSでは、バックグランドでアプリケーションが動作することができないため、他のアプリケーションがなりすましすることができません。よって、この機能はAndroidにのみ実装してあります。
各サービスの機能にアクセスするために Device Connect システムで定義したAPIです。
リクエストは、RESTの仕様であるArchitectural Styles and the Design of Network-based Software Architectures CHAPTER 5 Representational State Transfer (REST)を参考にして、フォーマットを定義します。
アプリケーションはリクエストを送信する際、下記のパラメータが必要になります。
| 論理名 | 物理名 | データ型 | 省略 | 設定値 |
|---|---|---|---|---|
| アクセストークン | accessToken | string | 右記参照 | Authorization APIで取得したアクセストークン。 Availability API、Authorization APIのみ省略可。それ以外のAPIでは必須。 GotAPIの仕様のため、詳細はこちらを参照してください。 |
なお、 Device Connect Managerでは、設定画面において、アプリケーション認可機能の有効/無効を切り替えることができます。
アプリケーション認可機能が無効に設定されている場合には、accessTokeを省略することができます。
Device Connect APIでは以下のHTTPメソッドをサポートしています。
| HTTPメソッド |
|---|
| GET |
| PUT |
| POST |
| DELETE |
HTTP アクセス制御 (CORS)に対応するために、OPTIONSヘッダについては、Webサーバ側でレスポンスを返却します。
Access-Control-Allow-Origin: *
Device Connect Managerは、CORSのレスポンスで全てのOriginに対して許可を行なっています。
Device Connect では、以下の規則に基づいて、Device Connect APIを定義します。
URIは、/api/profile/interface/attributeのセグメントで定義します。
- interfaceとattributeは省略可能である。
- interfaceが存在する時は、attributeは省略不可とする。
例) interfaceとattributeが省略された場合
/api/profile
例) interfaceが省略された場合
/api/profile/attribute
例) 省略がない場合
/api/profile/interface/attribute
| セグメント | 省略 | 説明 |
|---|---|---|
| api | - | Device Connect APIが使用するAPIの名前を指します。 OMAのGotAPIを元にしているため、apiは「gotapi」を指定しています。 |
| profile | - | ユニークな機能ごとにそれぞれprofileを割り当てます。 |
| interface | ○ | 提供されるプロファイルで、細分化できる機能がある場合にはinterfaceとして割り当てます。 |
| attribute | ○ | 提供されるプロファイルで、取得・操作が可能な属性を持つ場合にattributeとして割り当てます。 |
Device Connectでは、GETメソッドを用いて、POST/PUT/DELETEを操作できるようにするために、以下のようなセグメントを定義します。
/api/method/profile/interface/attribute
| セグメント | 省略 | 説明 |
|---|---|---|
| method | ○ | PUT、POST、DELETEの代替操作を行うためのメソッドを指定します。 |
例) GETメソッドで、PUT操作相当を行う
GET /gotapi/put/mediaPlayer/play
api、profile、interface、attributeの各セグメントは、以下の命名規則に基づき定義します。
- ローワーキャメルケースで定義する。
- セグメントは複数単語(2,3単語程度)に収める。
- 意味のない冗長な単語はなるべく使用しない。
- UnixやDOSなどのコマンド名を使用しない。
例) ローワーキャメルケースで定義する。
正: PUT /gotapi/mediaPlayer/play
誤: PUT /gotapi/meida_payer/play
PUT /gotapi/meida-payer/play
ただし、Device Connectシステムでは、profile、interface、attributeの大文字小文字を無視して処理を行います。
一般的な略語は使用して良いこととします。
例) 一般的な略語
PUT /gotapi/tv
PUT /gotapi/ecg/onECG
一般的でない略語や複数の意味を持つような単語を使用する場合には、その旨をWikiなどで説明します。
例) 一般的でない略語
PUT /gotapi/omnidirectionalImage/roi
ROIは、「Region Of Image」の意味で使用していますが、「Return On Investment」などの略語の可能性もあるため、説明を追加する必要があります。
値の範囲が決まっているのならば、/profile/interface/attributeに数値などを含めても良いこととします。
- 可変的に数値を変えられるような数値は使用してはいけない。
- 推奨としては、0〜10程度の範囲とする。
例) GPIOのピン番号
GET /gotapi/gpio/export/pin0
GET /gotapi/gpio/export/pin1
GET /gotapi/gpio/export/pin2
同じ綴りのAPIは用意しないようにします。
例) onECGとoneCgで同じ綴り
PUT /gotapi/ecg/onECG
PUT /gotapi/ecg/oneCg
造語、商品名などは、汎用性のない操作を定義する時に使用します。
例) Spheroのデバイスの機能を使用する
PUT /gotapi/sphero/quaternion/onQuaternion
Spheroは、アメリカ Spheroのアメリカおよびその他の国における登録商標または商標です。
RESTでは動詞を使用してはいけないが、Device Connectでは分かりやすさを重視して使用しても良いこととします。
- profileは名詞にする。
- interface、attributeは動詞を使用しても良い。
例) attributeに動詞を使用
POST /gotapi/notification/notify
POST /gotapi/phone/call
既存のGotAPIやDevice Connectで定義されているProfileは、予約語となるために独自Profileで使用することはできない。
例) 既に定義されているプロファイル
GET /gotpai/availibity
GET /gotpai/files
など
イベント処理の設定を行うAPIは、attributeにonというプレフィックスを付けます。
例) イベントの登録
PUT /gotapi/battery/onChargingChange
PUT /gotapi/deviceOrientation/onDeviceOrientation
例) イベントの解除
DELETE /gotapi/battery/onChargingChange
DELETE /gotapi/deviceOrientation/onDeviceOrientation
GotAPIで定義されているイベント処理では、onが付かない場合があります。
例) GotAPIで定義されているAPI
PUT /gotapi/health/heart
ステータスコードは、200で返します。
HTTPレスポンスヘッダのcontent typeには、application/jsonを返します。
HTTPレスポンスボディには、JSONを返します。
Device Connect Managerからのレスポンスには以下のパラメータが返却される。
| 論理名 | 物理名 | データ型 | 省略 | 備考 |
|---|---|---|---|---|
| 処理結果 | result | 数値 | - | 0:正常応答 0以外:異常応答 |
| プロダクト名 | product | 文字列 | - | 処理を行った Device Connect Managerの名前 |
| バージョン名 | version | 文字列 | - | 処理を行った Device Connect Managerのバージョン名 |
| HMAC | hmac | 文字列 | ○ | Device Connect Managerの正当性を示すための署名。アプリケーションが事前にHMAC生成鍵を送信していなかった場合は省略される。 |
{
"product" : "Device Connect Manager",
"version" : "2.0.0",
"result" : 0,
"playStatus" : {
"mediaId" : "media001",
"mimeType" : "audio/mp3",
"status" : "play",
"trackNo" : 5,
"pos" : 80
},
"hmac" : "abcdef0123456789"
}
リクエストに対するレスポンスは result が 0以外 のとき、以下の項目を含むレスポンスを返却します。
| 論理名 | 物理名 | データ型 | 備考 |
|---|---|---|---|
| エラーコード | errorCode | 数値 | エラーを識別するためのコード |
| エラーメッセージ | errorMessage | 文字列 | エラーの内容 |
{
"product" : "Device Connect Manager",
"version" : "2.0.0",
"result" : 0,
"errorCode" : 1,
"errorMessage" : "Unknown error."
}
| エラーコード | エラー内容 |
|---|---|
| 1 | 原因不明のエラー |
| 2 | 未サポートプロファイルエラー |
| 3 | 未サポートアクション(HTTPメソッド)エラー |
| 4 | 未サポートアトリビュートエラー |
| 5 | デバイスID未設定エラー |
| 6 | デバイス発見失敗エラー |
| 7 | タイムアウトエラー |
| 8 | 未知のインターフェースへのアクセスエラー |
| 9 | バッテリー低下による操作不能エラー |
| 10 | 不正なリクエストパラメータエラー |
| 11 | 認証エラー |
| 12 | アクセストークン有効期限切れエラー |
| 13 | アクセストークン未設定エラー |
| 14 | スコープ外へのアクセスエラー |
| 15 | 認証時にクライアントIDを発見できなかったエラー |
| 16 | デバイス状態異常エラー |
| 17 | サーバー状態異常エラー |
| 18 | リクエストの発行元が不正 |
| 19 | リクエストURLが不正 |
| 20 | Profile名が不正 |
Device Connect Managerと連携して周辺機器を操作、および、イベントを送信するアプリケーションになります。
スマートフォン内で周辺機器毎のAndroidもしくはiOSアプリケーションとして構成されます。