PD Exchange / FAQ

2016/5/10 updated

Q: PD Exchangeについての質問方法

A: 営業担当へご連絡ください。フォーラム等の開設は検討中です

Q: Application(app_id) もしくは Device(deid)に紐付いているchannel一覧の取得方法

A: 下記APIを使ってください (1.0.13で実装)

また、現在紐付いているチャネルの数が GET /api/v1/apps/:app_id および GET /api/v1/devices/:deid に入ります

これは、新規着信データの有無確認の利用を想定しています

Q: Deviceが3個、利用したいアプリが2つある場合、総チャネル数はいくつになるのか

A: 6

解説;

デバイス = device1, device2, device3 / アプリ = view, alert という場合状況下で全部の掛けあわせが下記の通りとなります

Device

App

1

device1

view

2

device1

alert

3

device2

view

4

device2

alert

5

device3

view

6

device3

alert

例えば device1では viewと alert を、device2 と device3 では view だけ使うケースでは、下記の通り 計4つです

Device

App

1

device1

view

2

device1

alert

3

device2

view

4

device3

alert

ポイント: デバイス(=使用者)が、どのアプリを使うか選択できる、ということに特徴があります

Q: API (PD Exchange API) の開発環境整備方法

A: Starting Developmentを参照ください

Q: POST /api/v1/utils/hmac を使わずに、各言語でHMAC値を生成する方法

A: PHPの例を掲載します。他の言語でもDigest系関数/メソッドにて同様の値が生成可能です

ダイジェストにはSHA224を使用するようにしてください

hash_hmac, base64_encode, strtrを組み合わせて使います。以下、PHPの場合です

strtr(base64_encode(hash_hmac("sha224", "02.351491.00000010", "cc5199bdb74c", true)), "+/", "-_");

※ “=” 文字を削除する機能は11/2時点で削除されました

Q: APIはCORS(Cross-Origin Resource Sharing)に対応していますか

A: 対応しています

Q: 正しいトークンを使用してるはずなのにAPIコールの認証に失敗する

A: Bearerのスペルを確認してください

解説;

一部のドキュメントで Bearar と表記がありましたが、正しくは Bearer です

よって、正しいHeaderは Authorization: Bearer TOKEN_TOKEN となります

ちなみに Bearer はignore case(大文字、小文字不問)です

Q: (lib)curl 使用時における filter の range構文内 * 文字の扱い

A: * が glob文字として認識されてしまうため、それを回避する必要があります

解説;

コマンドラインcurlの例:

-G でglobを回避しつつ --data-urlencode で適切にURL encodeします

$ curl -H "Authorization: Bearer APP_TOKEN" -G --data-urlencode 'filter=msgid:{598734488247214099 TO *}' http://localhost:9292/api/v1/channels/CHANNEL_ID/messages

libcurlの例:

  • 文字に対する回避方法がありません※
    巨大な数値を入れることで自動的に範囲検索となるようにしてください
    e.g.)
    msgid:[1231231 TO 999999999999999999999]

※5/25: libcurlにはurlencodeがついていないようなので、もしかすると %2a で行けるかもしれませんが未確認です

Q: プロトコルによるAPI処理速度の違い

A: 生HTTPとHTTPSでは速度が20倍くらい違います。生HTTPの方が速いです

解説;

2015/5/25時点の社内検証用システムを対象としています

約200byteのPayloadを送信する場合、以下のようになりました

HTTPS

HTTP

1秒当たりの件数

1~2件

25件程度

1送信あたりの時間

500~1000[ms]

40~50[ms]

Q: デバイスが手元にない場合でも開発を行いたい場合 (ダミーのシリアルポートを作成したい)

A: Linuxの場合はsocatコマンドが利用できます

$ socat stdin pty,link=/tmp/ttyVR0,raw,echo=0

上記コマンドで /tmp/ttyVR0 という仮想シリアルポートが作成されました

入力待ち受けのような状態になりますが正常です(このターミナルは後程利用します)

Node.jsによる読み出し

serialport.js

var SerialPort = require("serialport").SerialPort;

var serialPort = new SerialPort("/tmp/ttyVR0", {

  baudrate: 115200

}, false); // this is the openImmediately flag [default is true]

serialPort.open(function (error) {

  if ( error ) {

    console.log('failed to open: '+error);

  } else {

    console.log('open');

    serialPort.on('data', function(data) {

      console.log('data received: ' + data);

    });

  }

});

socatを立ち上げたターミナルとは別のターミナルで、nodeを実行します

$ npm install serialport

$ node serialport.js

open

socatを立ち上げたターミナルで、何かしらの文字を入力しEnterを押してみてください

$ socat stdin pty,link=/tmp/ttyVR0,raw,echo=0

ABCD<enter>

すると、Node.jsを立ち上げたターミナルに下記のように表示されます

$ node serialport.js

open

data received: ABCD

以上のように /tmp/ttyVR0 を仮想シリアルポートとしてプログラミングすることが可能になりました

socatの入力は自由度が高く、例えば下記のように1秒毎に1回ランダムな数値を出すシェルスクリプトを流すことも可能です

$ (while true ; do expr $RANDOM % 100 ; sleep 1 ; done) \

  | socat stdin pty,link=/tmp/ttyVR0,echo=0,raw

Q: 開発者ライセンスから本番ライセンスへの切り替えはどのように行うのですか?データは保持されるのですか?

A: 本番ライセンスをご注文いただいた後、2つのうちいづれかからお選びいただくことになります

  1. 現在の開発者ライセンスで使用しているIDを本番ライセンスにアップグレードする
  2. 現在の開発者ライセンスは維持したまま、新規で本番ライセンスを発行する

いづれの場合においても、開発者ライセンスで作成されたデータは、データボリューム(保管先)を削除しない限り、保持・使い続けることができます

Q: Channelの削除はアプリケーション側から行うことは可能ですか?

A: 不可能です。Channelの削除はデバイス側(DeIDとSecretKeyを持つ側)からのみの操作となります

これは「Channelを操作する権利はデバイス側にある」という考えのもとに実装されているからです

アプリケーション側からは削除できませんが、当該Channelのデータを取得したくない場合は、下記のいづれかで対応するようにしてください

  1. 当該Channelに対するGETやPOST操作を止めるようにアプリケーション実装する
  2. 当該Channelの削除をデバイス側に依頼する

Q: PD Exchange 1.1.15 にアップグレードしたら動作しなくなった

A: PD Exchange動作用のDB格納ディレクトリのオーナー(UID)が1.1.15から変更されました

それにより下記のようなエラーが発生している場合があります

docker_host$ docker exec pdex supervisorctl pgsql

FATAL:  data directory "/var/lib/postgresql/data" has wrong ownership

HINT:  The server must be started by the user that owns the data directory.

この場合、下記のようにコマンドを打つことで解消されます

docker_host$ docker exec pdex chown -R postgres:postgres /var/lib/postgresql/data