ラベル FMEasy在庫 の投稿を表示しています。 すべての投稿を表示
ラベル FMEasy在庫 の投稿を表示しています。 すべての投稿を表示

2017-10-17

iBeacon の適用モデルを考える 2 ― 定位置ビーコン監視モデル

 前稿の末尾で iBeacon の「常時監視・単品管理モデル」に少し触れましたが、これは倉庫等の保管場所にある商品に iBeacon を取り付け、その存否(存在するのか、しないのか)を iPad 等の端末により常時監視するというものです(下図)。本稿ではこのモデルを掘り下げて考えてみます。

天井等、高所に取り付けた端末で商品に取り付けられたビーコンを監視

 

モデルの再定義

本モデルは、iBeacon が取り付けられた商品(以下、ビーコン)が多数存在し、システムでビーコンの存否情報を管理することを目的とします。各ビーコンを監視する端末は1つに定められており、その端末がビーコンの電波を受信しなくなった時点で商品は存在しないものとシステムは認識します。ビーコンは倉庫内を移動することは無い(例えば、上図のA区画から他の区画へ移動することは無い)ものと規定します。このモデルを「定位置ビーコン監視モデル」と呼びます。 これに対して、ビーコンが倉庫内を移動し、移動するビーコンを監視・管理するモデルを「移動ビーコン監視モデル」と呼びます。本稿では、「定位置ビーコン監視モデル」についてのみ扱います。


シナリオ

上図のように定位置にある多数のビーコンを監視するために、必要十分な数のiOS端末(以下、端末、iOS以外の端末に言及する場合はその旨を表記)を配置します。端末にはビーコンの存否(ビーコンの信号検知時には存在、非検知時には存在しないと認識)を監視するシステムをインストールしておきます。端末がビーコンの電波を検知しない場合、データベースのビーコンテーブルのレコードに記録(×で表示)し、ユーザにビーコンが消失したことを通知します。

ビーコンの選択

まず肝心要のビーコンを調達しなければなりません。本モデルでは個々の商品にビーコンを取り付けるので、多数のビーコンを使用することが想定されます。よって、ビーコンの信頼性、保守性、価格、プロダクトライフサイクルが重要になります。また、ビーコンの保守(UUID、Major、Minor、Measured  Power 、出力等の設定・更新)を行うには、多くの場合、ベンダ独自のクラウドサービスを利用することになるので、企業・組織によってはベンダーロックインを懸念し、面倒でも複数ベンダーのビーコン運用を要件とするかも知れません。

ビーコンメーカーとビーコン製品の選択

日本のビーコンベンダーでは、Aplix社アクセス社が有名なようです。Aplix社が料金やマニュアル等の情報を公開しているのに対し、アクセス社はユーザ登録を行わないと詳しい情報が得られないようです。今回は情報がオープンなところを良しとし、Aplix社の製品・MyBeacon® 汎用型 MB004Ac-DR1 (下写真の黒いビーコン)を調達しました。

 一社だけではなく異なるベンダーの製品もチェックすべきと考え、海外のメーカー1社からもビーコンを調達することにしました。海外では Estimote社が有名なので当初はここを第一候補としたのですが、2017年7月に問い合わせたところでは「現行製品には技適マークを取得したものはなく、8月に1製品で技適マークを取得する予定」とのことでした。この世界最大手のビーコンメーカーは米国等他の市場に手一杯で日本市場には手が回らない様子のため、今回はEstimote を見送ることにしました。

 次に候補に挙がったのが Onyx社で、ここは世界第4位のビーコンメーカーとどこかに書いてありました。同社の各製品は技適マークを取得しているところが高ポイントで、営業担当のビアンカさんの応答もとっても早かったです。ということでOnyx社から技適取得の製品 Beacon One (写真の白く小さな円形ビーコン)とEnterprise Beacon (白く大きな円形ビーコン)を3つ調達。2メーカー、3製品の計21個のビーコンでプロトタイプ(後述)によるテストを行うことにしました。

写真左の青いタグ型ビーコンは Gimbal社製 Gimbal Proximity Beacon Series 10
残念ながら今回のテストには間に合わず 

ビーコンの保守・管理

ビーコンの導入時や故障時には、その UUID、Major、Minor 等を設定・変更する必要があります。多くのビーコンベンダーは、ビーコンのクラウドサービスにアクセスさせ、購入したビーコン情報を登録・更新させた後、メーカー独自のビーコンアプリケーションをインストールしたiOS/Android端末をビーコンに近づけて、その端末からビーコンの情報(UUID、Major、Minor、Measued Power、出力等)を登録・更新させます。下図は Aplix社のビーコン管理クラウドサービスの画面で、この画面でビーコンの各種情報を更新します。

【Aplix社のビーコン情報管理用クラウドサービスの画面】
Aplix のビーコン CMS 画面
AplixのサービスはビーコンのCSVデータを取込/書出できる為、多量のビーコンを管理し易い


 Aplix社のケースでは上記で登録した情報に iOS/Android 端末上の MyBeaconTool でアクセスし、同端末をビーコンに近接させた上でビーコン情報の更新を行うことができます。



【iPad 上のAplix MyBeaconToolの画面】
Aplix MyBeaconTool
MyBeaconTool がクラウド上のデータを基にビーコンへの書き込みを行う。

ビーコンの性能・安定性

本モデルに限らずビーコンを使用したシステムでは、当然ながらビーコンが安定して動作することが重要です。下表は小社で開発したビーコン監視システムのプロトタイプ(以下、プロトタイプ、詳細は後述)を使用して、21個のビーコンを約60時間、監視テストした結果です。「Distance」はビーコンと端末の間の距離です。テスト中、ビーコンは移動していないので、本来であれば端末は常にすべてのビーコンを検知した状態でなければなりません。Aplixの10個のビーコンについては、60時間で端末が非検知と認識したのは1個体の1回のみで、高い安定性を示しましたが、Onyxは非検知が多く発生し、各個体で性能にバラつきがありました。
 尚、今回のテストにあたっては、各ビーコンの出力は初期値のまま使用しています。

Result of beacons heart-beats monitoring using iPad and FileMaker Go
Distance
Aplix MB004
Onyx One
Onyx Ent.*1
  M/M*2 Results M/M Results M/M Results
 0.1m 1/6 OK        
1m 0/2 OK        
2m 0/3 OK 39/20112 OK 1/7319 OK
0/4 OK 39/20168 OK    
5m 0/5 OK-1 39/20841 OK 1/7320 NG-288
1/1 OK 39/20862 NG-222    
9m 1/2 OK 39/21289 OK 1/7321 OK-4
1/3 OK 39/21351 OK    
9m  w/obst.*3 1/4 OK 39/21903 NG-14    
1/5 OK 39/21920 OK-1    
Total 10   8   3  
*1 Onyx Beacon Enterprise
*2 Major/Minor
*3 Beacons with obstacles placed nearby are 9 m away from device
*4 OK without number indicates  "Always detected by device"(signal never lost during test), Numbers beside OK/NG indicate the number of times beacons lost.


プロトタイプについて

今回、上表のテスト実施時に使用した FileMaker 16 によるプロトタイプの開発・テスト環境と仕様は以下の通りです。

■開発・運用環境
使用端末 iPad/iOS10.3.3
運用ソフト FileMaker Go 16
開発用ソフト FileMaker Pro Advanced 16
サーバソフト FileMaker Server 16
ベースソフト FMEasy在庫 IWP/WD R1.5」をベースにカスタマイズ
■仕様
UUID関連(下図) ・UUID/Major/Minor(テーブル、以下UMM) は階層構造とする
・UMMテーブルは商品テーブルとは分離する
監視(下図) ・RangeBeacon関数により指定されたUUID(複数指定可)を発信するビーコンを繰り返しスキャン
・設定した閾値を超えてビーコンが連続して非検知の場合、当該ビーコンのレコードに記録する(例えば、閾値を3とした場合、端末が3回連続してビーコンを検知しない場合、レコードに「×」と書き込む)


【UUID管理画面】0
FMEasy在庫の UUID 管理画面カスタマイズ例
上図の[監視]をチェックすると端末の監視対象となる

ビーコンの存否の監視は、天井などに固定されたiPad(端末)で行います。端末が3回連続してビーコンの検知をしないとそのビーコンは存在しないものと認識して、[存否]フィールドに「×」を書き込みます。
注:
閾値を1にして、1度でも非検知が発生したら即刻レコードに「×」を入力することも可能ですが、人、台車、移動中の物品に電波を遮られることを想定し、3に設定しています。

【iPad のビーコン監視画面】
FMEasy在庫のビーコン常時監視カスタマイズ例
監視端末 = iPad の画面。「×」は非検知ビーコン。複数のUUIDを持つビーコンを監視できる。

 

プロトタイプによる事前テストについて

 ビーコン導入のプロジェクト、特に多数のビーコンの導入を伴うようなプロジェクトでは、プロジェクトの初期段階でプロトタイプを用いたテストを実施すべきと思います。プロトタイプによりユーザの要求仕様の実現に目途をつけると共に、ビーコンの総数や、端末がビーコンの信号を安定して受信するためには端末をいくつ用意し、どのように配置するかという計画もこの段階で立てるようにします(じゃないと、概算費用も見積もれませんよね?)。

 上表の監視テストは、当方の事務所内で、なるべく障害物を置かない状態(上表の*3を除く)で、実施しています。ただ、表のテストとは別時間にほぼ同環境で実施したテストでは、端末から9mは離れたAplix社のビーコンが検知されないことがありました。Aplix社のサイトでは、端末がビーコン信号を受信できる距離について、「非常に大まかな目安」として「端末を手に持った状態で50~100m程度、鞄やポケットの中にある場合は30m前後」と述べる一方、「展示会などの人混みの多い場所では低い位置に設置したBeaconが人の列に阻まれ5mの地点でも受信できないケース」もあるとしています。また同サイトは受信の可否について以下が影響を与えるとしています。

    1.Beaconの送信出力、アンテナのゲイン、放射パターン
    2.受信側スマートフォンの感度、アンテナの向き等
    3.スマートフォンOS内の処理(Bluetoothスタックの振る舞い他)
    4.周囲環境(建材、人体等)による反射・吸収・回折

 倉庫などでは、多段のラックに商品を配置し、ビーコン信号がラックや他の商品に遮断されてしまうことも考えられます。
 プロトタイプによる事前テストでビーコンと端末の配置計画を作成します。実運用開始後もビーコンの非検知が多発するようであれば、非検知のエリアに端末を増設できるようにシステムを構築し、運用を工夫する(例:端末を増設した場合、その端末に担当させる商品群の Major は別の Major に変更する)ことも重要でしょう。

端末のスキャン速度

 本プロトタイプでは、端末が常時あるいは一定の間隔で対象とするビーコンをスキャンするのですが、その時に使用する FileMaker の関数が RangeBeacons という関数で、この関数にはスキャンするビーコンの UUID(Major/Minorも追加指定可)とタイムアウト(スキャンする時間)を引数として指定します。

 今回のテストでは21個のビーコンに3種類のUUIDを設定しました。RangeBeaconsを実行するには最低限 UUID を指定しなければならないため、21個のビーコンをスキャンするには異なる3つのUUIDを指定し、RangeBeaconsを3回実行する必要があります。また、タイムアウトをあまり短く設定するとスキャン漏れが発生するため、5(秒)に設定しています。つまり、21個のビーコンを1回スキャンするために3回RangeBeaconsを実行するので、それだけで15秒を要することになります。

 端末が担当する全ビーコンの1回あたりのスキャンをできるだけ短くするには、ビーコンの UUID または UUIDとMajorを合わせた値を1つに限定し、1回のビーコンスキャンで実行する RangeBeacons の回数を1回にします。

 【プロトタイプのビーコン監視タブの下部に表示されるスキャン情報】
iBeacon スキャン結果
RangeBeacons3回で15秒だがその他の処理もあるため、実際は22.2秒(平均)を要した。

監視端末と課題

本モデルにおいて、ビーコンと同様またはそれ以上に重要な要素は、監視端末です。ビーコンが安定していても、それを検知する端末が不安定ではシステムは機能しません。

 また、ビーコンを配置するエリアが広いと、端末数も普通は多くなります。野球のグラウンドのような一辺が100メートル、1万平米の倉庫にある商品にビーコンを取り付けるケースで、10m×10mの区画に分けて端末を配置するには100台の端末が、5m×5mの区画に分けて端末を配置するには400台の端末が必要になります。iPad が1台3.5万円、FileMaker Go ライセンスが1万円/年とすると端末1台に必要な初期導入費用は4.5万円、これだけで高額なシステムとなってしまいます。そもそもこのモデルで使用する端末はビーコンを監視し、その結果をデータベースに書き込むという単純なものなので、多数の端末を導入するケースでは、 iPad や FileMaker Go に代わるソルーションが求められます。

端末で考慮すべきこと

ここでは主に端末の価格について書きましたが、多数の端末を管理・運用する場合、小社が端末に求める要件は以下の通りです。
  1. 廉価性 ― 1台、数千円程度
  2. 遠隔操作により本体の起動、再起動、その他の管理ができること
  3. 遠隔操作によりビーコン監視ソフトを起動、再起動、管理できること
  4. 遠隔一括管理 ― 上記2と3の起動、再起動などを遠隔から全端末に対して一斉に実行できること
  5. 高信頼性 ― 24時間/365日稼働すること
  6. 端末の死活(ハートビート)監視 ― 端末故障時にユーザに通知する機能

次回は iPad/FileMaker Go を使用しない端末ソルーションについて考えてみます。


(土屋)

参考サイト
http://business.aplix.co.jp/beacon/beacon_faq.html


IoT/M2M関連リンク

2017-06-27

FileMaker データベース認証に oAuth を利用する

 FileMaker 16 の新機能を使用して弊社在庫管理システムテンプレート『FMEasy在庫』の機能を拡張するというテーマで、前回までに WebDirect を使用した宅配便送状の印刷と、AfterShipから配送データを取得してアプリ内で荷物追跡情報を表示する方法をご紹介してまいりました。今回はその締めくくりとして、oAuth による FileMaker データベース(以下、FileMaker DB)へのログインについてご説明します。

 一回目:FileMaker と WebDirect 16 で宅配便送状を印刷し、配送状況を追跡する
 二回目:cURL と REST API を使用し、FileMaker アプリ内で配送状況を追跡

oAuth 認証で FileMaker にログインし、出庫画面から送状発行と追跡をする
出庫画面から運送業者の送状を発行し、配送状況を追跡するまでの流れ

 oAuth は一連のデータベース操作の窓口を担う認証機能になりますが、FileMaker DB にパスワードを記憶させないという利点があります。

オープン認証 (oAuth) をざっと説明

 oAuth を簡単に説明すると、外部の Web サービスに登録されているユーザ情報を使うことによって、アプリケーションに代理ログインできるしくみです。Google アカウントや Microsoft アカウントなどを使って外部サービスにログインされた方もいらっしゃると思います。

 FileMaker 16 が oAuth 対応になり、通常の FileMaker アカウントの代わりに Google、Microsoft Azure Active Directory、および Amazon アカウントを使って FileMaker データベース(以下、FileMaker DB)にログインできるようになりました。


oAuth 経由で FileMaker にログインするための事前準備

 oAuth で FileMaker DB にログインするためには、以下のものをそろえる必要があります。

  1. FileMaker Server 16 と必要数分のアクセスライセンス
  2. 有効なドメインのサーバ証明書
  3. クライアント ID、シークレット、テナント ID (Asure の場合)
  4. oAuth 用ログインユーザアカウント

FileMaker で oAuth を有効にする方法

 oAuth 経由で FileMaker にログインするための具体的な手順を以下に示します。
ここでは、Google アカウントを例に進めていくことにします。

 作業の手順は FileMaker 公式にまとめられていますので、以下もご参照ください。
 オープン認証 (OAuth) 資格情報を使用したソリューションへのアクセス

  1. FileMaker Server にサーバ証明書をインポートします。
    FileMaker Server Admin Console にログインし、データベースサーバ→セキュリティの順にすすみ、「データベース接続に SSL を使用する」にチェックをつけて“証明書のインポート...” ボタンをクリックします。

    カスタムサーバ証明書をインストールする
    SSL を有効にし、証明書のインポートを選択する


     証明書のインポートダイアログが表示されますので、署名入りの証明書ファイル、プライベートキーファイル、中間証明書ファイルを指定してインポートします。

    カスタム証明書インストール用ダイアログ
    カスタム証明書インポートのダイアログ
  2. FileMaker Server を再起動します。
  3. http://console.developers.google.com/ にログインします。
  4. 認証情報→認証情報を作成の順にすすみ、「oAuth クライアント ID」 を選択します。

    oAuth クライアント ID を登録
  5. oAuth 同意画面を選択し、メールアドレスとサービス名を入力して保存します。
    oAuth 同意画面を登録
    oAuth 同意画面を登録
  6.  アプリケーションの種類の選択ページでは、「ウェブアプリケーション」を選択し、任意の名前を指定してから、リダイレクト先を指定します。

    oAuth のリダイレクトリンク先を登録
    oAuth 認証をウェブアプリケーションにし、そのリダイレクト先を指定する

    リダイレクト先は https://ドメイン名/oauth/redirect になるように指定します。
  7. 無事 oAuth クライアント ID が作成されると、以下のようなダイアログが表示されますので、クライアント ID とクライアントシークレットをメモしておいてください。

    oAuth クライアント ID とクライアントシークレットをメモする
    oAuth クライアントのクライアント ID とクライアントシークレットを取得する
  8. 再び FileMaker Server Admin Console にログインします。データベースサーバ→セキュリティの順にすすみ、クライアント認証を 「FileMaker と外部サーバーアカウント」に変更して設定を保存します。
    クライアント認証を「FileMaker と外部サーバアカウント」に変更
    クライアント認証を「FileMakerと外部サーバーアカウント」に変更する
  9. 外部サーバーアカウントとして Google の歯車アイコンをクリックすると、Google の設定ダイアログが表示されますので、手順 7. でメモしておいた Google クライアント ID と Google クライアントシークレットを入力し、“保存”ボタンをクリックします。
    Google クライアント ID とシークレットを入力する
    Google クライアント ID と Google クライアントシークレットを入力
  10. FileMaker Server を再起動し、手順 11. の Google アカウントのスライダーを有効にします。

 これで FileMaker Server で oAuth が使えるようになりました。

補足事項:
  • サーバ証明書をインポートした直後は、FileMaker Server を再起動しても FileMaker Server が証明書を認識しない場合があります。その場合は、いったんサーバ機を再起動すると認識されることがあります。
  • サーバ証明書のインポートに失敗した場合は、FileMaker Server のディレクトリでコンソールウィンドウを開き、fmsadmin certificate delete コマンドを実行すると、カスタム証明書を削除することができます。削除後はいったん FileMaker Server を再起動してから、証明書のインポートをやりなおしてみてください。


FileMaker データベースファイルへのユーザアカウントの登録

 FileMaker Server 側の oAuth 認証受付の準備が終わったら、データベースファイルにログインユーザアカウントを登録します。

  1. FileMaker Pro から管理者権限でデータベースファイルを開き、FileMaker のメニューより「管理」→「セキュリティ」の順に進みます。
  2. アカウントの一覧が表示されますので、認証方法を「Google」にし、そして「ユーザ名」にはGoogleにログインするためのメールアドレスをフルで指定します。

    oAuth ログイン用アカウントを FileMaker DB に登録する
    アカウント管理画面に oAuth ログイン用のユーザアカウントを登録する
  3. 同じ要領で、クライアント数分のアカウントを登録します。
補足事項:
  • 分離モデルを採用している FileMaker データベースシステムの場合は、関連するすべてのファイルに oAuth 用のアカウントを登録する必要があります。


oAuth による FileMaker データベースのログイン

 oAuth による FileMaker ログインの設定が終わったら、実際にログインして動作を確認します。

FileMaker Pro16 によるログイン

 FileMaker Server 16 で公開されているデータベースファイルに FileMaker Pro 16 クライアントからアクセスすると、以下のようなダイアログが表示されます。

oAuth 対応の FileMaker Pro 16 ログインダイアログ
oAuth 対応のFileMaker Pro 16 ログイン画面
ここで、Google ボタンをクリックすると、以下のようなアカウント選択ページが表示されますので、適切なアカウントを選択し、パスワードを入力してログインします。

FileMaker DB にログインする Google アカウントを選択
ログインする Google アカウントを選択
上図は、Web ブラウザに Google アカウントが記録されている場合のページですが、Web ブラウザにアカウントが記録されていなければ Google ログイン用のメールアドレスを入力するよう促されますので、正しいメールアドレスを入力します。

 Google アカウントのログインに成功すると、以下のようなダイアログが表示されますので、“許可”をクリックします。

ブラウザから表示される FileMaker プログラムの実行許可を求めるダイアログ
プログラムの実行許可

 すると FileMakerアプリの画面に戻ります。後の操作は FileMaker のユーザ権限にしたがって通常通りに行えます。

oAuth による FileMaker ログイン直後の Main Menu 画面(FileMaker)
oAuth によるFileMaker ログイン直後の FMEasy在庫 Main Menu 画面

WebDirect によるログイン

 WebDirect 用の公開リンクにアクセスし、開きたいデータベースファイルをクリックすると、以下のようなログインページが表示されます。

oAuth 対応 WebDirect サインインページ
WebDirect 用の oAuth 対応サインインページ


 ここで、Google ボタンをクリックすると、以下のようなアカウント選択ページが表示されますので、適切なアカウントを選択し、パスワードを入力してログインします。

WebDirect にログインする Google アカウントを選択
ログインする Google アカウントを選択

 
 Google アカウントのログインに成功すると、WebDirect で FileMaker DBが開きます。


oAuth による FileMaker ログイン直後の Main Menu 画面(WebDirect)
oAuth による WebDirect ログイン直後の FMEasy在庫 Main Menu 画面

懸案事項

 oAuth は事前設定さえ済ませてしまえば、あとはログインを許可するアカウントを FileMaker DBに登録するだけで使えるようになりますが、運用にあたっては以下のような問題が発生する可能性がありますので、ご留意ください。
  1. ログインに成功すると、FileMaker を終了しても、oAuth で管理される外部 Web サービスのセッションが残る
    これは他の Web サービスのセッション管理機能に依存しますが、Google の場合 FileMaker を終了させても、二回目以降に FileMaker DB にログインしようとすると、パスワードの入力を求めてこず、そのままログインできてしまいます。
  2. Web ブラウザにログインパスワードが保存されていると、第三者に勝手にログインされる恐れがある
    個人の専用パソコンからのアクセスなら、パスワード入力の手間が省けて便利ですが、複数のユーザで一つのパソコンを共有利用している場合は、勝手にログインされてしまう可能性があります。
 各自パスワード管理をしっかりやってね、で解決すればよいのですが、手軽さゆえ思わぬトラブルにつながりそうな機能なので、oAuth ログインを許可するアカウントのユーザ権限は入力・照会レベルにとどめるような工夫は最低限必要かと思います。


 oAuth の危険性を指摘する記事もネットで見つかりますので、日ごろから目を通しておくとよいですね。


 参考記事:第147回 便利と危険は裏返し 〜 知っておきたい、OAuthの仕組み 〜 (TDK Techno Magazine)




 土屋企画では FileMaker システムの受託開発およびコンサルティングを請けたまわっております。お問い合わせはこちらよりお願い致します。

 その他の在庫関連記事を読む

(亀)




2017-06-26

cURL と REST API を使用し、FileMaker アプリ内で配送状況を追跡

 前回は在庫管理テンプレート『FMEasy在庫』をカスタマイズし、宅配便の送状を印刷・登録するところまでをご説明しました。

 前回の記事: FileMaker と WebDirect 16 で宅配便送状を印刷し、配送状況を追跡する
 参考:FMEasy在庫 IWP/WD R1.5


AfterShip による配送状況の追跡
出庫画面から運送業者の送状を発行し、配送状況を追跡するまでの流れ


 本稿では、出荷後の配送状況の追跡機能を実装する方法(上図の7.と8.)について説明していきます。
 機能の実装に入るまえに、FileMaker から出荷物の配送状況を取得するしくみについて触れます。

世界402社と日本3社の配送業者の追跡データAPIを提供する AfterShip

  FileMaker 単体では宅配便の配送状況の情報を取得することはできません。このため、各宅配業者が提供する追跡サービスを使用することになります。

 これまでは、データ受信の窓口となる API サービスを利用するためには宅配業者別に手続きが必要になり、API 接続手順の把握とシステムへの追跡機能の実装までに大変な手間と時間がかかってしまったのですが、AfterShip という荷物追跡サービスは世界 402 社の配送業者の追跡データ API を提供しており、その中に日本のヤマト運輸、佐川急便、日本郵便の 3 社も含まれています。

 AfterShip が対応している日本の宅配便会社(Japan を選択)

 つまり、AfterShip の API を利用すれば、これら 3 社の配送状況の追跡をまとめて処理でき、FileMaker の送状発行機能と連携させることによって、送状の印刷から荷物追跡までがトータルに行えるようになります。

AfterShip の利用料金について


 2017年6月26日現在、AfterShip は 1月あたり 100 個までの出荷物の追跡が無料となっています(Basic プラン)。
 100 個を超える荷物を追跡するには、その個数に応じた料金が適用される Premium プラン、10万個を超える場合は個別対応の Enterprise プランという料金が適用されます。

 価格プランはこちらを参照してください。
 https://www.aftership.com/pricing

 たとえば、一月あたり 10,000 個なら $173/月、50,000 個なら $573/月となりますので、出荷量に応じた追跡計画を立てることができます。


7. AfterShip に配送状況を問い合わせる


 AfterShip の API サービスを利用するまえに、AfterShip へのユーザ登録が必要になります。

 AfterShip ユーザ登録・ログインページ
 https://secure.aftership.com/signup/

 google アカウントをお持ちの方は、google アカウントでログインするだけで自動的に AfterShip に登録されます。

 FileMaker から AfterShip API を利用できるようにするには、さらに API Key の取得と配送業者の登録が必要になります。

  1. AfterShip API Key を取得する

    AfterShip へのユーザ登録が終わったら、設定ページから API の順に進み、API Key を取得します。 
     通常は登録完了時に自動的にデフォルトの API Key が付与されますのでそれを使えばよいですが、必要に応じて Key を追加生成することもできます。

    AfterShip API key の取得

  2. 追跡対象の配送業者(couriers)を登録する

    出荷物の追跡を行いたい配送業者を登録します。設定ページから couriers の順に進み、inactive 入力ボックスに japan と入力すると、日本の配送業者が表示されますので、その中から必要な業者を選びます。

     以下の図は、ヤマト運輸の選択まで終わったところです。

    配送業者(couriers)の登録ページでヤマト運輸の登録が終わったところ


 それでは、いよいよ FileMaker からAfterShip を呼び出すための設定をします。
 AfterShip API は REST 形式になっており、配送状況の追跡を行うためには基本的に以下の情報が必要となります。
  • AfterShip API への URI(https://api.aftership.com/v4/
  • 配送会社識別コード(slug)
  • 送状番号(tracking_number)
 配送会社識別コードと送り状番号は FileMaker のユーザインタフェースから登録できるようにしておき、AfterShip API からの応答データを登録するためのフィールド群も用意します。

 下図の赤で囲んだ部分をご覧ください。ポータルの 2 段目が AfterShip から取得する追跡データを保存するためのフィールド群です。荷物(送状)の追跡を行う場合は、当然[送状No]も必要になります。


 AfterShip API の公式ドキュメントはこちらです。

 AfterShip API Documentation
 https://www.aftership.com/docs/api/4/overview

 それでは、このドキュメントに従って、FileMaker から AfterShip API に接続してみましょう。

 AfterShip への送状番号の登録


 AfterShip 経由で荷物の配送状況を追跡するには、先に送状番号を AfterShip に登録しておく必要があります。

 登録用の URI は https://api.aftership.com/v4/trackings/ になります。
 この URI に送状情報を POST メソッドで送信すれば、AfterShip に登録されます。

 php で記述した場合、たとえばこのようになります。

PHP

<?php

    //build header 
    $header = array( 

        'Content-Type: application/json',
        'aftership-api-key: cfa68bc1-5b9b-4ba2-b3c8-XXXXXXXXXX'

    ); 


    //build invoice data
    $data = Array(
        'tracking' => Array(
            'slug' => 'taqbin-jp',
                'tracking_number' => '44361185XXXX',
                'title' => 'YAMATO POST TEST'
        )
    );  

 
    //post data using curl
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL, 'https://api.aftership.com/v4/trackings' );
    curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, 'POST' );
    curl_setopt( $curl, CURLOPT_HTTPHEADER, $header ); 
    curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode( $data ));
    curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, true );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
    $result = curl_exec( $curl );
    $json = json_decode( $result );
    curl_close( $curl ); 

?> 

 $header の中に json データ送信を宣言し、 aftership-api-key を指定します。
 $data の中に指定している slug がヤマト運輸を示す taqbin-jp、 tracking_number が送状番号、title が AfterShip の中で送状の識別を用意にする任意のタイトルになります。
 送信結果は最終的に $json 変数に格納されます。

 これを FileMaker の 「URL から挿入」ステップで記述すると、たとえばこのようになります。

FileMaker

変数を設定 [ $data; 値:
JSONSetElement ( "" ; 
        [ "tracking.tracking_number" ; "44361185XXXX" ; JSONString ];
        [ "tracking.slug" ; "taqbin-jp" ; JSONString ]; 
        [ "tracking.title" ; "YAMATO POST TEST" ; JSONString ] 
    )
 ]
URL から挿入 [ $json; "https://api.aftership.com/v4/trackings"; 
    cURL オプション: "-H \"Content-type: application/json\" " & 
        "-H \"aftership-api-key: cfa68bc1-5b9b-4ba2-b3c8-XXXXXXXXXXX\" " & 
        "-d " & $data ] 
    [ ダイアログなし; SSL 証明書の検証 ]


 php に比べると指定方法に多少コツがいりますが、かなりシンプルになりますね。

 $data の中に送状情報を組み立てておき、これを「URL から挿入」ステップの cURL オプションの -d オプションの中に指定することによって送信します。

 cURL オプション:
 "-H \"Content-type: application/json\" --- ヘッダオプション。json 形式のデータ送信を宣言
 "-H \"aftership-api-key: cfa68bc1-5b9b-4ba2-b3c8-XXXXXXXXXXX\" --- ヘッダオプション。aftership-api-key を指定
 "-d " & $data --- データオプション。$data に格納されているデータを送信

 送信結果は $json 変数に格納されますので、その中から必要項目を取り出せばよいことになります。

AfterShip API から戻される結果

 AfterShip API の戻り値は json 形式になります。前述の例では $json 変数に戻ってくるので、これを解析して利用します。
 データは一行で返りますので、これを FileMaker Pro 16 の JSONFormatElements 関数を通すと見やすいフォーマットに整形されますので、戻りデータを確認する際に有用です。

 JSONFormatElements( $json ) の結果はたとば以下のようになります。

JSON

{
 "data" : 
 {
  "tracking" : 
  {
   "active" : true,
   "android" : [],
   "checkpoints" : [],
   "created_at" : "2017-06-24T13:08:42+00:00",
   "custom_fields" : null,
   "customer_name" : null,
   "delivery_time" : 0,
   "destination_country_iso3" : null,
   "emails" : [],
   "expected_delivery" : null,
   "id" : "594e645ab6ee5fcf0b7XXXXX",
   "ios" : [],
   "last_updated_at" : "2017-06-24T13:08:42+00:00",
   "note" : null,
   "order_id" : null,
   "order_id_path" : null,
   "origin_country_iso3" : null,
   "shipment_delivery_date" : null,
   "shipment_package_count" : 0,
   "shipment_pickup_date" : null,
   "shipment_type" : null,
   "shipment_weight" : null,
   "shipment_weight_unit" : null,
   "signed_by" : null,
   "slug" : "taqbin-jp",
   "smses" : [],
   "source" : "api",
   "tag" : "Pending",
   "title" : "YAMATO POST TEST",
   "tracked_count" : 0,
   "tracking_account_number" : null,
   "tracking_destination_country" : null,
   "tracking_key" : null,
   "tracking_number" : "44361185XXXX",
   "tracking_postal_code" : null,
   "tracking_ship_date" : null,
   "unique_token" : "deprecated",
   "updated_at" : "2017-06-24T13:08:42+00:00"
  }
 },
 "meta" : 
 {
  "code" : 201
 }
}


 ここで、"meta" :{"code" : 201} が登録成功を示すシステムコードです。このコードが返れば AfterShip のブラウザ管理画面の追跡リスト上にこの送状データが表示されるようになります。
 また、このコードを拾って FileMaker テーブルのフィールド(下図の[ステータスコード])に登録したい場合は、以下のように関数を指定します。

 JSONGetElement ( $json ; "meta.code" )

 同じ要領でタイトルを下図の[aftershipタイトル]に登録する場合は、関数を以下のように指定します。

 JSONGetElement ( $json ; "tracking.title" )

 AfterShip への登録日時を下図の[ステータス]に登録するには、JSONGetElement ( $json ; "date.tracking.created_at" )と指定します。

AfterShip に送状情報を登録した直後の様子

 “登録”ボタンにより AfterShip に送状を登録した後に、ブラウザでAfterShipの送状管理画面を見ると、下図のようになっています。

AfterShip に登録された送状の一覧

8. 配送状況の問い合わせ結果を FileMaker に登録する

 AfterShip に配送状況を照会する


 AfterShip に荷物を登録後、配送状況を追跡するための URI は https://api.aftership.com/v4/trackings/配送業者コード(slug)/送状番号(tracking_number) になります。
 この URI に???送状情報を GET メソッドで送信すれば、AfterShip から配送状況が JSON 形式のデータで戻されます。

 AfterShip への配送状況の問い合わせを FileMaker の 「URL から挿入」ステップで記述すると、たとえばこのようになります。

FileMaker

URL から挿入 [ $json; "https://api.aftership.com/v4/trackings/" & 
    "taqbin-jp" & "/" & 
    "44361185XXXX"; 
cURL オプション: "-H \"Content-Type : application/json\" " & 
    "-H \"aftership-api-key: cfa68bc1-5b9b-4ba2-b3c8-XXXXXXXXXXX\" & "\" " ] 
[ ダイアログなし; SSL 証明書の検証 ]


 登録のときより照会の方が単純ですね。
 これによって $json 変数に配送状況の照会データが戻ります。
 照会に成功すると、 "meta" :{"code" : 200} が返ります。
 オプション解説、およびデータの読み出し方法の基本については、前述の登録方法の項をご覧ください。


 なお、最終の配送状況のみを戻したい場合は、 URI を https://api.aftership.com/v4/last_checkpoint/配送業者コード(slug)/送状番号(tracking_number)  にすればよいです。


 下図は各送状の“照会”ボタンを実行し、[ステータス](一般ユーザ向けに配送状況を表示)と[ステータスコード](システム管理者向けにシステムコードを表示)の更新が完了したときの画面です。

送状情報を AfterShip に問い合わせたときの様子

  上図では最終ステータスのみを記録するように作成していますが、機会があれば[追跡履歴]の取り出し方も説明できればと思います。


外部サービスを使うデメリットについて

 FileMaker 単体でできないことは外部サービスの力を借りることになりますが、導入時は魅力的に見えたサービスであっても、継続運用していくうちに様々な問題に直面することがあります。
そこで最後に外部サービスを利用する際の注意点をいくつか挙げておきます。
 
  1. バージョンアップに伴い、従来の呼び出し方法では動作しなくなる
    FileMaker と外部サービスとの連携が取れなくなる恐れがあります。
    外部サービスを導入する場合は、こまめなチューニングも考慮する必要があります。
  2. 無料サービスが有料化される
    そのサービスなしでは業務が回らない場合に、予期せぬコスト増大を招く恐れがあります。
  3. 良心的に見えた料金が値上がりする
    サービス提供側が料金を値上げするのはよくあることです。その場合、上記と同様にコスト増大が発生します。
  4. 社外秘のデータが外部に把握される
    サービスの内容にもよりますが、たとえばアンケート収集・解析サービスや、SNSサービス、翻訳サービスなど、社内用のデータを外部サービスと連携させて利用する必要がある場合、機密情報を外部サービスに流さないように注意を払うことはもちろんのこと、サービス提供会社の安全性やセキュリティ対策なども調査する必要があります。
  5. 終了する
    有料、無料にかかわらず、サービス提供側の事情でサービスが終了すると、そのサービスがシステムにとって重要なポジションを占める場合には、代替サービスの選定やシステム修正等の手間が増えることになります。


  FileMaker 16 の機能追加によって、外部 Web サービスとの親和性が向上しましたが、本格的にサービスを導入をするには、上記のような問題を視野に入れたうえでプロジェクトを設ける必要がありますので、発注側、受注側双方の理解が重要かと思います。


(亀)



 土屋企画では FileMaker システムの受託開発およびコンサルティングを請けたまわっております。お問い合わせはこちらよりお願い致します。



 

FileMaker と WebDirect 16 で宅配便送状を印刷し、配送状況を追跡する

 FileMaker 16 では cURL、JSON、oAuth などの Web 関連機能が多数搭載されました。これらを使用すると、ネット時代に適応した多様なソリューション開発ができそうです。

 そこで本稿では、弊社在庫管理テンプレート『FMEasy在庫』を使い、出庫画面に宅配便の送状発行機能と、出荷後に荷物を追跡する機能を追加する方法を考えてみます。


 参考:FMEasy在庫 IWP/WD R1.5


注:
 本稿は『FMEasy在庫』のユーザでない方でも、宅配送状の設計やWebDirect 16 によるPDF出力の方法、cURL/JSONを使用した荷物追跡機能の実装に関しては参考にはなるかと思います。


 処理の流れはざっと下図のようになります。本稿では2.~6.について説明致します。


出庫画面から運送業者の送状を発行し、配送状況を追跡するまでの流れ

1. oAuth による認証

 上図の冒頭部分のoAuth による認証については、別稿にてご案内したいと思います。

2. 出庫登録をする

 出庫登録は『FMEasy在庫』テンプレートにあらかじめ搭載されている機能のため、ここでは説明を省略します。
 『FMEasy在庫』は基本機能は無償でご使用いただけますので、出庫機能をお試しになりたい方はこちらからダウンロードしてください。

3.送状を登録する

 出庫(売上)伝票の作成後に物品を発送するための宅配便送状を登録するためのインタフェースを用意します。

 まず送状データを管理するための送状テーブルを新設し、リレーションシップ画面で出庫テーブルと送状テーブルをリレートします。詳細は省略しますが、1件の出庫データについて複数の宅配便送状を登録するように設計すると、複数個口に対応できるようになります。
 既存の出庫レイアウトにタブオブジェクトを配置し、出庫タブに出庫明細関連フィールド、送状タブに送状関連フィールドを配置します(下図参照)。

1出庫伝票に対して複数の宅配便送状を登録できるように設計しましょう 

 ポータルの上段には宅配送状とその印刷に必要なフィールドが、下段には荷物追跡に必要なフィールドが配置してあります。送状テーブルの設計時に参考にしてください。
 下段の荷物追跡関連フィールドには、外部 Web サービス(AfterShip)に配送状況を問い合わせ、その結果を自動入力します。この追跡機能については、別稿にて詳細を説明します。

 『FMEasy 在庫』をご利用のお客様へ 


 『FMEasy 在庫』を FileMaker 16 の WebDirect で開くと、下図のようにボタンの欠けが発生することがあります。

『FMEasy 在庫』の出庫画面を WebDirect 16 で表示すると一部のボタンが欠ける

 これは FileMaker WebDirect の上位互換性によって生じる問題のため、お客様の方でFileMaker Pro 16 を使ってボタン幅を調整してください。
 

4.WebDirect から PDF 出力できるようにする

 宅配便の送状フォーマットに準じたレイアウトを用意してておき、“印刷”ボタンをクリックして送状を出力します。 複数の宅配便や代引等に対応するとき場合は、その分だけレイアウトを用意し、スクリプト実行時に適切なレイアウトを選択します。
 FileMaker 16 の WebDirect は PDF 出力対応になりましたので、ここでは送状の“印刷”ボタン実行時に送状を PDF 出力するようにスクリプトを組んでみます。

 FileMakerクライアント情報は Get ( アプリケーションバージョン ) 関数を使うことによって取得できます。
 クライアントが WebDirect の場合は、Web Publishing Engine を含む文字列が返ります。WebDirect からのアクセス時に「レコードを PDF として保存」ステップを実行するようにします。 下図で赤く囲んだ部分が WebDirect アクセス時の PDF 出力関連部となりますので、参考にしてみてください。

「送状印刷Btn」スクリプト(赤囲み部分が WebDirect 向け PDF 出力ステップ部分)

注:
少し調べてみたのですが、iOS(iPad/iPhone)に対応した水平プリンタは存在しないようです。

5.送状を水平プリンタで印刷する

 前述の「送状印刷Btn」スクリプトでは、FileMaker Pro クライアント使用時には印字データが直接プリンタへ送られますが、WebDirect 使用時には サーバ上で送状のPDFが作成され、そのPDFファイルを開いて印刷することになります。

WebDirect では PDF のダウンロードとPDFの処理方法をユーザが選択する必要があるので、少し面倒

6.送状番号のバーコードを読み取って登録する

 宅配便の送状を印字したら、バーコードリーダーや iPhone などのバーコードスキャン機能を使い、送状に記載されている送状番号のバーコードを「送状タブ」上の[送状No]フィールドに登録できます。バーコードを読み取るか、手入力により[送状No]に登録すると下図のようになります。

送状のバーコードをスキャナで読み取り、[送状No]フィールドに入力したところ


 次回は、出荷後の荷物の追跡を FileMaker で行う方法についてご紹介します。




 ※土屋企画では FileMaker によるシステムの受託開発およびコンサルティング業務を請けたまわっております。業務関連のご質問はこちらよりお寄せ願います。


(亀)

2017-06-14

FileMaker WebDirect 16 のロードバランス

 前回は FileMaker Server 16 の WebDirect (WebDirect 16)の構成をマスタサーバ 1 台構成にした場合と、ワーカマシン 5 台構成にした場合とで、スレッド数(接続数)や Ramp-up(全スレッドを生成するまでの時間)の条件を変更しながらパフォーマンス計測を行いました。 
 本稿では ワーカマシン 5 台構成で WebDirect 16 のロードバランスがどのように機能するのかを見てみます。
【ワーカマシン5台構成のイメージ】

サーバ 5 台構成時 のロードバランス

 複数のワーカマシンで構成される WebDirect 16 は Webクライアント(ブラウザ)からリクエストを受信すると、より負荷の低いマシンにそのリクエストを割り当てます(ロードバランス)。
 下図は異なる 5 台のクライアント PC のブラウザから WebDirect にログインしたところですが、より負荷の低いワーカマシンにリクエストが割り振られていることがわかります。
FileMaker Server 16 Admin Console のステータス画面
 上図のような低負荷の状態では WebDirect のロードバランスが適正に機能していることが確認できます。ちなみに、ワーカマシン 1 は Webサーバ機能の他に、データベースサーバ機能とロードバランスの機能も担うため、他のワーカマシンの負荷が相当程度高くなるまでの間、自身では HTTPリクエストを処理しないようです。
 次に、WebDirect の負荷を増減させるとどうなるのか、Apache JMeter を使ってテストしてみました(下図)。

【表1】
No ワーカ数 スレッド ループ Ramp
(秒)
 
リクエスト/秒 所要時間(秒) 失敗数 1Recの平均作成時間(秒) 備考
1 5 500 1 0.5 1000 46 128 0.092  1回計測
2 5 500 1 2 250 58.5 1.5 0.117  2回計測
3 5 500 1 5 100 60 0 0.120  1回計測
4 5 500 1 7 71.4 49 0 0.098  1回計測
5 5 500 1 30 16.7 48 0 0.096  5回計測
6 5 500 1 40 12.5 48 0 0.096  5回計測
7 5 500 1 60 8.3 60 0 0.120  1回計測
8 5 500 1 90 5.6 92 0 0.184  1回計測

 本テストは 500 スレッド(≒500ユーザ)から 、出庫伝票(出庫ヘッダレコード1と出庫明細レコード1)を作成する FileMaker スクリプトを実行し、最初のリクエスト発行から 500 件目の出庫伝票の作成が完了するまでの[所要時間(秒)]を計測しています。Ramp は 500 スレッドを生成する時間です。
 たとえば、テスト No.1 では 500 のスレッドを 0.5 秒の間に作成し、最後のレコードが作成し終わるまでの[所要時間(秒)]が 46 秒であったことを示しています。[失敗数]は本来 500 件の出庫伝票が作成されるべきところ作成に失敗した件数を示しており、No.1 では 128 件の失敗(伝票未作成)が発生しました。下図は No.1 実行時のワーカ割り振りの状態です。


Ramp が 0.5 では接続がワーカマシン 1 に極端に集中してしまう

 0.5 秒間に 500 スレッドが発生する高負荷状態ではワーカマシン 2 に割り振りが集中し、ロードバランスが適正に機能せず、128件のレコード作成処理が失敗しています。

 次にテスト No.4 ( Ramp:7秒)のロードバランスを見てみましょう(下図)。ワーカマシン 3、5 への割り振りが大分多いですが、ワーカ 2、4 にも 80 程度のスレッドが割り振られています。
 
500 同時接続で Ramp 7 秒 のときのサーバ割り当ての様子

 下図は Ramp を 60 秒にしたときの割り振り状態です。ワーカマシン 2~4 にはほぼ均等にスレッドが割り振られていて、ワーカマシン 1 (マスタ)は若干少なめに割り振られています。

500 同時接続で Ramp 60 秒 のときのサーバ割り当ての様子

  以上のように、WebDirect 16 は短い時間に極端にアクセスが集中すると、ロードバランスが適に機能しない可能性があります。アクセスの間隔が長くなるに従い、HTTP リクエストが各ワーカマシンに均等に割り振られるようになると思われます。

エラーが発生しない適正なリクエスト頻度

 下図は表1 をグラフ化したものです。Ramp が 2 秒迄だとエラーが発生しますが、Rampが 5 秒になると全 500 スレッドがエラー無く終了します。500 スレッド÷ 5 秒で 100 スレッド/秒、つまり1秒間に 100 のリクエストであればエラーが発生しません。
 ただ、所要時間は 60 秒なので、この結果を実運用に適用できると仮定すると、ユーザがリクエストを発行してから 60 秒程度、待たされることになります。Ramp が 60 秒、つまり 1 秒に 10 弱のリクエストの場合は、ユーザの待ち時間が数値上はほぼ無くなります。1 秒あたり 10~100 リクエスト程度の範囲に、安定運用可能なリクエスト頻度の目安があるのかもしれません。



マスタ1台構成 vs ワーカ5台構成

 最後に、下図は500スレッドの処理を完了するまでの時間を、1 サーバ構成と 5 ワーカマシン構成でパフォーマンスを比較した折れ線グラフです。折れ線の左の部分は、7 秒間に 500 のスレッドからのリクエストを処理する場合、1 サーバ構成の方が 5 ワーカ構成より有利であることを示しています。
 本テストは 7 秒~90 秒という短い時間内で終了してしまうテストなので、より長い時間、継続的に負荷がかかるようなケースには当てはまらないかもしれませんが、ワーカを増やせば実行速度も増す、と単純に想定することはできないことを示していると思います。



(亀)