ユーザ用ツール

サイト用ツール


pub:soap-programing-howto.md

IEEE1888の実装

この文書はIEEE1888通信規格をJavascriptで実装するための記録である。

  • 初出:2012年12月20日
  • 著者:AONO Masayuki<msyaono(at)rockos.co.jp>

概要

IEEE 1888はオフィス、工場、家庭内のセンサー情報をクラウドに送るための通信規格で、中日の共同提案で、2011年2月に国際標準規格となった。詳細は東大グリーンICTプロジェクトで詳しく記載している。

センサが接続されたゲートウェイ、データ蓄積用ストレージ、データを処理するアプリケーションと呼ぶ部品でネットワーク上に構成される。各部品はSOAP通信プロトコル(HTTPとXML)により通信する。通信プロトコルが標準化されることで異機種間の接続が容易に行なえる。

設計方針

1. プログラミング言語

IEEE1888プロトコルはnode.js上のjavascriptで実装する。 理由は

  • node.jsはこのようなネットワーク通信に適している。
  • SOAPのモジュールがあるので、新規に書く必要がない。
  • GUI画面と連携し易い

等による。

2. 開発と検証

  1. シンプルなSOAPクライアントを作成し、東大のsandboxにアクセスしてみる。
  2. SOAPサーバを書き、クライアントとの接続テストを行なう。
  3. モジュール化して公開する。

node.js用SOAPモジュールは公開されたものを使用するが、最終的には自社開発とする。

開発環境の整備

ダウンロード

IEEE1888プロトコルSDKとテスト環境用のOracle VM VirtualBox for Mac OS Xをダウンロードする。(2012年12月21日時点での最新版)

VirtualBOXの設定

仮想マシンの登録

VirtualBoxを起動し、以下の手順で仮想マシンを登録する。

  1. 「新規」を選択。新規仮想マシンの作成ウィザードを開く。
  2. 仮想マシン名とOSタイプを入力。「名前 -> IEEE1888SDK」「OS -> Linux」「バージョン -> Ubuntu」とする。(名前は任意)
  3. メモリ量を指定。「メモリ -> 512MB」とする。
  4. 仮想ハードディスクの設定画面で「既存のハードディスクを使用(U)」を選択。ハードディスクを選ぶ必要があるが、ここでは、SDKを展開して得られるVirtual Machines の中にある IEEE1888SDK.vmdk を選択。(ファイル名IEEE1888SDK-s00x.vmdkの方ではない)
  5. ネットワーク設定でbridge接続にする。

以上で登録完了したので起動してその他の設定をする。

  1. システム->設定->キーボードでレイアウトタブを選択しキーボードの種類を設定する。
    • MacBook/MacBookPro(Intl)
  2. システム->システム管理->アップデートマネージャを選択する。
  3. 設定釦を押してアップデートタグ画面の全てのチェックを外す。(自動でOSのアップデートを行わない)

仮想マシンの起動

  1. VirtualBoxアイコンをクリックしてIEEE1888SDKを起動する。
  2. 自動的に gutp アカウントでログインされる。gutp アカウントのデフォルトパスワードは、gutp になっている。
  3. VirtualBoxVM Windowが開くので端末をクリックしてifconfigと入力してipアドレスを調べる。(ここでは192.168.0.157が割り当っていた)
  4. 別なマシンのブラウザからhttp://192.168.0.157/にアクセスしてSensors in this FIAPStorageの画面が表示されれば正常に設定できている。

ネットワーク設定

このままではインターネットにつながらないので、ネトワークの設定を行う。

 $ sudo su
 # vi /etc/network/interfaces

auto eth1
iface eth1 inet static
address 192.168.0.157
netmask 255.255.255.0
gateway 192.168.0.1

 # vi /etc/resolv.conf

 nameserver 192.168.0.1

 # /etc/init.d/networking restart

TCPmon install

  1. apacheのサイトからTCPmonをダウンロードして解凍する。
  2. tcpmon.shに実行権限を与える。

    $ cd ~/tcpmon-1.0-bin/build
    $ chmod +x tcpmon.sh
    
  3. bashrcにエイリアス設定

    $ vi ~/.bashrc
    
    arias tcpmon='~/tcpmon-1.0-bin/build/tcpmon.sh &'
    
  4. 実行時の注意

    Note that your current working directory must be the build folder, else Java will report a ClassNotFoundException
    

参考URL

プロトコル概要

フォーマット一覧

1. FETCH手順

Header部フォーマット

POST /axis2/services/FIAPStorage HTTP/1.1
Content-Type: text/xml;charset=UTF-8
User-Agent: Axis2
Host: URI
SOAPAction: "http://soap.fiap.org/data"
Content-Length: NNN

  • URI:接続先ホストipアドレス(ex 192.168.10.198)
  • NNN:Body長+4byte

Body部フォーマット ( IEEE1888_QUERY_RQ )


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soapenvelope/">
  <soapenv:Body>
    <ns2:queryRQ xmlns:ns2="http://soap.fiap.org/">
      <transport xmlns="http://gutp.jp/fiap/2009/11/">
        <header>
          <OK />
          <error></error>
          <query … > 
            <key … />
          </query>
        </header>
      </transport>
    </ns2:queryRQ>"
  </soapenv:Body>
</soapenv:Envelope>

<query>のオプション一覧

*がついているものは省略不可

key value sample
id* string id="XY-X-X-X-XYZ"
type* string type="srorage"
cursor string cursor=""
ttl number ttl="1"
acceptableSize number acceptableSize=""
callbackData string callbackData=""
callbackControl string callbackControl=""
  • id:X,Y,Zは16進4桁の数

<key>のオプション一覧

*がついているものは省略不可

key value sample
id string id="uri"
attrName string attrName=""
eq string eq=""
neq string neq=""
lt string lt=""
gt string gt=""
lteq string lteq=""
gteq string gteq""
select string select=""
trap string trap=""

2. WRITE手順

サンプルプログラム

node-soapモジュールインストール

 $ npm install soap

トラブル

AngstromLinux(Beaglebone)でsoapをインストールすると、gypでコンパイルエラーが発生。

ソースコード

 soap.createClient('http://192.168.0.157/axis2/services/FIAPStorage?wsdl', function(err, client) {
   console.log(client)
   }
{ query: [Function],
  wsdl: 
   { xml: '\n<wsdl:definitions targetNamespace="http:/... (length: 8192)',
     definitions: 
      { xmlns: [Object],
        messages: [Object],
        services: [Object],
        '$targetNamespace': 'http://soap.fiap.org/',
        bindings: [Object],
        portTypes: [Object],
        schemas: [Object] },
     options: {},
     xmlnsInEnvelope: ' xmlns:s0="http://gutp.jp/fiap/2009/11/" xmlns:tns="http://soap.fiap.org/"',
     callback: [Function],
     services: { FIAPStorage: [Object] },
     uri: 'http://192.168.0.157/axis2/services/FIAPStorage?wsdl' },
  FIAPStorage: { FIAPServiceSoap: { query: [Function], data: [Function] } },
  data: [Function] }
pub/soap-programing-howto.md.txt · 最終更新: 2013/05/02 12:18 by msyaono