tag:blogger.com,1999:blog-31898052248755575122024-03-05T19:08:03.912+09:00OBDNマガジン<strong>OBDNマガジン - OpenBlocks Developers Network Magazine</strong><br>
<br>
OBDNプライマルアドバイザ・後藤敏也 Toshiya Goto を責任編集者としてつづる、OpenBlocksやマイクロサーバ、Linux、オープンソースソフトウェアの最新技術やニュース定点観測ブログです。
関連情報に興味を持つ技術者や管理者に、Linux業界第一人者としての視点から見たIT最新情報をお届けします。
<br><br>
OpenBlocks Developers Network はこちら<br>
<a href="http://openblocks.plathome.co.jp/support/">http://openblocks.plathome.co.jp/support/</a>OpenBlocks Developers Networkhttp://www.blogger.com/profile/00647457373763783062noreply@blogger.comBlogger181125tag:blogger.com,1999:blog-3189805224875557512.post-77897471105518381792018-06-21T13:00:00.000+09:002018-10-01T15:12:15.944+09:00[VX2] Movidius Neural Compute Stick (Myriad2) NCSDK2の導入方法<span style="font-family: inherit;">Movidius Neural Compute Stickは、VPUと呼ばれる、ディープラーニング推論のためのアクセラレータです。</span><br />
<span style="font-family: inherit;">本製品は、Movidius Myriad2 VPUを使用したもので、開発用としてUSBスティックタイプのものが用意されています。</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">今回の記事は、本製品のSDKである、NCSDKの最新バージョンである、V2.04をOpenBlocks IoT VX2(VX1)で利用するためのTipsとなります。</span><br />
( 2018/7/11 時点では、2.0.5がリリースされており、Bug Fixに記述がありませんが、アプリケーション実行後の再起動時にdevice Stalledの状態になった場合、デバイスが復帰するようになりました。<br />
2018/7/15 追記 2.05においては、別の致命的なエラーが出ることを確認しています。現状では1.x系を使った方がいいかもしれません。<br />
)<br />
<span style="font-family: inherit;"><br /></span>
<a href="https://developer.movidius.com/"><span style="font-family: inherit;">Intel® Movidius | Neural Compute Stick | AI Programming</span></a><br />
<span style="font-family: inherit;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXSGKbJNhxD5S2uQofDtON53Tzj-Lgn3RXjHkMyZSGEIl8xXak6iBaM3cM4OIh9tUZucxCCvVquDqpoPJqmzShaziW7iq5-OASSDUzFLJvRpOyQm4ib68ek525NBWnzFyG5rwxQK970T1D/s1600/IMG_0398.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: inherit;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXSGKbJNhxD5S2uQofDtON53Tzj-Lgn3RXjHkMyZSGEIl8xXak6iBaM3cM4OIh9tUZucxCCvVquDqpoPJqmzShaziW7iq5-OASSDUzFLJvRpOyQm4ib68ek525NBWnzFyG5rwxQK970T1D/s400/IMG_0398.JPG" width="400" /></span></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: inherit;"><br /></span></div>
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: inherit;">OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。</span><br />
<span style="font-family: inherit;">内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</span></div>
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><検証環境></span><br />
<span style="font-family: inherit;">OpenBlocks IoT VX2 FW3.1</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<hr />
<b><span style="font-family: inherit;">1. ncsdk2のインストール</span></b><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">ncsdk v2のブランチを利用するには、以下のように指定します。</span><br />
<br />
<span style="background-color: #eeeeee;"><span style="vertical-align: baseline; white-space: pre-wrap;">git clone -b ncsdk2 </span><span style="color: #1155cc; vertical-align: baseline; white-space: pre-wrap;"><a href="https://github.com/movidius/ncsdk.git" style="text-decoration-line: none;">https://github.com/movidius/ncsdk.git</a></span></span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">先に、ncsdkディレクトリ下で</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="background-color: #eeeeee; font-family: inherit;">./install.sh</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><span id="docs-internal-guid-56f6eb40-1ba5-dc33-3ab0-853acf1c7570">とするのですが、</span>NCSDKは、Ubuntu16.04またはRasbian9に対応していますが、debian9などの他のディストリビューションには対応していません。</span><br />
<span style="font-family: inherit;">そのため、今回はRasbian9と認識させてインストールさせます。</span><br />
<span style="font-family: inherit;">install.shの以下の部分(30行目以降)に変更を加えます。</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="background-color: #eeeeee; font-family: inherit;"># OS_DISTRO="${DISTRO:-INVALID}"</span><br />
<span style="background-color: #eeeeee; font-family: inherit;"># OS_VERSION="${VERSION:-255}"</span><br />
<span style="background-color: #eeeeee; font-family: inherit;"> OS_DISTRO="raspbian"</span><br />
<span style="background-color: #eeeeee; font-family: inherit;"> OS_VERSION="91"</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">このスクリプトが終了したら、api/src の下で、</span><br />
<span style="color: #24292e; font-family: inherit;"><br /></span>
<span style="background-color: #eeeeee; color: #24292e; font-family: inherit;">make install</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">として、sdkをインストールしてください。</span><br />
<span style="font-family: inherit;"><br /></span>
<u><span style="font-family: inherit;">・tensorflowについて</span></u><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">インストールは一通り終わりますが、インストールされたpython用のtensorflowはno gpuバージョンであっても、現在配布されているバージョンのモジュールはAVX命令をenableとしてビルドしているため、そのままでは使用できません。</span><br />
<span style="font-family: inherit;">tensorflowは別途SSE2のみでビルドする必要があります。</span><br />
<span style="font-family: inherit;">(VX2でセルフコンパイルをするのはリソース的に厳しいため、他のdebian/amd64のPCなどでwhlファイルを作成することをおすすめします)</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">bazelを使ったインストールはtensorflowのサイトのfrom Sourcesに従って行います。</span><br />
<span style="font-family: inherit;"><br /></span>
<a href="https://www.tensorflow.org/install/install_sources" target="_blank"><span style="font-family: inherit;">Installing TensorFlow from Sources</span></a><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">bazelをAPT repositoryよりインストールした場合は、0.14.1がインストールされますが、tensorflowのサイトサンプルのようにgit checkout r1.0のように指定すると、古いリリースのものがcheckoutされてbazelの</span><span style="font-family: inherit;">古いバージョンのものが必要となります。</span><br />
<br />
<span style="background-color: #eeeeee;">git clone https://github.com/tensorflow/tensorflow</span><br />
<span style="background-color: #eeeeee;">cd tensorflow</span><br />
<span style="background-color: #eeeeee;">git checkout v1.9.0</span><br />
<br />
<span style="font-family: inherit;">tensorflow-hubなども使えるよう、新しいリリースのものをcheckoutします。</span><br />
<span style="font-family: inherit;">bazelのオプションは今回は以下のように設定しました。</span><br />
<span style="font-family: inherit;"><br /></span>
<span id="docs-internal-guid-ee7fc8c7-1ffb-b0b0-02a0-457128137c67"><span style="background-color: #eeeeee; font-family: "arial"; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;">bazel build -c opt --copt=-msse4.2 //tensorflow/tools/pip_package:build_pip_package</span></span><br />
<br />
<span style="font-family: inherit;">ビルド、パッケージ作成、インストールが終わったら、以下のスクリプトがエラーなく動作することを確認してください。</span><br />
<br />
<span style="background-color: #eeeeee;"># Python3</span><br />
<span style="background-color: #eeeeee;">import tensorflow as tf</span><br />
<span style="background-color: #eeeeee;">hello = tf.constant('Hello, TensorFlow!')</span><br />
<span style="background-color: #eeeeee;">sess = tf.Session()</span><br />
<span style="background-color: #eeeeee;">print(sess.run(hello))</span><br />
<br />
<div>
<span style="font-family: inherit;">ここで、warningが出る場合は以下のモジュールアップデートが必要です。</span></div>
<div>
<span style="font-family: inherit;"><br /></span></div>
<u style="background-color: #eeeeee;">pip3 install --upgrade h5py</u><br />
<br />
<u><span style="font-family: inherit;">・OpenCVについて</span></u><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">opencvもそのままでは不完全にインストールされるため、別途ソースコードからインストールしなおすか、暫定でpython対応だけでよいならば、</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="background-color: #eeeeee; font-family: inherit;">pip3 install opencv-python</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">としてインストールしてください。</span><br />
<span style="font-family: inherit;"><br /></span>
opencvをビルドする場合のcmakeのオプションのサンプルは以下の通りです。<br />
<br />
<span style="background-color: #eeeeee;">cmake -G "Unix Makefiles" --build . -D BUILD_CUDA_STUBS=OFF -D BUILD_DOCS=OFF \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_EXAMPLES=OFF -D BUILD_JASPER=OFF -D BUILD_JPEG=OFF -D BUILD_OPENEXR=OFF \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_PACKAGE=ON -D BUILD_PERF_TESTS=OFF -D BUILD_PNG=OFF -D BUILD_SHARED_LIBS=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_TBB=OFF -D BUILD_TESTS=OFF -D BUILD_TIFF=OFF -D BUILD_WITH_DEBUG_INFO=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_ZLIB=OFF -D BUILD_WEBP=OFF -D BUILD_opencv_apps=ON -D BUILD_opencv_calib3d=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_core=ON -D BUILD_opencv_cudaarithm=OFF -D BUILD_opencv_cudabgsegm=OFF \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_cudacodec=OFF -D BUILD_opencv_cudafeatures2d=OFF -D BUILD_opencv_cudafilters=OFF \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_cudaimgproc=OFF -D BUILD_opencv_cudalegacy=OFF -D BUILD_opencv_cudaobjdetect=OFF \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_cudaoptflow=OFF -D BUILD_opencv_cudastereo=OFF -D BUILD_opencv_cudawarping=OFF \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_cudev=OFF -D BUILD_opencv_features2d=ON -D BUILD_opencv_flann=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_highgui=ON -D BUILD_opencv_imgcodecs=ON -D BUILD_opencv_imgproc=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_java=OFF -D BUILD_opencv_ml=ON -D BUILD_opencv_objdetect=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_photo=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_shape=ON -D BUILD_opencv_stitching=ON -D BUILD_opencv_superres=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_ts=ON -D BUILD_opencv_video=ON -D BUILD_opencv_videoio=ON \</span><br />
<span style="background-color: #eeeeee;">-D BUILD_opencv_videostab=ON -D BUILD_opencv_viz=OFF -D BUILD_opencv_world=OFF \</span><br />
<span style="background-color: #eeeeee;">-D CMAKE_BUILD_TYPE=RELEASE -D WITH_1394=ON -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF \</span><br />
<span style="background-color: #eeeeee;">-D WITH_CUFFT=OFF -D WITH_EIGEN=ON -D WITH_FFMPEG=ON -D WITH_GDAL=OFF -D WITH_GPHOTO2=OFF \</span><br />
<span style="background-color: #eeeeee;">-D WITH_GIGEAPI=ON -D WITH_GSTREAMER=OFF -D WITH_GTK=ON -D WITH_INTELPERC=OFF -D WITH_IPP=ON \</span><br />
<span style="background-color: #eeeeee;">-D WITH_IPP_A=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LIBV4L=ON -D WITH_OPENCL=ON \</span><br />
<span style="background-color: #eeeeee;">-D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=ON \</span><br />
<span style="background-color: #eeeeee;">-D WITH_OPENGL=ON -D WITH_OPENMP=OFF -D WITH_OPENNI=OFF -D WITH_PNG=ON -D WITH_PTHREADS_PF=OFF \</span><br />
<span style="background-color: #eeeeee;">-D WITH_PVAPI=OFF -D WITH_QT=ON -D WITH_TBB=ON -D WITH_TIFF=ON -D WITH_UNICAP=OFF \</span><br />
<span style="background-color: #eeeeee;">-D WITH_V4L=ON -D WITH_VTK=OFF -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D WITH_XINE=OFF \</span><br />
<span style="background-color: #eeeeee;">-D WITH_LAPACKE=ON -D WITH_MATLAB=OFF ..</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<div>
<span style="font-family: inherit;"><u>・NCSの動作確認</u></span><br />
<span style="font-family: inherit;"><br /></span>
NCSデバイスを認識すると、hello_ncs.pyの結果が以下のように表示されます。<br />
<span style="font-family: inherit;"><br /></span>
<span style="background-color: #eeeeee;">#cd ~/ncsdk/examples/apps/hello_ncs_py</span><br />
<span style="background-color: #eeeeee;"># python3 hello_ncs.py</span><br />
<span style="background-color: #eeeeee;">D: [ 0] ncDeviceCreate:221 ncDeviceCreate index 0</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">D: [ 0] ncDeviceCreate:221 ncDeviceCreate index 1</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">D: [ 0] ncDeviceOpen:415 File path /usr/local/lib/mvnc/MvNCAPI-ma2450.mvcmd</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] ncDeviceOpen:421 ncDeviceOpen() XLinkBootRemote returned success 0</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] ncDeviceOpen:450 XLinkConnect done - link Id 0</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">D: [ 0] ncDeviceOpen:464 done</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] ncDeviceOpen:466 Booted 1.1-ma2450 -> VSC</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] getDevAttributes:287 Device attributes</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] getDevAttributes:290 Device FW version: 2.4.2450.e4</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] getDevAttributes:292 mvTensorVersion 2.4</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] getDevAttributes:293 Maximum graphs: 10</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] getDevAttributes:294 Maximum fifos: 20</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] getDevAttributes:296 Maximum graph option class: 1</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] getDevAttributes:298 Maximum device option class: 1</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">I: [ 0] getDevAttributes:299 Device memory capacity: 522081584</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">Hello NCS! Device opened normally.</span><br />
<span style="background-color: #eeeeee;">I: [ 0] ncDeviceClose:656 closing device</span><br />
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;">Goodbye NCS! Device closed normally.</span><br />
<br />
<span style="background-color: #eeeeee;">NCS device working.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<hr />
<b><span style="font-family: inherit;">2.ncappzooのv2用ブランチの入手</span></b><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">ncappzooもv2用のブランチが用意されています。</span><br />
<span style="font-family: inherit;">以下のオプションにてgit cloneしてください。</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><span style="color: black; vertical-align: baseline; white-space: pre;">git clone -b ncsdk2 </span><span style="color: #1155cc; vertical-align: baseline; white-space: pre-wrap;"><a href="https://github.com/movidius/ncappzoo.git" style="text-decoration-line: none;">https://github.com/movidius/ncappzoo.git</a></span></span><br />
<div>
<div>
<br />
READMEに従って必要なgraphファイルを作成するとともに、gstreamerなど、要求されるモジュールは別途インストールしてください。<br />
<br />
また、opencvは、linuxで利用する場合は、ディスプレイとしてXを使います。<br />
OpenBlocks IoT VX2(VX1)にはディスプレイヘッドはありませんので、Xサーバを別に用意する必要があります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQTy-tDqyjLKifnUj5wo51JN-NKkUHL4iJ4J6_arRb6YQWNkHur9P9YAoK18R4LkyS9X5Pok8iiGjKnXXqOWATLbICNqnrOImK64qXoJhKM9qef3MNerQNgMBX_hUknZQFhDur-kVN9iFq/s1600/movidius_sample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="510" data-original-width="861" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQTy-tDqyjLKifnUj5wo51JN-NKkUHL4iJ4J6_arRb6YQWNkHur9P9YAoK18R4LkyS9X5Pok8iiGjKnXXqOWATLbICNqnrOImK64qXoJhKM9qef3MNerQNgMBX_hUknZQFhDur-kVN9iFq/s400/movidius_sample.png" width="400" /></a></div>
<br />
<div style="text-align: center;">
stream_inferの実行例<br />
( 液晶モニタがmonitorとして認識されている )</div>
<br />
<hr />
</div>
<div>
<b>3.最後に</b><br />
<br />
ストレージ(eMMC)の制約から、VX2でなくVX1を使う場合は、外付けのUSB HDDなどを使用して環境のビルドを行ってください。<br />
また、セルフビルドを行う場合、以下のようにTMPDIRの設定が必要な場合があります。<br />
<br />
export TMPDIR=/var/tmp<br />
<br />
<span style="font-family: inherit;">なお、本SDKおよびサンプルアプリケーションであるncappzooをインストールしたdockerコンテナを作成しておりますので、別途公開する予定です。</span></div>
</div>
<div>
<br /></div>
</div>
Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-87494635843919870492018-04-25T13:56:00.000+09:002018-04-25T14:15:13.315+09:00OpenBlocks IoT FW3.xシリーズで下流方向の制御を行うハンドラの設定とテンプレート (C言語)OpenBlocks IoT VX2およびVX1では、基本ソフトウェアとしてFW3.xが用意されます。<br />
FW3.xシリーズでは、2.xシリーズの各機能に加え、以下のようなアップデートが行われています。<br />
<br />
・メッセージの完全な双方向化<br />
・Dockerに対応。エッジ処理モジュールをDockerコンテナで提供可能<br />
・エッジ処理のみをNode-REDでも記述可能<br />
・Luaによるデバイスハンドラ記述が可能<br />
・Node-REDの最新環境を提供し、カスタマイズを容易に<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://openblocks.plathome.co.jp/products/obs_iot/common/image/fw3_architecture_l.png?20171219" style="margin-left: 1em; margin-right: 1em;">
<img align="middle" alt="Firmware 3.0 Architecture" class="img01" src="https://openblocks.plathome.co.jp/products/obs_iot/common/image/fw3_architecture_s.png" width="500" />
</a></div>
<div class="opacity" style="text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a>Firmware 3.0 Architecture スタック</div>
<br />
今回は、FW3.xで実装された、メッセージの双方向化における、下流方向のデータを用いたデバイスハンドラについて、まずは、C言語による記述と、設定方法について簡単に解説します。<br />
<br />
メッセージの完全な双方向化に関しての詳細な情報は以下のドキュメントをご覧ください。<br />
<br />
<a href="https://openblocks.plathome.co.jp/products/obs_iot/common/pdf/OpenBlocks_iot_Data_Handling_Guide_v3.0.0_20180125.pdf">OpenBlocks IoT Family データハンドリングガイド</a><br />
<br />
<a href="https://openblocks.plathome.co.jp/products/obs_iot/common/pdf/OpenBlocks_iot_Data_Handling_Config_Ref_v3.0.0_20171222.pdf">OpenBlocks IoT Family データハンドリング設定リファレンスガイド</a><br />
<br />
先にご理解いただきたいのですが、メッセージの双方向化に関しては、現在は、<br />
MQTT系の接続サービス、TCP接続、当社PD Exchangeとの接続、当社独自仕様のWebサーバーのみでご利用いただけます。対応の詳細に関しましては、上記ドキュメントを参照してください。<br />
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a>OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<b><span style="font-size: large;">1.Userデバイスの作成と送受信設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
・<b><u>Userデバイスの作成</u></b><br />
サービスメニューより、基本機能、Userデバイスタブ、の順に選択します。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlNfLlb_QLFUqwg-Kz0lwcCroXwsVpo1XkcZWHFTWsFGuDuvCcaVVoUNZSpBGXhA3Dxz5LOBI2exrGCEW1ez1c4vp0qbu69N6w44H2P9266pJN16bdvFsfGiXFfb2OlhV2zsSIjePJsTNK/s1600/fw3handler-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="368" data-original-width="939" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlNfLlb_QLFUqwg-Kz0lwcCroXwsVpo1XkcZWHFTWsFGuDuvCcaVVoUNZSpBGXhA3Dxz5LOBI2exrGCEW1ez1c4vp0qbu69N6w44H2P9266pJN16bdvFsfGiXFfb2OlhV2zsSIjePJsTNK/s400/fw3handler-1.png" width="400" /></a></div>
ユーザーメモを入力し、保存すると、一覧に作成したUserデバイスが表示されます。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2A4_pTYS_1iO42tu6u_S_GseUaCJmfHDX2A4RWFm6iG6SltPZ7zZqQgfibebAopoI6egjDtlzU-VknJQbvzIrbQuzrEueqOpI8BTEuIS6UiQYQ4D0B6u3b_5DEdteh5apgpisd9HF-5BZ/s1600/fw3handler-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="624" data-original-width="919" height="271" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2A4_pTYS_1iO42tu6u_S_GseUaCJmfHDX2A4RWFm6iG6SltPZ7zZqQgfibebAopoI6egjDtlzU-VknJQbvzIrbQuzrEueqOpI8BTEuIS6UiQYQ4D0B6u3b_5DEdteh5apgpisd9HF-5BZ/s400/fw3handler-2.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
・<b><u>送受信設定</u></b><br />
サービスメニューより、IoTデータ、送受信設定の順に選択します。<br />
今回は、例としてAzure IoT Hubへの送受信設定を行っています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNV78RHaHTARZYqpMjtBUhtrY1225HTPHGEr60kcYdg99VokPZOF_qinRKuq88vsoOVAkiz6QNJ8RhETQ_6agStQchJqGck1kYLpr9QPKjR2Xn6yylTQboCVPTwdTlMmLOreSRb5Lg53UP/s1600/fw3handler-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="948" data-original-width="925" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNV78RHaHTARZYqpMjtBUhtrY1225HTPHGEr60kcYdg99VokPZOF_qinRKuq88vsoOVAkiz6QNJ8RhETQ_6agStQchJqGck1kYLpr9QPKjR2Xn6yylTQboCVPTwdTlMmLOreSRb5Lg53UP/s400/fw3handler-3.png" width="390" /></a></div>
<br />
上記、送受信の設定を行った後、Userデバイスに対してのデバイス設定を行います。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgusIJN1elEiahuFFX9NwUIGkpalBmz1npjMIosxE7qK_srnesQCWjmvq5sH5ryYPgFy1ukK_HqGkthLM8uKQYEJHhyphenhyphenMETOqQwXu5bA-AYs-wyQK443-64y4DkHuPB50y1q-lrZSbHfcNEN/s1600/fw3handler-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="494" data-original-width="870" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgusIJN1elEiahuFFX9NwUIGkpalBmz1npjMIosxE7qK_srnesQCWjmvq5sH5ryYPgFy1ukK_HqGkthLM8uKQYEJHhyphenhyphenMETOqQwXu5bA-AYs-wyQK443-64y4DkHuPB50y1q-lrZSbHfcNEN/s400/fw3handler-4.png" width="400" /></a></div>
デバイス設定メニュー内の送受信設定にて、iothubにチェックを入れ、接続に必要なデバイスIDおよびデバイスキーを入力します。<br />
なお、Azure IoT Hubへの接続方法に関しては、以下のOBDNマガジンの記事にて解説を行っています。<br />
<br />
<div class="post-title entry-title">
<a href="http://obdnmagazine.blogspot.jp/2016/08/openblocks-iot-microsoft-azure-iot.html">OpenBlocks IoT シリーズをMicrosoft Azure IoT Hubへ接続し、Stream Analyticsを経由してPowerBIへデータを受け渡す手順について</a></div>
<br />
下流方向への制御を行うには、「受信設定」を「有効」にします。<br />
制御に使用する、Unixドメインソケットは、作成したデバイス番号より生成されます。<br />
<br />
<b><span style="font-size: large;">2.送受信に使用するUnixドメインソケット</span></b><br />
<hr color="#d0d0d0" size="1" />
制御メッセージの送受信に使用するUnixドメインソケットは、データハンドリングガイドにて解説しています。<br />
<br />
<u>PD Repeaterからの下流方向</u><br />
<br />
¥0/pd_handler/<デバイス番号>.sock<br />
<br />
<u>PD Repeaterへの上流方向</u><br />
<br />
<a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="https://www.blogger.com/blogger.g?blogID=3189805224875557512" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="about:invalid#zClosurez" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><br /></a>¥0/pd_repeater/<デバイス番号>.sock<br />
<br />
今回の設定例では、デバイス番号はuserdev_0000001となります。<br />
<br />
<b><span style="font-size: large;">3.Cで記述した下流方向制御アプリケーションのサンプル</span></b><br />
<hr color="#d0d0d0" size="1" />
本サンプルは、Cで記述した下流方向制御アプリケーションのサンプルです。<br />
PD Repeater側がクライアントとなり、下流方向の制御アプリケーションはUnixドメインソケットを使うサーバ側の実装となります。<br />
本プログラムは下流制御機能の評価用に作成されたもので、Userデバイスとして定義されるUnixドメインソケットのuserdev_0000000からuserdev_0000031までをポーリングして受信したデータを表示します。<br />
<br />
# apt-get update<br />
# apt-get install libssl-dev<br />
<br />
インストールされていないならば、libssl-devパッケージをインストールし、<br />
<br />
# make rd_header<br />
<br />
シンプルにmakeしてください。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
/*<br />
* Copyright (c) 2018<br />
* Plat'Home CO., LTD. <support@plathome.co.jp>. All rights reserved.<br />
*<br />
* Redistribution and use in source and binary forms, with or without<br />
* modification, are permitted provided that the following conditions<br />
* are met:<br />
* 1. Redistributions of source code must retain the above copyright<br />
* notice, this list of conditions and the following disclaimer.<br />
* 2. Redistributions in binary form must reproduce the above copyright<br />
* notice, this list of conditions and the following disclaimer in the<br />
* documentation and/or other materials provided with the distribution.<br />
* 3. Neither the name of the Plat'Home CO., LTD. nor the names of<br />
* its contributors may be used to endorse or promote products derived<br />
* from this software without specific prior written permission.<br />
*<br />
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR<br />
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED<br />
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE<br />
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,<br />
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES<br />
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR<br />
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)<br />
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT<br />
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY<br />
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF<br />
* SUCH DAMAGE.<br />
*/<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <string.h><br />
#include <fcntl.h><br />
#include <unistd.h><br />
#include <time.h><br />
#include <sys/param.h><br />
#include <sys/socket.h><br />
#include <sys/un.h><br />
#include <sys/select.h><br />
#include <openssl/md5.h><br />
#ifdef __linux__<br />
#include <sys/epoll.h><br />
#endif<br />
<br />
#define N_DEVICE <span style="white-space: pre;"> </span>32<br />
#ifdef __linux__<br />
#define ROOT_PATH<span style="white-space: pre;"> </span>"/pd_handler"<br />
#else<br />
#define ROOT_PATH<span style="white-space: pre;"> </span>"/tmp/pd_handler"<br />
#endif<br />
#define LOCALNAME<span style="white-space: pre;"> </span>"userdev_"<br />
<br />
#define SOCKET_BUF<span style="white-space: pre;"> </span>4096<br />
<br />
#ifdef __linux__<br />
#define MAX_SOCKET_CONN 512<br />
#else<br />
#define MAX_SOCKET_CONN 64<br />
#endif<br />
<br />
#define SELECT_TIMEOUT<span style="white-space: pre;"> </span>0<br />
#define SELECT_UTIMEOUT<span style="white-space: pre;"> </span>1<br />
#define EPOLL_WAIT<span style="white-space: pre;"> </span>1<br />
<br />
struct s_socket_t {<br />
<span style="white-space: pre;"> </span>int fd;<br />
<span style="white-space: pre;"> </span>struct sockaddr_un addr;<br />
};<br />
<br />
struct c_socket_t {<br />
<span style="white-space: pre;"> </span>unsigned char<span style="white-space: pre;"> </span>id;<br />
<span style="white-space: pre;"> </span>int fd;<br />
<span style="white-space: pre;"> </span>struct sockaddr_un addr;<br />
};<br />
<br />
int main(int argc,char *argv[])<br />
{<br />
<span style="white-space: pre;"> </span>int i,j,k,m,n,rc;<br />
<span style="white-space: pre;"> </span>char *buf, *socket_buf, *msg_buf;<br />
<br />
#ifdef __linux__<br />
<span style="white-space: pre;"> </span>int num_fd, epfd;<br />
<span style="white-space: pre;"> </span>struct epoll_event ev;<br />
<span style="white-space: pre;"> </span>struct epoll_event events[MAX_SOCKET_CONN];<br />
<span style="white-space: pre;"> </span>int fcntl_flag;<br />
#else<br />
<span style="white-space: pre;"> </span>struct timeval timeout;<br />
<span style="white-space: pre;"> </span>fd_set rd_set, rd_set_orig;<br />
#endif<br />
<span style="white-space: pre;"> </span>struct timeval tv;<br />
<span style="white-space: pre;"> </span>socklen_t len;<br />
<span style="white-space: pre;"> </span>struct s_socket_t *ss[N_DEVICE];<br />
<span style="white-space: pre;"> </span>struct c_socket_t *cs[MAX_SOCKET_CONN - N_DEVICE];<br />
<span style="white-space: pre;"> </span>u_int16_t topic_size;<br />
<span style="white-space: pre;"> </span>char *p, *topic, *topic_p, *msg_buf_p;<br />
<span style="white-space: pre;"> </span>unsigned char pl;<br />
<span style="white-space: pre;"> </span>unsigned char ph;<br />
<span style="white-space: pre;"> </span>unsigned char cloud_id, sub_id;<br />
<span style="white-space: pre;"> </span>unsigned char md5[MD5_DIGEST_LENGTH];<br />
<span style="white-space: pre;"> </span>char hash[MD5_DIGEST_LENGTH * 2 + 1];<br />
<br />
<span style="white-space: pre;"> </span>buf = (char *)malloc(sizeof(char)*BUFSIZ);<br />
<span style="white-space: pre;"> </span>if(!buf) {<br />
<span style="white-space: pre;"> </span>perror("buf = malloc()");<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<br />
<span style="white-space: pre;"> </span>socket_buf = (unsigned char *)malloc(sizeof(unsigned char)*SOCKET_BUF);<br />
<span style="white-space: pre;"> </span>if(!socket_buf) {<br />
<span style="white-space: pre;"> </span>perror("socket_buf = malloc()");<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<br />
<span style="white-space: pre;"> </span>msg_buf = (unsigned char *)malloc(sizeof(unsigned char)*SOCKET_BUF);<br />
<span style="white-space: pre;"> </span>if(!msg_buf) {<br />
<span style="white-space: pre;"> </span>perror("msg_buf = malloc()");<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<br />
<span style="white-space: pre;"> </span>topic = (char *)malloc(sizeof(char)*BUFSIZ);<br />
<span style="white-space: pre;"> </span>if(!topic) {<br />
<span style="white-space: pre;"> </span>perror("socket_buf = malloc()");<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<br />
#ifdef __linux__<br />
<span style="white-space: pre;"> </span>if ((epfd = epoll_create(MAX_SOCKET_CONN)) < 0) {<br />
<span style="white-space: pre;"> </span>perror("epfd = epoll_create()");<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
#else<br />
<span style="white-space: pre;"> </span>FD_ZERO(&rd_set_orig);<br />
#endif<br />
<br />
<span style="white-space: pre;"> </span>for(i=0;i<N_DEVICE;i++) {<br />
<span style="white-space: pre;"> </span>ss[i] = (struct s_socket_t *)malloc(sizeof(struct s_socket_t));<br />
<span style="white-space: pre;"> </span>if(!ss[i]) {<br />
<span style="white-space: pre;"> </span>perror("ss[] = malloc()");<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>memset(ss[i], 0, sizeof(struct s_socket_t));<br />
<br />
<span style="white-space: pre;"> </span>ss[i]->fd = socket(AF_UNIX, SOCK_STREAM, 0);<br />
<span style="white-space: pre;"> </span>ss[i]->addr.sun_family = AF_UNIX;<br />
#ifdef __linux__<br />
<span style="white-space: pre;"> </span>snprintf(ss[i]->addr.sun_path + 1,sizeof(ss[i]->addr.sun_path) - 1,"%s/%s%07d.sock",<br />
<span style="white-space: pre;"> </span>ROOT_PATH, LOCALNAME, i);<br />
<span style="white-space: pre;"> </span>unlink(ss[i]->addr.sun_path);<br />
<br />
<span style="white-space: pre;"> </span>rc = bind(ss[i]->fd, (struct sockaddr *)&ss[i]->addr, sizeof(sa_family_t) + strlen(ss[i]-><br />
addr.sun_path + 1) + 1);<br />
#else<br />
<span style="white-space: pre;"> </span>snprintf(ss[i]->addr.sun_path,sizeof(ss[i]->addr.sun_path),"%s/%s%07d.sock",<br />
<span style="white-space: pre;"> </span>ROOT_PATH, LOCALNAME, i);<br />
<span style="white-space: pre;"> </span>unlink(ss[i]->addr.sun_path);<br />
<br />
<span style="white-space: pre;"> </span>rc = bind(ss[i]->fd, (struct sockaddr *)&ss[i]->addr, sizeof(ss[i]->addr));<br />
#endif<br />
<span style="white-space: pre;"> </span>if (rc) {<br />
<span style="white-space: pre;"> </span>snprintf(buf,sizeof(char)*BUFSIZ,"failed to bind(%s)",ss[i]->addr.sun_path);<br />
<span style="white-space: pre;"> </span>perror(buf);<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<br />
<span style="white-space: pre;"> </span>rc = listen(ss[i]->fd, N_DEVICE);<br />
<span style="white-space: pre;"> </span>if (rc) {<br />
<span style="white-space: pre;"> </span>snprintf(buf,sizeof(char)*BUFSIZ,"failed to listen(%s)",ss[i]->addr.sun_path);<br />
<span style="white-space: pre;"> </span>perror(buf);<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<br />
#ifdef __linux__<br />
<span style="white-space: pre;"> </span>memset(&ev, 0, sizeof(struct epoll_event));<br />
<span style="white-space: pre;"> </span>ev.events = EPOLLIN;<br />
<span style="white-space: pre;"> </span>ev.data.fd = ss[i]->fd;<br />
<span style="white-space: pre;"> </span>epoll_ctl(epfd, EPOLL_CTL_ADD, ss[i]->fd, &ev);<br />
#else<br />
<span style="white-space: pre;"> </span>FD_SET(ss[i]->fd,&rd_set_orig);<br />
#endif<br />
<span style="white-space: pre;"> </span>printf("listen %s/%s%07d.sock\n", ROOT_PATH, LOCALNAME, i);<br />
<span style="white-space: pre;"> </span>}<br />
<br />
<span style="white-space: pre;"> </span>for(i=0;i<(MAX_SOCKET_CONN - N_DEVICE);i++) {<br />
<span style="white-space: pre;"> </span>cs[i] = (struct c_socket_t *)malloc(sizeof(struct c_socket_t));<br />
<span style="white-space: pre;"> </span>if(!cs[i]) {<br />
<span style="white-space: pre;"> </span>perror("cs[] = malloc()");<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>memset(cs[i], 0, sizeof(struct c_socket_t));<br />
<span style="white-space: pre;"> </span>cs[i]->fd = -1;<br />
<span style="white-space: pre;"> </span>}<br />
<br />
<span style="white-space: pre;"> </span>while(1) {<br />
#ifdef __linux__<br />
<span style="white-space: pre;"> </span>num_fd = epoll_wait(epfd, events, MAX_SOCKET_CONN, EPOLL_WAIT);<br />
<span style="white-space: pre;"> </span>for(i=0;i<num_fd;i++) {<br />
<span style="white-space: pre;"> </span>n=1;<br />
<span style="white-space: pre;"> </span>for (j = 0; j < N_DEVICE; j++) {<br />
<span style="white-space: pre;"> </span>if (events[i].data.fd == ss[j]->fd) {<br />
<span style="white-space: pre;"> </span>for(k=0;k<(MAX_SOCKET_CONN - N_DEVICE);k++) {<br />
<span style="white-space: pre;"> </span>if(cs[k]->fd == -1) {<br />
<span style="white-space: pre;"> </span>break;<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>if(k == (MAX_SOCKET_CONN - N_DEVICE)) {<br />
<span style="white-space: pre;"> </span>printf("exceeded maximum fd(%d) for accept()", MAX_SOCKET_CONN - N_DEVICE);<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>else {<br />
<span style="white-space: pre;"> </span>len = sizeof(cs[k]->addr);<br />
<span style="white-space: pre;"> </span>cs[k]->fd = accept(ss[j]->fd, (struct sockaddr *)&cs[k]->addr, &len);<br />
<span style="white-space: pre;"> </span>if (cs[k]->fd != -1 ) {<br />
<span style="white-space: pre;"> </span>cs[k]->id = j;<br />
<span style="white-space: pre;"> </span>fcntl_flag = fcntl(cs[k]->fd, F_GETFL, 0);<br />
<span style="white-space: pre;"> </span>fcntl(cs[k]->fd, F_SETFL, fcntl_flag | O_NONBLOCK);<br />
<span style="white-space: pre;"> </span>memset(&ev, 0, sizeof(struct epoll_event));<br />
<span style="white-space: pre;"> </span>ev.events = EPOLLIN;<br />
<span style="white-space: pre;"> </span>ev.data.fd = cs[k]->fd;<br />
<span style="white-space: pre;"> </span>epoll_ctl(epfd, EPOLL_CTL_ADD, cs[k]->fd, &ev);<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>n = 0;<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>if(n) {<br />
<span style="white-space: pre;"> </span>for(j=0;j<(MAX_SOCKET_CONN - N_DEVICE);j++) {<br />
<span style="white-space: pre;"> </span>if ( events[i].data.fd == cs[j]->fd ) {<br />
<span style="white-space: pre;"> </span>memset(socket_buf, 0, sizeof(char)*SOCKET_BUF);<br />
<span style="white-space: pre;"> </span>rc = read(cs[j]->fd,(char *)socket_buf,SOCKET_BUF);<br />
<span style="white-space: pre;"> </span>if(rc > 0) {<br />
<span style="white-space: pre;"> </span>p = socket_buf;<br />
<span style="white-space: pre;"> </span>cloud_id = *p++;<br />
<span style="white-space: pre;"> </span>sub_id = *p++;<br />
<span style="white-space: pre;"> </span>pl = (unsigned char)*p++;<br />
<span style="white-space: pre;"> </span>ph = (unsigned char)*p++;<br />
<span style="white-space: pre;"> </span>for(m=0;m<MD5_DIGEST_LENGTH;m++)<br />
<span style="white-space: pre;"> </span>md5[m] = (unsigned char)*p++;<br />
<span style="white-space: pre;"> </span>for(m=0; m<MD5_DIGEST_LENGTH;m++)<br />
<span style="white-space: pre;"> </span>snprintf(hash + m + m, sizeof(char)*3, "%.2x", md5[m]);<br />
<span style="white-space: pre;"> </span>topic_size = (u_int16_t)((ph & 0x00ff) * 256 + (pl & 0x00ff));<br />
<span style="white-space: pre;"> </span>topic_p = topic;<br />
<span style="white-space: pre;"> </span>for(m=0;m<topic_size;m++)<br />
<span style="white-space: pre;"> </span>*topic_p++ = *p++;<br />
<span style="white-space: pre;"> </span>*topic_p = 0x00;<br />
<span style="white-space: pre;"> </span>msg_buf_p = msg_buf;<br />
<span style="white-space: pre;"> </span>while(*p != 0x00)<br />
<span style="white-space: pre;"> </span>*msg_buf_p++ = *p++;<br />
<span style="white-space: pre;"> </span>*msg_buf_p = 0x0;<br />
<span style="white-space: pre;"> </span>printf("subscrib: topic_size=%d topic=%s payload=%s md5=%s\n",<br />
<span style="white-space: pre;"> </span>topic_size, topic, msg_buf, hash);<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>epoll_ctl(epfd, EPOLL_CTL_DEL, cs[j]->fd, &ev);<br />
<span style="white-space: pre;"> </span>shutdown(cs[j]->fd,SHUT_RDWR);<br />
<span style="white-space: pre;"> </span>close(cs[j]->fd);<br />
<span style="white-space: pre;"> </span>cs[j]->fd = -1;<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
#else<br />
<span style="white-space: pre;"> </span>timeout.tv_sec = SELECT_TIMEOUT;<br />
<span style="white-space: pre;"> </span>timeout.tv_usec = SELECT_UTIMEOUT;<br />
<br />
<span style="white-space: pre;"> </span>memcpy(&rd_set,&rd_set_orig,sizeof(rd_set_orig));<br />
<br />
<span style="white-space: pre;"> </span>if(select(FD_SETSIZE,&rd_set,(fd_set *)NULL,(fd_set *)NULL,&timeout) == -1) {<br />
<span style="white-space: pre;"> </span>perror("select()");<br />
<span style="white-space: pre;"> </span>exit(1);<br />
<span style="white-space: pre;"> </span>}<br />
<br />
<span style="white-space: pre;"> </span>for(i=0;i<FD_SETSIZE;i++) {<br />
<span style="white-space: pre;"> </span>if(FD_ISSET(i, &rd_set)) {<br />
<span style="white-space: pre;"> </span>n=1;<br />
<span style="white-space: pre;"> </span>for(j=0;j<N_DEVICE;j++) {<br />
<span style="white-space: pre;"> </span>if ( i == ss[j]->fd ) {<br />
<span style="white-space: pre;"> </span>for(k=0;k<(MAX_SOCKET_CONN - N_DEVICE);k++) {<br />
<span style="white-space: pre;"> </span>if(cs[k]->fd == -1) {<br />
<span style="white-space: pre;"> </span>break;<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>if(k == (MAX_SOCKET_CONN - N_DEVICE)) {<br />
<span style="white-space: pre;"> </span>printf("exceeded maximum fd(%d) for accept()", MAX_SOCKET_CONN);<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>else {<br />
<span style="white-space: pre;"> </span>len = sizeof(cs[k]->addr);<br />
<span style="white-space: pre;"> </span>cs[k]->fd = accept(i, (struct sockaddr *)&cs[k]->addr, &len);<br />
<span style="white-space: pre;"> </span>if (cs[k]->fd != -1 ) {<br />
<span style="white-space: pre;"> </span>setsockopt(cs[k]->fd, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(struct timeval));<br />
<span style="white-space: pre;"> </span>FD_SET(cs[k]->fd, &rd_set_orig);<br />
<span style="white-space: pre;"> </span>cs[k]->id = j;<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>n = 0;<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>if(n) {<br />
<span style="white-space: pre;"> </span>for(j=0;j<(MAX_SOCKET_CONN - N_DEVICE);j++) {<br />
<span style="white-space: pre;"> </span>if (i == cs[j]->fd ) {<br />
<span style="white-space: pre;"> </span>memset(socket_buf, 0, sizeof(char)*SOCKET_BUF);<br />
<span style="white-space: pre;"> </span>rc = read(i,(char *)socket_buf,SOCKET_BUF);<br />
<span style="white-space: pre;"> </span>if(rc > 0) {<br />
<span style="white-space: pre;"> </span>p = socket_buf;<br />
<span style="white-space: pre;"> </span>cloud_id = *p++;<br />
<span style="white-space: pre;"> </span>sub_id = *p++;<br />
<span style="white-space: pre;"> </span>pl = (unsigned char)*p++;<br />
<span style="white-space: pre;"> </span>ph = (unsigned char)*p++;<br />
<span style="white-space: pre;"> </span>for(m=0;m<MD5_DIGEST_LENGTH;m++)<br />
<span style="white-space: pre;"> </span>md5[m] = (unsigned char)*p++;<br />
<span style="white-space: pre;"> </span>for(m=0; m<MD5_DIGEST_LENGTH;m++)<br />
<span style="white-space: pre;"> </span>snprintf(hash + m + m, sizeof(char)*3, "%.2x", md5[m]);<br />
<span style="white-space: pre;"> </span>topic_size = (u_int16_t)((ph & 0x00ff) * 256 + (pl & 0x00ff));<br />
<span style="white-space: pre;"> </span>topic_p = topic;<br />
<span style="white-space: pre;"> </span>for(m=0;m<topic_size;m++)<br />
<span style="white-space: pre;"> </span>*topic_p++ = *p++;<br />
<span style="white-space: pre;"> </span>*topic_p = 0x00;<br />
<span style="white-space: pre;"> </span>msg_buf_p = msg_buf;<br />
<span style="white-space: pre;"> </span>while(*p != 0x00)<br />
<span style="white-space: pre;"> </span>*msg_buf_p++ = *p++;<br />
<span style="white-space: pre;"> </span>*msg_buf_p = 0x0;<br />
<span style="white-space: pre;"> </span>printf("subscrib: topic_size=%d topic=%s payload=%s md5=%s\n",<br />
<span style="white-space: pre;"> </span>topic_size, topic, msg_buf, hash);<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>shutdown(i,SHUT_RDWR);<br />
<span style="white-space: pre;"> </span>close(i);<br />
<span style="white-space: pre;"> </span>FD_CLR(i,&rd_set_orig);<br />
<span style="white-space: pre;"> </span>cs[j]->fd = -1;<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>}<br />
#endif<br />
<span style="white-space: pre;"> </span>}<br />
}<br />
<div>
<br /></div>
<div>
<br /></div>
</div>
<br />
<br />
<b><span style="font-size: large;">4.[補足] Cで記述したPD Repeaterへの上流方向へのデータ送信</span></b><br />
<hr color="#d0d0d0" size="1" />
他の記事で上流方向へデータを送信するカスタムハンドラについて記述していますが、FW3.xでの書き込み方法としては、以下のコードを参考にしてください。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC175"><table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC1"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>stdio.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC2"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>string.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC3"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>stdint.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC4"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>sys/types.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC5"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>sys/stat.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC6"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>sys/ioctl.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC7"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>fcntl.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC8"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>termios.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC9"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>unistd.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC10"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>time.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC11"></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC12"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>sys/socket.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC13"><span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>sys/un.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<span style="font-family: inherit;">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>errno.h<span class="pl-pds">></span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC176"><span class="pl-c"><span style="font-family: inherit;"><span class="pl-c"><br />/*</span> write data to unix domain socket <span class="pl-c">*/</span></span></span></td>
</tr>
<tr>
</tr>
</tbody></table>
<table class="highlight tab-size js-file-line-container" data-tab-size="8"><tbody>
<tr><td class="blob-code blob-code-inner js-file-line" id="LC177"><div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span style="font-family: inherit;">write_uds( uint8_t *jbuf
) {</span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> int uds, ret;<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> socklen_t socklen;<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> struct sockaddr_un addr;<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<br /></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> uds = socket(AF_UNIX, SOCK_STREAM, 0);<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> memset(&addr, 0, sizeof(addr));<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> addr.sun_family = AF_UNIX;<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> strcpy(addr.sun_path+1,
"/pd_repeater/</span>userdev_0000001<span style="font-family: inherit;">.sock");<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> socklen =
sizeof(sa_family_t) + strlen(addr.sun_path+1)+1;<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> ret = connect(uds, (struct sockaddr
*)&addr, socklen);<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<br /></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> if (ret < 0) {<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> int err = errno;<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> printf("connect NG (errno:
%d)\n", err);<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> close(uds);<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> return 1;<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> }<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> else {<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> printf("connect OK\n");<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> }<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> write(uds, jbuf, strlen(jbuf));<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> <o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="line-height: 115%;"><span style="font-family: inherit;"> close( uds );<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span style="font-family: inherit;"><span lang="ja" style="line-height: 115%;"> return 0</span><span lang="ja" style="font-size: 11pt; line-height: 115%;">;<o:p></o:p></span></span></div>
<div align="left" class="MsoNormal" style="line-height: 115%; margin-bottom: 10pt;">
<span lang="ja" style="font-size: 11pt; line-height: 115%;"><span style="font-family: inherit;">}</span></span></div>
</td></tr>
</tbody></table>
</div>
<br />
<b><span style="font-size: large;">5.さいごに</span></b><br />
<hr color="#d0d0d0" size="1" />
下流方向の制御に関して、PD Repeaterがクライアントであり、制御アプリケーションはサーバとしての実装が必要になります。<br />
<br />
また、WebUIに連動して、起動、停止を行うためには、プロセスを外部から制御する実装を行ってください。<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-20175597214879683062017-10-24T14:07:00.001+09:002017-10-25T14:29:30.831+09:00OpenBlocks IoTシリーズ 基本ソフトウェアにより提供されるPLCクライアント(Modbus)機能についてPLCクライアント(Modbus)機能は、OpenBlocks IoT 基本ソフトウェア2.12より大幅に機能追加されました。<br />
<br />
主として以下の項目があげられます。<br />
<br />
・データタイプとして、符号のありなし、データサイズ(16bit/32bit)、ビッグ/リトルエンディアンの設定を追加<br />
・データ取得の基準時刻の設定<br />
・CSVファイルを用いた取得PLC対象の拡張<br />
<br />
本機能の実装により、1入出力インタフェーズに対し、複数のデバイス、レジスタが割り付けられる場合に、基準時刻を指定してまとめてデータを取得することが可能となり,例えば、RS-485インタフェースに接続される複数のデバイスや、無線メッシュであるOKI SmartHopのRS-232C経由のmodbusペイロードなどでも、1つのデバイスインタフェースから複数個所のデータ(温度や電力データなど)を一定時間にまとめて取得出来るようになります。<br />
<br />
<span id="goog_674562707"></span><span id="goog_674562708"></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE_CBMJcA5zwd2WA3nBi6lpKVLx-F_pXKISQWXsfLOhyHpFdPI5O_O5Zz6R3LJFlb0NU_LxGQ0vu-3A-fJ1t3e4hNlJrnjFlxpd48S729bDCczKZqWPjfDxvS96OaF39h5Sb3mbfzr169j/s1600/A6217327-5881-48F4-B9D5-D9FEE38122D2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE_CBMJcA5zwd2WA3nBi6lpKVLx-F_pXKISQWXsfLOhyHpFdPI5O_O5Zz6R3LJFlb0NU_LxGQ0vu-3A-fJ1t3e4hNlJrnjFlxpd48S729bDCczKZqWPjfDxvS96OaF39h5Sb3mbfzr169j/s400/A6217327-5881-48F4-B9D5-D9FEE38122D2.JPG" width="400" /></a></div>
<br />
本機能はOpenBlocks IoTシリーズすべてのモデルで使用が可能です。ご利用の際は、2.12あるいは今後実施されるそれ以降のアップデートバージョンであることを確認してください。<br />
また、PLCとの接続には、対応したハードウェアインタフェースが必要となります。<br />
各モデル別に、標準もしくは標準オプションとして用意される接続は以下の通りです。 <br />
<ul>
<li>OpenBlocks EX1/VX1<br />イーサネット、Wifiによる有線/無線ネットワーク、RS-232C/RS-485によるシリアルインタフェースを標準搭載</li>
<li>OpenBlocks BX1/BX3(L)/BX5<br />Wifiでのネットワーク接続を標準搭載。有線ネットワーク接続にはオプションのUSB二股ケーブルにUSBネットワークアダプタ、RS232C/RS485接続には、オプションのRS232C二股ケーブル、RS-485二股ケーブルを使用</li>
<li>BX0<br />標準搭載のWifiとPoEケーブルによる、無線/優先のネットワーク接続<br /><br />(*) RS-485接続は2線式のみを標準もしくはオプション品にてサポート</li>
</ul>
<br />
今回は、本機能の設定方法について紹介します。<br />
内容に関しては、OpenBlocks IoTシリーズデータ収集ガイドからの抜粋となりますので、詳細に関しては以下のドキュメントをご参照ください。<br />
<br />
<ul style="-webkit-text-stroke-width: 0px; background-color: white; color: #555555; font-family: arial, helvetica, clean, sans-serif; font-size: 14px; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; list-style: none; margin: 0px; orphans: 2; padding: 0px; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<li style="margin: 0px; padding: 0px;"><a href="https://openblocks.plathome.co.jp/common/pdf/OpenBlocks_iot_emitter_Guide_v2.1.2_170822.pdf" style="color: #ee9500; text-decoration: none;">OpenBlocks IoT Family データ収集ガイド</a></li>
</ul>
<br />
<br />
<hr color="#d0d0d0" size="1" />
<h4>
・PLCクライアント(マスター)の設定方法</h4>
<br />
本機能は、OpenBlocks IoT Family から Modbus プロトコルを用いて PLC 機器のレジスタ、コイルもしくはステータスを用いて定期的に読み込む(ポーリングを行う)場合に用います。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxhVHwJ0drxnE4HSqp3Q-p32MDPQqiP9K2nDn9qno3aTK3cYCCheC70AX3n-JHJ_a3MG9Lp6WjvOP8sQz32N2aLzHsmy_dXbS3KbRQWfwF3WzsbLchEBiOU7wO_0cZ9PAcuroKi3jdLxjm/s1600/modbus-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="132" data-original-width="491" height="107" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxhVHwJ0drxnE4HSqp3Q-p32MDPQqiP9K2nDn9qno3aTK3cYCCheC70AX3n-JHJ_a3MG9Lp6WjvOP8sQz32N2aLzHsmy_dXbS3KbRQWfwF3WzsbLchEBiOU7wO_0cZ9PAcuroKi3jdLxjm/s400/modbus-1.png" width="400" /></a></div>
<br />
WEB UI の「サービス」→「基本」タブにおいて、「PD Handler PLC Client」 が「使用する」に設定されている場合、同タブの「取得<br />
PLC 対象数」に応じた入力フォームが表示されます。<br />
<br />
※「取得 PLC 対象」(PLC デバイス)とは、PLC 機器そのものではなく、対象となる PLC機器への接続方法の他、データを取得するため<br />
の「読込方法」や「読込開始アドレス」、「読込レジスタ数」等の設定の組み合わせを意図します。<br />
PLC デバイス毎に送信対象項目にて”送信する”を選択すると、PLC デバイスの送信設定の詳細を設定できます。<br />
<br />
<div style="text-align: center;">
※「使用プロトコル」としてModbus TCP(ネットワーク)を選択した場合の表示</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEcF0GbFcGlxdpuyyYFrUvVY5PCRwF0Y0e04Ejr7H4b45yqZSGwBBUXinWt-X_rEbhQevxhpLpr0P2qr0rUglCVBqiRnOfcS6XTSUsK1-koIiF4DzER7dsXeLhQX-peJMMnMkTOh8EXRQr/s1600/modbus-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="455" data-original-width="567" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEcF0GbFcGlxdpuyyYFrUvVY5PCRwF0Y0e04Ejr7H4b45yqZSGwBBUXinWt-X_rEbhQevxhpLpr0P2qr0rUglCVBqiRnOfcS6XTSUsK1-koIiF4DzER7dsXeLhQX-peJMMnMkTOh8EXRQr/s320/modbus-2.png" width="320" /></a></div>
<br />
<div style="text-align: center;">
※「使用プロトコル」としてModbus RTUを選択した場合の表示</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvGNJcv_z1fQKLHgfd5KsocA2szkXy3NpgXmbgA7M64USiszz7lOsu-QM6l1d9T5L-paY6J3dYyQVyk2pnqkn9aZ87sgd-NqJ0j4aW-l9-hveIVApcSVlduyLgsQir1nQJwWvYNbdtcNqj/s1600/modbus-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="534" data-original-width="553" height="309" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvGNJcv_z1fQKLHgfd5KsocA2szkXy3NpgXmbgA7M64USiszz7lOsu-QM6l1d9T5L-paY6J3dYyQVyk2pnqkn9aZ87sgd-NqJ0j4aW-l9-hveIVApcSVlduyLgsQir1nQJwWvYNbdtcNqj/s320/modbus-3.png" width="320" /></a></div>
<br />
<br />
”送信する”を選択した場合には、左のように各項目が表示されます。<br />
<br />
デバイス番号:<br />
OpenBlocks IoT Family の WEB UI 内で管理している番号です。変更はできません。<br />
<br />
ユーザーメモ:<br />
PLC デバイスにデータに付加する任意の文字列を設定します。データを処理する際の識別子等に利用して下さい。<br />
<br />
読込方法:<br />
「レジスタ」(レジスタ出力)、「入力レジスタ」(レジスタ入力)、「コイル」(ディジタル出力)、「入力ステータス」(ディジタル入力)から選択します。<br />
「コイル」または「入力ステータス」を選んだ場合は、”0”または”1”の並びが出力されます。<br />
<br />
データタイプ:<br />
読込方法を「レジスタ」、「入力レジスタ」を選択した際に、出力のデータタイプを以下から選択します。<br />
<br />
・符号なし 16 ビット整数<br />
・符号付き 16 ビット整数<br />
・符号なし 32 ビット整数/リトルエンディアン<br />
・符号付き 32 ビット整数/リトルエンディアン<br />
・符号なし 32 ビット整数/ビッグエンディアン<br />
・符号付き 32 ビット整数/ビッグエンディアン<br />
<br />
読込開始アドレス:<br />
読み込みたいデータが格納されている PLC 機器上の開始アドレスを設定します。<br />
<br />
読込レジスタ数:<br />
「読込方法」として「コイル」または「入力ステータス」は、読み込まれるビット数と解釈されます。<br />
「開始アドレス」に設定されるアドレスから読み込むレジスタ数もしくビット数を設定します。<br />
<br />
<br />
取得時間間隔[sec]:<br />
PLC デバイスからデータを取得する時間間隔を数字で設定します。単位は秒です<br />
後述の基準時刻制御を使用する場合、時間間隔は以下の値へと内部的に変更されます。<br />
<br />
・86400[sec]使整数倍<br />
・43200[sec]<br />
・28800[sec]<br />
・21600[sec]<br />
・14400[sec]<br />
・10800[sec]<br />
・7200[sec]<br />
・3600[sec]<br />
・1800[sec]<br />
・900[sec]<br />
・60[sec]<br />
<br />
基準時刻制御:<br />
毎日定時にデータを取得する場合、本機能を有効とし基準時刻を設定しください。<br />
<br />
基準時刻:<br />
定時にデータを取得する際の基準時刻を設定します。HH:MM 形式となります。<br />
<br />
タイムアウト[msec]:<br />
PLC デバイスからデータを取得する際のタイムアウトを設定します。単位はミリ秒です。<br />
<br />
使用プロトコル:<br />
「Modbus TCP」、「Modbus RTU」のいずれかを選択します。<br />
「Modbus TCP」はネットワーク、「ModbusRTU」はシリアルです。<br />
<br />
ユニット ID:<br />
PLC 機器の Modbus ユニット ID を設定します。ユニット ID は、1~247 または 255 の数値です。<br />
<br />
<br />
PLC 接続アドレス(Modbus TCP)<br />
接続する PLC 機器の IP アドレスを設定します。<br />
<br />
PLC 接続ポート(Modbus TCP)<br />
接続する PLC 機器の TCP ポート番号を設定します。 デフォルト値は、502 です。<br />
<br />
読込デバイスファイル(ModbusRTU)<br />
PLC 機器を接続するシリアルポートのデバイスファイル名を設定します。<br />
<br />
ボー・レート(Modbus シリアル):<br />
PLC 機器を接続するシリアルポートのボー・レートを選択します。<br />
<br />
パリティビット(Modbus シリアル):<br />
PLC 機器を接続するシリアルポートのパリティビットを選択します。<br />
<br />
データビット(Modbus シリアル):<br />
PLC 機器を接続するシリアルポートのデータビット数を選択します。<br />
<br />
ストップビット(Modbus シリアル):<br />
PLC 機器を接続するシリアルポートのストップビット数を選択します。<br />
<br />
送信先設定:<br />
“使用する”を選択した送信先に対してチェックボックスが選択できるようになります。<br />
チェックを付けたクラウド等に対して、送信を行います。<br />
<br />
<br />
デバイス ID サフィックス(PD):<br />
PD Exchange に送信する際のデバイス ID のサフィックスを設定します。<br />
<br />
クライアント ID (AWSIoT):<br />
AWSIoTに送信する際のクライアント ID を設定します。Thing Shadows を使用する場合、クライアント ID が Thing Name となります。<br />
<br />
Thing Shadows(AWSIoT):<br />
AWSIoT に送信する際の Thing Shadows を使用するかの設定を選択します。<br />
<br />
トピック名(AWSIoT):<br />
AWSIoT に送信する際のトピックを設定します。Thing Shadows を使用する場合、トピックはクライアントIDをThing Nameとして自動生成されます。<br />
<br />
証明書(AWSIoT):<br />
AWSIoT に送信する際に使用するデバイスの証明書を設定します。<br />
<br />
プライベートキー(AWSIoT):<br />
AWSIoT に送信する際に使用するデバイスのプライベートキーを設定します。<br />
<br />
デバイスタイプ(Watson IoT/Device):<br />
Watson IoT(Device)に送信する際のデバイスタイプを設定します。<br />
<br />
デバイス ID(Watson IoT/Device):<br />
Watson IoT(Device)に送信する際のデバイスID を設定します。<br />
<br />
パスワード(Watson IoT/Device):<br />
Watson IoT(Device)に送信する際のパスワードを設定します。<br />
<br />
デバイスタイプ(Watson IoT/Gateway):<br />
Watson IoT(Gateway)に送信する際のデバイスタイプを設定します。<br />
<br />
<br />
デバイス ID(Watson IoT/Gateway):<br />
Watson IoT(Gateway)に送信する際のデバイス ID を設定します。<br />
<br />
Event hubs 名:<br />
Event hubs に送信する際の Event hubs 名を設定します。<br />
<br />
SAS ポリシー:<br />
Event hubs に送信する際の SAS ポリシーを設定します。<br />
<br />
SAS キー:<br />
Event hubs に送信する際の SAS キーを設定します。<br />
<br />
デバイス ID(IoT Hub):<br />
IoT Hubに送信する際のデバイス ID を設定します。<br />
<br />
デバイスキー(IoT Hub):<br />
IoT Hub に送信する際のデバイスキーを設定します。<br />
<br />
Gatway Name(T4D):<br />
Toami for docomo に送信する際に用いるGateway Name を設定します。<br />
<br />
App key(T4D):<br />
Toami for docomo に送信する際に用いる AppKey を設定します。<br />
<br />
イベントタイプ(IoT デバイスハブ):<br />
IoT デバイスハブ(Nifty)に送信する際に用いるイベントタイプを設定します。<br />
<br />
デバイス ID(IoT デバイスハブ):<br />
IoT デバイスハブ(Nifty)に送信する際に用いるデバイス ID を設定します。<br />
<br />
API キー(IoT デバイスハブ):<br />
IoT デバイスハブ(Nifty)に送信する際に用いる API キーを設定します。<br />
<br />
ユニーク ID (MQTT):<br />
MQTT サーバに送信する際のユニーク ID を設定します。ユニーク ID は、トピックのサフ<br />
ィックスとして扱われます。トピックのプレフィックスは、MQTT サーバに設定されるトピ<br />
ックプレフィックスです。プレフィックスとサフィックスの間は '/' で区切られ送信されます。<br />
<br />
※一部を除くクラウドに紐付く設定情報は編集ボタンにより編集可能になります。既存の<br />
デバイス不良等の差し替え時に以前のものと同様に扱う為に設定を同一にすることを推奨<br />
します。(不良となったデバイスは送信対象設定を“送信しない”へ変更してください。)<br />
※証明書及びプライベートキーはシステム→ファイル管理タブからアップロードしてくだ<br />
さい。<br />
<br />
<h4>
・CSV ファイルを用いた「取得 PLC 対象」の拡張</h4>
<br />
/var/webui/upload_dir ディレクトリに pd-handler-plc-client.csv というファイル名の CSVファイルを置くことで、WEB UI 管理にて割り当てされた 1 デバイス番号に対して複数の「取得 PLC 対象」を割り当てることが可能です。<br />
尚、pd-handler-plc-client.csv ファイルは WEB UI の「システム」→「ファイル管理」タブのアップロード機能により置くことが可能です。<br />
また、CSV ファイルの書式は、次の通りです。<br />
<br />
デバイス番号,ユニット ID,読込方式,データタイプ,読込開始アドレス,読込レジスタ数<br />
<br />
※行の先頭が#または/の場合、コメント行として扱います。<br />
※CSV 内の”等での動作は保証いたしません。<br />
<br />
<table border="0" cellpadding="0" cellspacing="0" style="-webkit-text-stroke-width: 0px; border-collapse: collapse; font-family: Meiryo; letter-spacing: normal; orphans: 2; table-layout: fixed; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; widows: 2; width: 548px; word-spacing: 0px;"><colgroup><col style="width: 88pt;" width="117"></col><col style="width: 81pt;" width="108"></col><col style="width: 122pt;" width="162"></col><col style="width: 121pt;" width="161"></col></colgroup><tbody>
<tr height="18" style="height: 13.5pt;"><td class="xl67" height="18" style="background: rgb(184, 204, 228); border: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap; width: 88pt;" width="117">パラメタ</td><td class="xl67" style="background: rgb(184, 204, 228); border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap; width: 81pt;" width="108">データの<ruby>形式</ruby></td><td class="xl68" colspan="2" style="background: rgb(184, 204, 228); border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: center; text-decoration: none; vertical-align: middle; white-space: nowrap; width: 243pt;" width="323"><ruby>説明</ruby></td></tr>
<tr height="65" style="height: 48.75pt;"><td class="xl65" height="65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: 0.5pt solid windowtext; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 48.75pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">デバイス<ruby>番号</ruby></td><td class="xl65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>半角</ruby><ruby>英数字</ruby></td><td class="xl66" colspan="2" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: normal; width: 243pt;" width="323">WEB UIにより<ruby>割</ruby>り<ruby>振</ruby>れたデバイス<ruby>番号</ruby>を<ruby>記載</ruby>します<br />
WEB UIに<ruby>設定</ruby>されていないデバイス<ruby>番号</ruby>は<ruby>無視</ruby>されます</td></tr>
<tr height="51" style="height: 38.25pt;"><td class="xl65" height="51" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: 0.5pt solid windowtext; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 38.25pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">ユニット<ruby>番号</ruby></td><td class="xl65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>半角</ruby><ruby>英数字</ruby></td><td class="xl66" colspan="2" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: normal; width: 243pt;" width="323">PLC<ruby>機器</ruby>のModbusユニットIDを<ruby>設定</ruby>します。<br />
ユニットIDは、1~247 または 255 を<ruby>記載</ruby>します。</td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl65" height="108" rowspan="6" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: 0.5pt solid windowtext; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 81pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>読</ruby>み<ruby>込</ruby>み<ruby>方式</ruby></td><td class="xl65" rowspan="6" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: 0.5pt solid windowtext; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>半角</ruby><ruby>英数字</ruby></td><td class="xl65" colspan="2" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>読込</ruby><ruby>方式</ruby>として、<ruby>以下</ruby>のいずれかを<ruby>記載</ruby>します</td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl67" height="18" style="background: rgb(184, 204, 228); border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>設定</ruby><ruby>内容</ruby></td><td class="xl67" style="background: rgb(184, 204, 228); border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">Web UI<ruby>表記</ruby></td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl65" height="18" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">bits</td><td class="xl65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">コイル</td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl65" height="18" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">input_bits</td><td class="xl65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>入力</ruby>ステータス</td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl65" height="18" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">register</td><td class="xl65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">レジスタ</td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl65" height="18" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">input_register</td><td class="xl65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>入力</ruby>レジスタ</td></tr>
<tr height="57" style="height: 42.75pt;"><td class="xl65" height="255" rowspan="8" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: 0.5pt solid windowtext; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 191.25pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">データタイプ</td><td class="xl65" rowspan="8" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: 0.5pt solid windowtext; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>半角</ruby><ruby>英数字</ruby></td><td class="xl66" colspan="2" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: normal; width: 243pt;" width="323">データタイプとして<ruby>以下</ruby>を<ruby>設定</ruby>してください<br />
なお、<ruby>読込</ruby><ruby>方式</ruby>を"bits"または"input_bits"を<ruby>設定</ruby>した<ruby>場合</ruby>、<ruby>本</ruby>カラムは<ruby>無視</ruby>されます</td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl67" height="18" style="background: rgb(184, 204, 228); border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>設定</ruby><ruby>内容</ruby></td><td class="xl67" style="background: rgb(184, 204, 228); border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">WEB UI<ruby>表記</ruby></td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl65" height="18" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">u_int16</td><td class="xl65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>符号</ruby>なし16ビット<ruby>整数</ruby></td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl65" height="18" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">int16</td><td class="xl65" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>符号</ruby><ruby>付</ruby>き16ビット<ruby>整数</ruby></td></tr>
<tr height="36" style="height: 27pt;"><td class="xl65" height="36" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 27pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">u_int32lsb</td><td class="xl69" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-decoration: none; vertical-align: middle; white-space: normal; width: 121pt;" width="161"><ruby>符号</ruby>なし32ビット<ruby>整数</ruby><br />
リトルエイディアン</td></tr>
<tr height="36" style="height: 27pt;"><td class="xl65" height="36" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 27pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">int32lsb</td><td class="xl69" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-decoration: none; vertical-align: middle; white-space: normal; width: 121pt;" width="161"><ruby>符号</ruby><ruby>付</ruby>き32ビット<ruby>整数</ruby><br />
リトルエイディアン</td></tr>
<tr height="36" style="height: 27pt;"><td class="xl65" height="36" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 27pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">u_int32msb</td><td class="xl69" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-decoration: none; vertical-align: middle; white-space: normal; width: 121pt;" width="161"><ruby>符号</ruby>なし32ビット<ruby>整数</ruby><br />
ビッグエイディアン</td></tr>
<tr height="36" style="height: 27pt;"><td class="xl65" height="36" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 27pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;">int32msb</td><td class="xl69" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-decoration: none; vertical-align: middle; white-space: normal; width: 121pt;" width="161"><ruby>符号</ruby><ruby>付</ruby>き32ビット<ruby>整数</ruby><br />
ビッグエイディアン</td></tr>
<tr height="60" style="height: 45pt;"><td class="xl70" height="60" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: 0.5pt solid windowtext; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 45pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>読込</ruby><ruby>開始</ruby>アドレス</td><td class="xl70" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>半角</ruby><ruby>英数字</ruby></td><td class="xl66" colspan="2" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: normal; width: 243pt;" width="323"><ruby>読</ruby>み<ruby>込</ruby>みたいデータが<ruby>格納</ruby>されているPLC<ruby>機器</ruby><ruby>上</ruby>の<ruby>開始</ruby>アドレスを<ruby>設定</ruby>します。<ruby>先頭</ruby>が"0x"の<ruby>場合</ruby>は16<ruby>進数</ruby>と<ruby>解釈</ruby>されます</td></tr>
<tr height="18" style="height: 13.5pt;"><td class="xl70" height="18" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: 0.5pt solid windowtext; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; height: 13.5pt; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>読込</ruby>レジスタ<ruby>数</ruby></td><td class="xl70" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: none; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>半角</ruby><ruby>数字</ruby></td><td class="xl65" colspan="2" style="border-bottom: 0.5pt solid windowtext; border-image: initial; border-left: none; border-right: 0.5pt solid windowtext; border-top: 0.5pt solid windowtext; color: black; font-family: "MS Pゴシック", monospace; font-size: 11pt; font-style: normal; font-weight: 400; padding-left: 1px; padding-right: 1px; padding-top: 1px; text-align: left; text-decoration: none; vertical-align: middle; white-space: nowrap;"><ruby>読</ruby>み<ruby>込</ruby>みたいレジスタ<ruby>数</ruby>を<ruby>記載</ruby>します。</td></tr>
</tbody></table>
<br />
<br />
・記載例<br />
<br />
#localname,unit_id,read_function,data_type,read_addr,read_registers<br />
device_plc_client_0000001,15,bits,u_int16,0x130,37<br />
device_plc_client_0000001,15,input_bits,u_int16,0x1c4,22<br />
device_plc_client_0000001,15,registers,u_int16,0x160,3<br />
device_plc_client_0000001,16,input_registers,u_int32lsb,0x108,1<br />
device_plc_client_0000002,17,bits,u_int16,0x130,37<br />
device_plc_client_0000002,18,input_bits,u_int16,0x1c4,22<br />
device_plc_client_0000002,19,registers,int16,0x160,3<br />
device_plc_client_0000002,20,input_registers,int32lsb,0x108,1<br />
device_plc_client_0000003,30,bits,u_int16,0x130,37<br />
device_plc_client_0000003,30,input_bits,u_int16,0x1c4,22<br />
device_plc_client_0000003,31,registers,u_int16,0x160,3<br />
device_plc_client_0000003,31,input_registers,u_int32msb,0x108,1<br />
device_plc_client_0000004,32,bits,u_int16,0x130,37<br />
46/80<br />
device_plc_client_0000004,32,input_bits,u_int16,0x1c4,22<br />
device_plc_client_0000004,33,registers,int16,0x160,3<br />
device_plc_client_0000004,33,input_registers,int32msb,0x108,1<br />
<br />
CSV ファイルに定義したデバイス番号の「取得 PLC 対象」は、WEB UI の設定内容(CSVの定義内容)は破棄され、CSV ファイルの内容が使用されます。そのため、CSV ファイルに定義したデバイス番号の設定ついては、1 デバイス番号として取得対象とする全ての「取得PLC 対象」を記載してください。<br />
<br />
<hr color="#d0d0d0" size="1" />
<h4>
最後に</h4>
<br />
今回の機能強化は、ビルや、工場などでの環境測定や、機器データの取得に際し、必要と思われるものをほぼ実装した形となります。<br />
当社IDMアプライアンスなどと合わせてご利用いただき、環境測定やモニタリングシステムの構築に役立てていただければと思います。Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com1tag:blogger.com,1999:blog-3189805224875557512.post-59924900673023505772017-06-23T14:34:00.000+09:002017-06-23T17:11:08.588+09:00[.tested][IoT] Omron ヒューマンビジョンコンポ (HVC-P2) 評価用カスタムハンドラOmron HVC-P2は、<span style="font-weight: normal;">人の状態を認識できる画像センサモジュールです。</span><br />
<span style="font-weight: normal;"></span><br />
<br />
<a href="http://plus-sensing.omron.co.jp/product/hvc-p2.html" target="_blank">HVC-P2|HVC(Human Vision Components )シリーズ|製品ラインナップ|オムロン人画像センシングサイト:+SENSING</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://plus-sensing.omron.co.jp/product/hvc-p2.html" target="_blank"><img alt="SwapImage" src="http://plus-sensing.omron.co.jp/product/images/product-slide05-img01.png" height="258" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI6nypkz6atI6RLQ-PbQgbPWZm0Zc5pUTYsLdJLkdXLzCjNj5-0ZgS53kqUkRE_jxKGFnx1zDEphHmErX1UT-8DQR5RyP9yn7yXGVtsIqncmnLhL39WbKhrx1vBVMXl2YRPcWsfNCLp9Rf/s1600/HVC-P2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI6nypkz6atI6RLQ-PbQgbPWZm0Zc5pUTYsLdJLkdXLzCjNj5-0ZgS53kqUkRE_jxKGFnx1zDEphHmErX1UT-8DQR5RyP9yn7yXGVtsIqncmnLhL39WbKhrx1vBVMXl2YRPcWsfNCLp9Rf/s400/HVC-P2.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
OpenBlocks IoT BX1/EX1/VX1 基本ソフトウェア Ver2.11 / kernel 3.10.17-poky-edison<br />
<br />
githubに評価用ソースコードをcommitしましたので、ご利用ください。<br />
本コードは、IoT基本ソフトウェア向けのカスタムハンドラとして動作します。<br />
ユーザハンドラを定義して、WebUIにて送信先などの設定を行ってください。<br />
すでに別のカスタムハンドラをご利用の場合は、ソースコードのunix domain socket名を変更する必要があります。<br />
<br />
<a href="https://github.com/goto2048/hvcp2_for_openblocksiot">https://github.com/goto2048/hvcp2_for_openblocksiot</a><br />
<br />
<br />
・注意点<br />
<br />
OpenBlocks IoT BX1で使用する場合、内蔵のモデムが/dev/ttyACM0から始まるモデムデバイスとなります。<br />
HVC P2も同様にttyACMxxというデバイスとして認識されるため、udev等で/dev/ttyACM7に固定しないと、本デバイスが先に認識されてしまう関係上、3G通信が出来なくなる可能性があります。<br />
それぞれdmesgでデバイス名の確認をし、ソースコード上のSERIAL_PORTの定義を変更してください。 <br />
<br />
<br />
顔認識の最大数は35ですが、35人分のJSONデータは基本ソフトウェアの機能で送信出来るペイロードのサイズ(4KB)を超えますので、適宜、最大数を設定する/定義したkey名を短くするなどのパッチをソースコードに当ててください。<br />
<br />
評価用として、gotoがquick hackしたものですので、未サポートとなります。<br />
<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-57870961021253738502016-08-26T16:37:00.000+09:002016-08-26T16:46:53.053+09:00OpenBlocks IoT シリーズのAzure Event Hubへの接続について<br />
前回、Azure IoT Hubへの接続の手順、および、Stream Analytics jobを経由したPower BIへのデータの受け渡し手順について、解説しました。<br />
今回は、IoT Hubではなく、Event Hubへ接続する方法について簡単に説明します。<br />
なお、全体の流れは前回の作業に沿って行ったものですので、WebUIでのデバイスの登録や、Stream Analytics、PowerBIの設定についての詳細な説明は行いません。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBPnTY8bLlBRSn1s58LLXP7QooNAA00xj6700UWwT5FunQgBTdcBJRtjsyuDGxJr-NihgOtI7nRM3lgh6aaXv3bAwXn-zWIyoWhIn_3V4_hdjY0uXHiVELZ04sYeF3tQ_qZZhXVyNrhx4e/s1600/azure_event_hub.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBPnTY8bLlBRSn1s58LLXP7QooNAA00xj6700UWwT5FunQgBTdcBJRtjsyuDGxJr-NihgOtI7nRM3lgh6aaXv3bAwXn-zWIyoWhIn_3V4_hdjY0uXHiVELZ04sYeF3tQ_qZZhXVyNrhx4e/s400/azure_event_hub.jpg" width="400" /></a></div>
<br />
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
<span style="font-family: inherit;"><span style="font-size: small;">ゲートウェイ</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;"> OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;"> </span></span><span style="font-family: inherit;"><span style="font-size: small;">IIJmio 高速モバイル/D SIM</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;">センサー</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;"> <b><span style="background-color: white; color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; word-spacing: 0px;">FWM8BLZ02A-109047</span></b><span style="background-color: white; color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; word-spacing: 0px;"> 温度/3軸加速度センサービーコン (BLE)</span></span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;">クラウド</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;"> Microsoft Azure </span></span><br />
<br />
<b><span style="font-size: large;">2.Microsoft Azure Event Hubのデプロイと設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Azureアカウントにサインインし、新規メニューより、Event Hubを検索します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2vgqnnKZc00aDO5ueqax7ry3sJD-nPmoR6dw8T9mYh2Dn44h9zvML1Qbuh3ZHxfU0Am1aoyBO8XOS3jPYlXbPTsh72av4Dq8beKbKfr8WNmrkt9QklfIsD1mskireVhziB2OOowktDyHc/s1600/event-hub-01.png" imageanchor="1"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2vgqnnKZc00aDO5ueqax7ry3sJD-nPmoR6dw8T9mYh2Dn44h9zvML1Qbuh3ZHxfU0Am1aoyBO8XOS3jPYlXbPTsh72av4Dq8beKbKfr8WNmrkt9QklfIsD1mskireVhziB2OOowktDyHc/s400/event-hub-01.png" width="400" /></a><br />
<br />
Event Hubを選択し、作成を押しすと、旧ポータルへ飛ばされますので、今回はそのまま旧ポータルで作業を行います。<br />
IoTハブ名など、この先でリソース名として受け渡す可能性のあるものには"-"をつけないことをお勧めします。<br />
例えば、Stream Analytics jobのクエリの記述パネルでは"-"は使用できません。<br />
<br />
今回の設定例は以下の通り。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
イベントハブ名<br />
obsevhub<br />
リージョン<br />
東日本</div>
<br />
名前空間は自動で入力されます。 obsevhubというハブ名の場合は、obsevhub-nsとなります。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitbfPaLYmLlAtI1mUzyfblhtXRaalbR8sCQjcHJgQlLic4AVrnoh0Awjyp0Ji4bTqO4xjmFio1EQNWM2vX_XJuF4s9L3al4EDRaqdzBuR7x6JAnh8sMwLMfQ08rtGKoq7pDlLsbvd4Hw8T/s1600/event-hub-02.png" imageanchor="1"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitbfPaLYmLlAtI1mUzyfblhtXRaalbR8sCQjcHJgQlLic4AVrnoh0Awjyp0Ji4bTqO4xjmFio1EQNWM2vX_XJuF4s9L3al4EDRaqdzBuR7x6JAnh8sMwLMfQ08rtGKoq7pDlLsbvd4Hw8T/s400/event-hub-02.png" width="400" /></a><br />
<br />
作成が終わって以下の画面から、作成したEvent Hub名をクリックします。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT8OYTZ_p96VEUJRmTlOpoJW75HVSlcfc06i6LSJTqFJY_KOtMSyLYM0BcadauZ1YvrWZ7S6GcI37GsTK_BYhMCR_vb-Key9r18tgY3CTcgoXXe8lYQL6FZDsmF_RZ3JAKoe6kOqts5u_g/s1600/event-hub-03.png" imageanchor="1"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT8OYTZ_p96VEUJRmTlOpoJW75HVSlcfc06i6LSJTqFJY_KOtMSyLYM0BcadauZ1YvrWZ7S6GcI37GsTK_BYhMCR_vb-Key9r18tgY3CTcgoXXe8lYQL6FZDsmF_RZ3JAKoe6kOqts5u_g/s400/event-hub-03.png" width="400" /></a><br />
<br />
共有アクセスポリシーを作成します。<br />
今回はtestという名前とし、権限を設定し、画面下部の「保存」を押します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDOon78STBCwlxYsSUBB0AdW_J4em7QUyEioyOHBTXO1gGILggsF1_QxLK8AOP8lUoL8oCH4YW2aXDM1iKezMNiiRv-s5nc-y2r6Ex7Q-lAE7dKSgP8Fl49z82ZFCU8I93h2PXHaLVYARk/s1600/event-hub-05.png" imageanchor="1"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDOon78STBCwlxYsSUBB0AdW_J4em7QUyEioyOHBTXO1gGILggsF1_QxLK8AOP8lUoL8oCH4YW2aXDM1iKezMNiiRv-s5nc-y2r6Ex7Q-lAE7dKSgP8Fl49z82ZFCU8I93h2PXHaLVYARk/s400/event-hub-05.png" width="400" /></a><br />
<br />
<br />
共有アクセスキー生成コンポーネントにある、ポリシー名、プライマリーキーを、次の項目で説明する、WebUIのSASキーの項目へ入力します。 <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh45HZpiejIoP4olLx4sr-qq7PsjoL2Xyu1uCeM_w41Sq8NFle7ARytBWMIDZrq9v3AW3bUjj5x4gqvNAFERFDIPlDNOrfzyxK6r6Ap0fbjdE124V07YODbLqeWBOnarkLu0gb6fWqj2ZbC/s1600/event-hub-05.png" imageanchor="1"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh45HZpiejIoP4olLx4sr-qq7PsjoL2Xyu1uCeM_w41Sq8NFle7ARytBWMIDZrq9v3AW3bUjj5x4gqvNAFERFDIPlDNOrfzyxK6r6Ap0fbjdE124V07YODbLqeWBOnarkLu0gb6fWqj2ZbC/s400/event-hub-05.png" width="400" /></a><br />
<br />
Event Hubでの定作業は以上で終了です。<br />
<br />
<b><span style="font-size: large;">3.OpenBlocks IoT 基本ソフトウェアのWebUI設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
設定の全体の流れは前回の記事を参照してください。<br />
作業として異なるのは、Azure IoT Hubへの送信が、Azure Event Hubへの送信となることです。 <br />
<br />
<u><b>・Azure Event Hubへの送信設定</b></u><br />
<br />
<br />
以下のドキュメントに従って設定を進めていきます。<br />
<br />
<a href="http://openblocks.plathome.co.jp/common/pdf/OpenBlocks_iot_emitter_Guide_v1.0.10_160519.pdf">OpenBlocks IoT Family向け データ収集ガイド</a><br />
<br />
<br />
先に、送信先設定を行います。<br />
MS Azure IoT Hubを「使用する」にチェックし、各項目を設定してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
インターバル<br />
収集したデータを送信する間隔です。<br />
この例ではデータの送信確認のために5秒としています。<br />
(実際には5分~1時間以上に設定されることが多いと思います)<br />
有効時間<br />
データ送信できない場合において、保持する時間を設定します。<br />
0を指定した場合、データ送信が完了するまで保持し続けます。<br />
ドメイン名<br />
送信するIoT Hubのホスト名を設定します。<br />
デフォルトでは、servicebus.windows.net が入力されています。<br />
名前空間<br />
上記の管理ポータルで作成された名前空間を使用してください。 <br />
ポート番号<br />
送信先のポート番号を設定します。5670となっていますが、5671としてください。<br />
<br />
デバイス一括設定<br />
ビーコン及びデバイスの送信対象設定が”送信する”となっている各対象の<br />
送信先設定を一括で有効/無効を選択できます。</div>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCydWVkQeMQcOBwVmJq50ctIcOBCTtpAjfn9tNojAolfhzb8Gg0fepNi1drI21yt75yV7RmDYp9UCF3Vas5HX-QRtHWM4lqXHj0wBvZLu_vhDtoeTrUqE7PM3rGkjf2K1PuP5dOf0mQGzy/s1600/event-hub-webui-01.png" imageanchor="1"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCydWVkQeMQcOBwVmJq50ctIcOBCTtpAjfn9tNojAolfhzb8Gg0fepNi1drI21yt75yV7RmDYp9UCF3Vas5HX-QRtHWM4lqXHj0wBvZLu_vhDtoeTrUqE7PM3rGkjf2K1PuP5dOf0mQGzy/s400/event-hub-webui-01.png" width="400" /></a><br />
<br />
デバイス情報送信設定を行います。<br />
送信対象を、「送信する」にチェックし、各項目を設定してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
センサー信号強度[dbm]<br />
センサーに信号強度を設定できる機種の場合、設定したい信号強度を入力します。<br />
設定した信号強度が無い場合、近似値またはデフォルト値が設定されます。<br />
取得時間間隔[ms]<br />
センサーからデータを取得する時間間隔を数字で設定します。単位はmsecです。送信先設定<br />
送信先をチェックします。同時に2か所までの送信が可能です。<br />
Event Hubにチェックします。<br />
Event Hub名<br />
Event Hub名を設定します。今回はobsevhubとなっています。<br />
SASポリシー<br />
管理ポータルで作成した共有アクセスポリシーの名前を入力します。<br />
SASキー <br />
管理ポータルで作成された共有アクセス生成キーコンポーネントよりプライマリーキーを<br />
コピーし、入力します。 </div>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTF0ZNQ-knLAa04Om_RITy0fXwdFH4YQEZ_vMdsDmJtOLvbUQ5Qu_HQIYRZcKihMo5XQaZPxz_Rog6tkaztIPdZdimThnsOdPCcKlidOWbm-Toc4SmYozXLEoFgwZo3j2kJYMlxmcjgsQL/s1600/event-hub-webui-02.png" imageanchor="1"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTF0ZNQ-knLAa04Om_RITy0fXwdFH4YQEZ_vMdsDmJtOLvbUQ5Qu_HQIYRZcKihMo5XQaZPxz_Rog6tkaztIPdZdimThnsOdPCcKlidOWbm-Toc4SmYozXLEoFgwZo3j2kJYMlxmcjgsQL/s400/event-hub-webui-02.png" width="400" /></a><br />
<br />
保存を押し、収集ログタブにて、Event Hubへデータが送信されていることを確認してください。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm93cRomlH1O_AMWK4vJTNWLkVHTR3BD_4VV-MiJtcV2VQsvprO6zTaFwoEuki7uU-JX5Ww1tr50fX0B7IGyocN8rs6CIiLr6-uWlEeiJk-bQe5dofaXJ0oMt5BnJF7DIPyP7X0Cp9d6ih/s1600/event-hub-webui-03.png" imageanchor="1"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm93cRomlH1O_AMWK4vJTNWLkVHTR3BD_4VV-MiJtcV2VQsvprO6zTaFwoEuki7uU-JX5Ww1tr50fX0B7IGyocN8rs6CIiLr6-uWlEeiJk-bQe5dofaXJ0oMt5BnJF7DIPyP7X0Cp9d6ih/s400/event-hub-webui-03.png" width="400" /></a><br />
<br />
<b><span style="font-size: large;">4.Stream Analytics jobの設定について</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
前回との変更点として、入力がIoT HubからEvent Hubになり、リソース名も変わります。<br />
また、サービス名を変更した場合は、クエリのFROMの記述も変更します。<br />
<br />
<b><span style="font-size: large;">5.Power BIでのデータの確認と表示</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Power BIにサインインすると、データセットに設定したデータセット名が表示されています。<br />
以下の画面では、Stream Analyticsでデータセット名を変えていますので、前回と違うデータセットが表示されています。<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnPeh0N0MiGs23lhHqvFg60c4W3Cr1ikcMq4pLh5LusNn2G6vWAXKQRvd1sTnKiMcGZlbFAxLM0G20WDAYs3BVWeX8HnTidUcZrE31yVpPwyUIW5pTB0AVSgGGgKBQ6mKIjlV6nxocC7T/s1600/powerbi-03.png"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnPeh0N0MiGs23lhHqvFg60c4W3Cr1ikcMq4pLh5LusNn2G6vWAXKQRvd1sTnKiMcGZlbFAxLM0G20WDAYs3BVWeX8HnTidUcZrE31yVpPwyUIW5pTB0AVSgGGgKBQ6mKIjlV6nxocC7T/s400/powerbi-03.png" width="400" /></a><br />
<br />
<br />
上記の画面が確認できれば、今回のチュートリアルは終了です。<br />
<br />
<b><span style="font-size: large;">6.さいごに </span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
今回は、Event Hubへ変更した部分だけを説明しました。<br />
WebUIでのポート番号だけは5671であることをご確認ください。<br />
<br />
<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-91610011243547236622016-08-05T14:11:00.000+09:002016-08-23T13:39:03.213+09:00OpenBlocks IoT シリーズをMicrosoft Azure IoT Hubへ接続し、Stream Analyticsを経由してPowerBIへデータを受け渡す手順についてOpenBlocks IoT シリーズの基本ソフトウェア 1.0.10より、Azure IoT HubおよびAzure Event HubへのWebUIでの接続設定に対応しました。<br />
本記事では、Azure IoT Hubへの接続の手順、および、Stream Analytics jobを経由したPower BIへのデータの受け渡し手順について、解説しています。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDaG3cneu0sl6CsItmuuCImvzEkh3LIF73omctfOLMj58lMu4yzMsxg21DI1qLlEMbOYYbGC5F5YYBGwk3JiXMWVJWSaktpahzSp24oEa6GZGcEQHVjCrI-tMsnkpZColG0n32IfjprlAg/s1600/P_20160729_165535.jpg"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDaG3cneu0sl6CsItmuuCImvzEkh3LIF73omctfOLMj58lMu4yzMsxg21DI1qLlEMbOYYbGC5F5YYBGwk3JiXMWVJWSaktpahzSp24oEa6GZGcEQHVjCrI-tMsnkpZColG0n32IfjprlAg/s400/P_20160729_165535.jpg" width="400" /></a></div>
<br />
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
<span style="font-family: inherit;"><span style="font-size: small;">ゲートウェイ</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;"> OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;"> </span></span><span style="font-family: inherit;"><span style="font-size: small;">IIJmio 高速モバイル/D SIM</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;">センサー</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;"> <b><span style="background-color: white; color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; word-spacing: 0px;">FWM8BLZ02A-109047</span></b><span style="background-color: white; color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: left; text-indent: 0px; text-transform: none; white-space: pre-wrap; word-spacing: 0px;"> 温度/3軸加速度センサービーコン (BLE)</span></span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;">クラウド</span></span><br />
<span style="font-family: inherit;"><span style="font-size: small;"> Microsoft Azure </span></span><br />
<br />
<b><span style="font-size: large;">1. 事前準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
<u><b>・アカウント</b></u><br />
<br />
Microsft Azureのアカウントが必要です。<br />
Microsoft Azureのサービスポリシーに従って適切に設定してください。<br />
<br />
注意点としてはAzure IoT Hubや、Stream Analyticsなどは個人アカウントでも開始できますが、Power BIを使用する場合は、試用であっても学校または職場のアカウントが必要となり、gmailでの個人登録アカウントなどではサインアップできません。<br />
また、職場のアカウントで無料サインアップ出来ない場合は、職場のMS Azure管理権限のある担当に相談してください。<br />
<br />
<b><span style="font-size: large;">2.Microsoft Azure IoT Hubのデプロイと設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Azureアカウントにサインインします。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7BceWTZ0zIty2qF4Zxqkc75jzsk78rp1OmiZmHbm__0MyTIuAWhnlVIvAYDnCngfNVJuex8GYYgo-JMFYY10TlSn1NXf61_q_REHN_Gt2ZsXBAh-OsR8Nj7QXNP_ovr9mUoHVhRWfqezT/s1600/azure-01start.png" imageanchor="1"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7BceWTZ0zIty2qF4Zxqkc75jzsk78rp1OmiZmHbm__0MyTIuAWhnlVIvAYDnCngfNVJuex8GYYgo-JMFYY10TlSn1NXf61_q_REHN_Gt2ZsXBAh-OsR8Nj7QXNP_ovr9mUoHVhRWfqezT/s400/azure-01start.png" width="400" /></a><br />
<br />
新規メニューより、IoT Hubを検索します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNKAYrVAa4dC8hKizeCAKsOkSaBou6GK1x3LAPAFsqdJVrvOQMNcXS5S9az3zWlJEhSzGoFaqunOuxHm_FNj9cEgg8EHpOVclJrfV48XnLVFqWZCtQhwjeKxnSxKxDeGFCe_Rzg203Q7tE/s1600/azure-02iothub.png" imageanchor="1"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNKAYrVAa4dC8hKizeCAKsOkSaBou6GK1x3LAPAFsqdJVrvOQMNcXS5S9az3zWlJEhSzGoFaqunOuxHm_FNj9cEgg8EHpOVclJrfV48XnLVFqWZCtQhwjeKxnSxKxDeGFCe_Rzg203Q7tE/s400/azure-02iothub.png" width="400" /></a><br />
<br />
IoT Hubを選択し、作成を押し、IoTハブのパネルで名前、サブスクリプション、リソースグループ、場所を入力して、作成を押します。<br />
IoTハブ名など、この先でリソース名として受け渡す可能性のあるものには"-"をつけないことをお勧めします。<br />
例えば、Stream Analytics jobのクエリの記述パネルでは"-"は使用できません。<br />
<br />
今回の設定例は以下の通り。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
名前:<br />
obxbx1<br />
価格とスケールティア <br />
S1 - Standard 400kメッセージ/ユニット/日 ( F1 Freeの場合は8kメッセージ/ユニット/日 )<br />
IoT Hub ユニット <br />
1<br />
Device-to-cloud パーティション<br />
4パーティション<br />
サブスクリプション<br />
Microsoft Azure エンタープライズ<br />
リソースグループ<br />
plathome-goto<br />
場所<br />
東日本 </div>
<br />
ダッシュボードにピン留めする場合は、チェックボックスにチェックを入れます。 <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbB6ERrIfKBtA0JNvxh_7yVqXHFuq_vfr-p-RPZEBX53EBePXbG5_7k_RicJNKAD7qkxC7_AK96aUQEOxYzWjEukVgwABuUAc_OKhW8EVjoHacUelpxp5dMoEh6m4cuO2Q7aVeH0h2nfQR/s1600/azure-03iothub.png" imageanchor="1"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbB6ERrIfKBtA0JNvxh_7yVqXHFuq_vfr-p-RPZEBX53EBePXbG5_7k_RicJNKAD7qkxC7_AK96aUQEOxYzWjEukVgwABuUAc_OKhW8EVjoHacUelpxp5dMoEh6m4cuO2Q7aVeH0h2nfQR/s400/azure-03iothub.png" width="400" /></a><br />
<br />
デプロイが開始されます。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVpokmb10b5X5OJ2f-NNXaItTjHbqQdZNBHZGvbOr62IP4BwU_DUS3e6C8OT8PCdBw-HqQqgUDXiXgH0FjxGKaS7ZghgP5BbXh_DLuqbebBTkw_SOhRbS7MlcNwyaumbNocDNozINqoWbR/s1600/azure-04iothubdep.png" imageanchor="1"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVpokmb10b5X5OJ2f-NNXaItTjHbqQdZNBHZGvbOr62IP4BwU_DUS3e6C8OT8PCdBw-HqQqgUDXiXgH0FjxGKaS7ZghgP5BbXh_DLuqbebBTkw_SOhRbS7MlcNwyaumbNocDNozINqoWbR/s400/azure-04iothubdep.png" width="400" /></a><br />
<br />
デプロイ完了を確認します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9BBY_IsVrdoFQznYxJHWhzUnrrjvqhfX3vKm0X7sNHjJHluJ_osVBBiiSfrm9hQKXsplgemJ4FL652GhOfjPTtn7_CSg5aWWXw-4GtqfZKqFg9zX-F8R2O9qLqI7EpSltv05pQhhJy0KI/s1600/azure-05complete.png" imageanchor="1"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9BBY_IsVrdoFQznYxJHWhzUnrrjvqhfX3vKm0X7sNHjJHluJ_osVBBiiSfrm9hQKXsplgemJ4FL652GhOfjPTtn7_CSg5aWWXw-4GtqfZKqFg9zX-F8R2O9qLqI7EpSltv05pQhhJy0KI/s400/azure-05complete.png" width="400" /></a><br />
<br />
<b><span style="font-size: large;">3.Device Explorerの導入と設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
以下のドキュメントを参考に、導入と設定を進めていきます。<br />
<br />
<h1 style="border-bottom: 1px solid rgb(238, 238, 238); box-sizing: border-box; color: #333333; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 600; letter-spacing: normal; line-height: 1.25; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px ! important; padding-bottom: 0.3em; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
<a href="https://github.com/Azure/azure-iot-sdks/blob/master/tools/DeviceExplorer/doc/how_to_use_device_explorer.md" target="_blank"><span style="font-size: small;">How to use Device Explorer for IoT Hub device</span></a><span style="font-size: small;"> </span></h1>
Getting Device Explorerの項目より、以下のDevice Explorerのダウンロードページを開きます<br />
<br />
<a href="https://github.com/Azure/azure-iot-sdks/releases">https://github.com/Azure/azure-iot-sdks/releases</a><br />
<br />
<br />
ページの最下部にある、Downloadsより、<br />
<br />
SetupDeviceExplorer.msi<br />
<br />
をダウンロードし、インストールして下さい。 <br />
<br />
実行すると、以下のパネルが表示されます。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIY0DTsqhdvYt0qPK7zOtuJOkHmPcuKQDWn1RiVXB2isyfGb54V3yGMtlXEgVPoFAMZDUnSxU7sluoWA3T5q5Yrs9KAPzIcwCCaMT_tjR7vIuclIifkJclJIb4eK-BUqIztiphyphenhyphennw_PB2W/s1600/device-explorer-1.png" imageanchor="1"><img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIY0DTsqhdvYt0qPK7zOtuJOkHmPcuKQDWn1RiVXB2isyfGb54V3yGMtlXEgVPoFAMZDUnSxU7sluoWA3T5q5Yrs9KAPzIcwCCaMT_tjR7vIuclIifkJclJIb4eK-BUqIztiphyphenhyphennw_PB2W/s400/device-explorer-1.png" width="400" /></a><br />
<br />
上記で作成した、Azure IoT Hubより、「すべての設定」から、「共有アクセスポリシー」のパネルを呼び出します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ1ffLPUaj7uV1FF4Br7A_DUGtizUHEUFAjOQEcaPg8Pen1zLNl_ECKzFqsNnuwuiBad0WbxlO1OgtaNBPAXpRch5fL0TnoQQndBP15dashKHas1zKfgs07DrOGFRoDck7o3xy8e86m5Ab/s1600/device-explorer-2-azure-1.png" imageanchor="1"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ1ffLPUaj7uV1FF4Br7A_DUGtizUHEUFAjOQEcaPg8Pen1zLNl_ECKzFqsNnuwuiBad0WbxlO1OgtaNBPAXpRch5fL0TnoQQndBP15dashKHas1zKfgs07DrOGFRoDck7o3xy8e86m5Ab/s400/device-explorer-2-azure-1.png" width="400" /></a><br />
<br />
iothubownerを選択します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8kcc4tob8jkIZe7CnNormu8oh_H-Wv7WY9_32lZW-K4UIyR2KVyDDSGakHq_4a5RHzW5USDAAdqFUhBvvwL_YaqZ97bu3UBtdBDzykp-kqO28QUD7Ml4TlOrxPwBNNRcfbNPpzGMYS-Z6/s1600/device-explorer-2-azure-2.png" imageanchor="1"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8kcc4tob8jkIZe7CnNormu8oh_H-Wv7WY9_32lZW-K4UIyR2KVyDDSGakHq_4a5RHzW5USDAAdqFUhBvvwL_YaqZ97bu3UBtdBDzykp-kqO28QUD7Ml4TlOrxPwBNNRcfbNPpzGMYS-Z6/s400/device-explorer-2-azure-2.png" width="400" /></a><br />
<br />
接続文字列ープライマリーキーをコピーします。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk97AwF2NXjespdJVj_m1uk9jDh_Q4Kcp_mb5PGWF-IQubIWT4SVqtsIbfBb4LtzlNssQ84t0BZKzt7h3WfpkOIyUvXXj0dT6Z0xIdd0DkbzwbtFcQmoXKeDAdrgCplcaOXo7XAvwKfKsm/s1600/device-explorer-2-azure-4.png" imageanchor="1"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhk97AwF2NXjespdJVj_m1uk9jDh_Q4Kcp_mb5PGWF-IQubIWT4SVqtsIbfBb4LtzlNssQ84t0BZKzt7h3WfpkOIyUvXXj0dT6Z0xIdd0DkbzwbtFcQmoXKeDAdrgCplcaOXo7XAvwKfKsm/s400/device-explorer-2-azure-4.png" width="400" /></a><br />
<br />
コピーした文字列を、Device ExplorerのIoT Hub Connection Stringの入力パネルに貼り付け、Updateを押します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhREkrRllRfbR090wqzGkhw6GhQ84wqkWOnbFfNN_nWC9JECYWchZeAKvT0460liK_6doTgV0t9FYfEqd8THTesNESSNyxE7c7THSwSSFsVctxwTAyoeOkSJCnXJffdYZbgjAObZA-WhHa2/s1600/device-explorer-2-azure-5.png" imageanchor="1"><img border="0" height="377" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhREkrRllRfbR090wqzGkhw6GhQ84wqkWOnbFfNN_nWC9JECYWchZeAKvT0460liK_6doTgV0t9FYfEqd8THTesNESSNyxE7c7THSwSSFsVctxwTAyoeOkSJCnXJffdYZbgjAObZA-WhHa2/s400/device-explorer-2-azure-5.png" width="400" /></a><br />
<br />
<b><span style="font-size: large;">4.OpenBlocks IoT 基本ソフトウェアのWebUI設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
・<u><b>WebUIの初期設定、ネットワーク設定、BLEセンサービーコンの登録</b></u><br />
<br />
<br />
<a href="http://openblocks.plathome.co.jp/common/pdf/OpenBlocks_iot_WEBUI_Guide_v1.0.10_160527-2.pdf">OpenBlocks IoT Family向けWEB UIセットアップガイド</a><br />
<br />
に従って設定してください。<br />
今回は富士通コンポーネントの温度/3軸加速度センサー付きのBLEユニットを使用しています。<br />
<br />
出力される項目が変わりますが、標準で対応しているセンサー付きのBLE製品としては、FCL製品以外では、CC2650STK/CC2451 Sensor Tagがあります。<br />
また今後他社製品(ALPS/OMRON/他)にも対応予定ですが、ALPS IoT Smart module開発キット(BLE)は8月中旬以降リリース予定の1.0.11で、それ以外のデバイスは1.0.11より先のリリースで対応を予定しています。<br />
アドバタイズデータにセンサーデータを載せるタイプの製品は、データであれば、ビーコン送信機能で送信可能ですが、送信するJSON上のデータが一連のデータ列のままdataとして名前付けされますので、クラウド側で変換する必要があります。 <br />
<br />
また、基本ソフトウェアのPD Handlerで標準対応している、EnOceanセンサ、Wi-SUNによるBルートでの電力計測データも利用出来ます。EnOceanセンサは変換モードを有効にすることで多くのアーミンセンサでプロファイルに応じてデータを変換可能ですが、対応していないものは変換前のデータのままrawモードでの送信となりますので、クラウド側で変換が必要となります。<br />
<br />
カスタムハンドラを作成される場合は、最終的に扱いたいデータの構造でJSON形式の送信データを構成するといいでしょう。<br />
<br />
<u><b>・Azure IoT Hubへの送信設定</b></u><br />
<br />
<br />
以下のドキュメントに従って設定を進めていきます。<br />
<br />
<a href="http://openblocks.plathome.co.jp/common/pdf/OpenBlocks_iot_emitter_Guide_v1.0.10_160519.pdf">OpenBlocks IoT Family向け データ収集ガイド</a><br />
<br />
<br />
先に、送信先設定を行います。<br />
MS Azure IoT Hubを「使用する」にチェックし、各項目を設定してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
インターバル<br />
収集したデータを送信する間隔です。<br />
この例ではデータの送信確認のために5秒としています。<br />
(実際には5分~1時間以上に設定されることが多いと思います)<br />
有効時間<br />
データ送信できない場合において、保持する時間を設定します。<br />
0を指定した場合、データ送信が完了するまで保持し続けます。<br />
ドメイン名<br />
送信するIoT Hubのホスト名を設定します。<br />
デフォルトでは、azure-devices.net が入力されています。<br />
ポート番号<br />
送信先のポート番号を設定します。通常は5671から変更する必要はありません。<br />
IoT Hub名<br />
上記で設定したIoT Hub名を入力します。<br />
<br />
デバイス一括設定<br />
ビーコン及びデバイスの送信対象設定が”送信する”となっている各対象の<br />
送信先設定を一括で有効/無効を選択できます。</div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiolgjEwdfCRbKJauCBaCpE6ExjU_6rA3hfbDgISvzXgLVuItl_-4tXij4BmcF6tzf_p0WX1Z-CREOVZ-iK_Aee345vvvfGNLGRqes27BYAV_YKgT6ezjM06bWYzd2LPeTGCtzQR512LJc1/s1600/webui-01-azure01.png" imageanchor="1"><img border="0" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiolgjEwdfCRbKJauCBaCpE6ExjU_6rA3hfbDgISvzXgLVuItl_-4tXij4BmcF6tzf_p0WX1Z-CREOVZ-iK_Aee345vvvfGNLGRqes27BYAV_YKgT6ezjM06bWYzd2LPeTGCtzQR512LJc1/s400/webui-01-azure01.png" width="400" /></a><br />
<br />
デバイス情報送信設定を行います。<br />
送信対象を、「送信する」にチェックし、各項目を設定してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
センサー信号強度[dbm]<br />
センサーに信号強度を設定できる機種の場合、設定したい信号強度を入力します。<br />
設定した信号強度が無い場合、近似値またはデフォルト値が設定されます。<br />
取得時間間隔[ms]<br />
センサーからデータを取得する時間間隔を数字で設定します。単位はmsecです。送信先設定<br />
送信先をチェックします。同時に2か所までの送信が可能です。<br />
IoT Hubにチェックします。<br />
デバイスID(IoT Hub)<br />
デバイスIDを設定します。今回はBLEデバイスのMACアドレスを使用しています。<br />
<br />
上記で設定したIoT Hub名を入力します。<br />
デバイスキー<br />
IoT Hubに送信する際のデバイスキーを設定します。<br />
今回デバイスキーは下記の手順によりDevice Explorerで取得しています。</div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidVQ7Pu2t8tJKTgcdPLR5RvdyEE4nWNTMngcy9aDeGBCX42qIW7ZQzsyDriwaT2K14UQ2n241mTxmR_De5rCSCiTihOAfSmCNd3an1K5xWVuLmsJdQLuhTS_KgOXPwJ9laWAqrF0kZpEK5/s1600/webui-01-azure02.png" imageanchor="1"></a> <br />
・<u><b>デバイスキーの取得方法</b></u><br />
<br />
Device Explorerの「Management」タブを開き、「Create」ボタンより入力パネルを出し、上記のWebUIにて使用するデバイスIDを入力して「Create」を押します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsY-cdk8lqhBCf3tNM91Qs1OEyybZy98Y4bu1DHzXokQ0sLTDnVqNurIqJATIaoBuQt_rnhpb2iJlQIELoesKhQqfJA9k54Qu9pJ9UFFN9H1RsFYKMOdOyUM6YFP9shhcYKVSBtkVmSYQP/s1600/device-explorer-2-azure-6.png" imageanchor="1"><img border="0" height="377" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsY-cdk8lqhBCf3tNM91Qs1OEyybZy98Y4bu1DHzXokQ0sLTDnVqNurIqJATIaoBuQt_rnhpb2iJlQIELoesKhQqfJA9k54Qu9pJ9UFFN9H1RsFYKMOdOyUM6YFP9shhcYKVSBtkVmSYQP/s400/device-explorer-2-azure-6.png" width="400" /></a><br />
<br />
「Device Created」と表示されたパネルの文字列をCtrl-A/Ctrl-Cとしてコピーします。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1yi0EDpFRCOKe2_XrS5qakRJoAdSP-Hjqk_qaCPP0G4-R56iG9XSWmMsYGTzkXCeUcr6bDqq1y9DxbNc33W-YFS5yF6Wv9rNcYNvNFj-d4BCekz6nF5kUa-Tcs1ZCTv9HBAxwupWJKINW/s1600/device-explorer-2-azure-7.png" imageanchor="1"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1yi0EDpFRCOKe2_XrS5qakRJoAdSP-Hjqk_qaCPP0G4-R56iG9XSWmMsYGTzkXCeUcr6bDqq1y9DxbNc33W-YFS5yF6Wv9rNcYNvNFj-d4BCekz6nF5kUa-Tcs1ZCTv9HBAxwupWJKINW/s400/device-explorer-2-azure-7.png" width="400" /></a><br />
<br />
この文字列に含まれる、PrimaryKeyをデバイスキーとしてWebUIの画面で入力し、設定を保存してください。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHxt-43YzIQXQzOIZsLq_Q6_3HKizvpOM0y2o1flNd5EVEVPyXr9-SfGugrzcBwSEDZUwBqN2MhOcgCe4uYCx4zI83hfaIiPaD4R5jxU6Zz0-n82i-8wRn4bPsREmdnlA5VzpWmWRJE9Tu/s1600/device-explorer-2-azure-8.png" imageanchor="1"><img border="0" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHxt-43YzIQXQzOIZsLq_Q6_3HKizvpOM0y2o1flNd5EVEVPyXr9-SfGugrzcBwSEDZUwBqN2MhOcgCe4uYCx4zI83hfaIiPaD4R5jxU6Zz0-n82i-8wRn4bPsREmdnlA5VzpWmWRJE9Tu/s400/device-explorer-2-azure-8.png" width="400" /></a><br />
<br />
<b><span style="font-size: large;">5.Device Explorerによる通信確認</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
先に、WebUIの収集ログにより、pd-handler-stdout.logおよびpd-emitter-lite.logを確認して、センサービーコンとの通信確認、およびAzure IoT Hubとの通信確認を行います。<br />
<br />
pd-handler-stdout.logの確認<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuGJieJU4BbLnQgbPAXn8ekBO-Z7J3-nviN9XtwTQNOv7h84n2sQDPHS1EFAh164Lr8TfIYixMp1Flo2FcqPZOakvesT1dWI83XEYhMK5FOV-kHrUymB6e-vGZhEpF_jmuwouoqnvtu6dQ/s1600/webui-01-azure03.png" imageanchor="1"><img border="0" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuGJieJU4BbLnQgbPAXn8ekBO-Z7J3-nviN9XtwTQNOv7h84n2sQDPHS1EFAh164Lr8TfIYixMp1Flo2FcqPZOakvesT1dWI83XEYhMK5FOV-kHrUymB6e-vGZhEpF_jmuwouoqnvtu6dQ/s400/webui-01-azure03.png" width="400" /></a><br />
<br />
pd-emitter-lite.logの確認<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIocb-vVbpWGKvTlD7LuY3EZ3KZWm5TifmYjxTKcdXIrDCqQbtSzIK1eXLwKiv90vbjpF2B0TI9GkbZXqi0JyYJIQ9ddh-5BUMpqVlC8Bt1-ldYjXwPeTgYqMEBzWBlwxTy5dSJnuYZXJ7/s1600/webui-01-azure04.png" imageanchor="1"><img border="0" height="317" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIocb-vVbpWGKvTlD7LuY3EZ3KZWm5TifmYjxTKcdXIrDCqQbtSzIK1eXLwKiv90vbjpF2B0TI9GkbZXqi0JyYJIQ9ddh-5BUMpqVlC8Bt1-ldYjXwPeTgYqMEBzWBlwxTy5dSJnuYZXJ7/s400/webui-01-azure04.png" width="400" /></a><br />
<br />
<br />
次に、Device Explorerの「Data」タブより「Monitor」ボタンを押して確認してください。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwV-NtP81yvU0m7dTRbpYM-TnCn02MceMhGDuP6TKVEqL0YRt3zJl2mQDbugaEOr9x3o9EowuP5QwnvvanSTf1Zq1XaY8d_4ruPWJH5zOf4ehFNInPCCgD4gsqf4VQb9NSB-gsSo96G1ph/s1600/device-explorer-2-azure-9.png" imageanchor="1"><img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwV-NtP81yvU0m7dTRbpYM-TnCn02MceMhGDuP6TKVEqL0YRt3zJl2mQDbugaEOr9x3o9EowuP5QwnvvanSTf1Zq1XaY8d_4ruPWJH5zOf4ehFNInPCCgD4gsqf4VQb9NSB-gsSo96G1ph/s400/device-explorer-2-azure-9.png" width="400" /></a><br />
<br />
<br />
<b><span style="font-size: large;">6.Power BIの準備 </span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Power BIにサインイン出来るように、準備をします。<br />
すでに、お使いの方はこの作業は必要ありません。<br />
以下のページより、サインアップを進めてください。<br />
<br />
<div class="r" style="background-color: white; color: #222222; display: block; font-family: arial,sans-serif; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; margin: 0px; overflow: hidden; padding: 0px; text-align: left; text-indent: 0px; text-overflow: ellipsis; text-transform: none; white-space: nowrap; word-spacing: 0px;">
<span style="font-size: small;"><a href="https://powerbi.microsoft.com/ja-jp/" style="color: #660099; cursor: pointer; text-decoration: underline;">Power BI | 対話型のデータ視覚化 BI ツール</a></span></div>
<br />
<br />
冒頭に書いた通り、職場または学校のアカウントであれば無料でサインアップできます。<br />
無料の使用範囲は、データ容量1GB/ユーザー、ストリーミングデータが10k行/時間となり、グループでのチームコラボレーションは出来ません。<br />
職場のアカウントでサインアップ出来ない場合は、職場の担当者に相談して下さい。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKjwA0FLEbOnOFX5ZaBIRMS9aEbL8Ic8Uv_ZXQJJqibl28JhBIOVZlgWF6cth7tFD4lnOL_XDuGZKOPEqk-nNndZL1j2UW-Bw9j52y7en1CvVlBG2HHGn2QXa5BgLafA2pnpy12b1P7XXS/s1600/power-bi-01.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKjwA0FLEbOnOFX5ZaBIRMS9aEbL8Ic8Uv_ZXQJJqibl28JhBIOVZlgWF6cth7tFD4lnOL_XDuGZKOPEqk-nNndZL1j2UW-Bw9j52y7en1CvVlBG2HHGn2QXa5BgLafA2pnpy12b1P7XXS/s400/power-bi-01.png" width="400" /></a><br />
<br />
<br />
<b><span style="font-size: large;">6.Stream Analytics jobのデプロイと設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Azureのダッシュボードより、Stream Analytics jobを追加します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3p0cH_r1UuVJdhrldc7gBmZNTwyRpW0V42_eJG0R4musT_7S0Wc4m1cRkFwFTkoi0qikPW-hJwg0GA_qARH2CyhfByNH_ZPdXOHTUNP64KI_6Cg_-JaRiqCjRX-hlI0YIRC7yxjgUsvei/s1600/stream-01.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3p0cH_r1UuVJdhrldc7gBmZNTwyRpW0V42_eJG0R4musT_7S0Wc4m1cRkFwFTkoi0qikPW-hJwg0GA_qARH2CyhfByNH_ZPdXOHTUNP64KI_6Cg_-JaRiqCjRX-hlI0YIRC7yxjgUsvei/s400/stream-01.png" width="400" /></a><br />
<br />
作成を押します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT87uAIezPvbCp3HV9uR2XRaLzUo72230bf4C7RZJFptidocnIi5CjvH_M2AJvn2pN1AfQdPSnGNouk37XnzeOSvWgfjhgzhVJMgmHgI32pS4_sYgKWkmxBL9PDq1n3-Bpam0nRKolXOZ1/s1600/stream-02.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT87uAIezPvbCp3HV9uR2XRaLzUo72230bf4C7RZJFptidocnIi5CjvH_M2AJvn2pN1AfQdPSnGNouk37XnzeOSvWgfjhgzhVJMgmHgI32pS4_sYgKWkmxBL9PDq1n3-Bpam0nRKolXOZ1/s400/stream-02.png" width="400" /></a><br />
<br />
ジョブ名、サブスクリプション、リソースグループ、場所を設定し、作成を押します。<br />
今回の設定例は以下の通りです。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
名前:<br />
streamtobi<br />
サブスクリプション<br />
Microsoft Azure エンタープライズ<br />
リソースグループ<br />
plathome-goto<br />
場所<br />
東日本 </div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR63ldvmQlRndPSSjKTymylfygoSbljHKIVPANQLFT4oIHM65dDriY3ZLjKYuQ6wpVrVVf5S1_YjsUbRfChC9KABwlUH21SN5QgCabQoR1USdcmaMyqt9OugxXzLhcn7ZZ3rNA9yG07Xx8/s1600/stream-03.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR63ldvmQlRndPSSjKTymylfygoSbljHKIVPANQLFT4oIHM65dDriY3ZLjKYuQ6wpVrVVf5S1_YjsUbRfChC9KABwlUH21SN5QgCabQoR1USdcmaMyqt9OugxXzLhcn7ZZ3rNA9yG07Xx8/s400/stream-03.png" width="400" /></a><br />
<br />
デプロイを待ちます。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi18s6bl3Fd_p3FBBFrcS2_8pQaDbcuRGnnZ3z9jxHJ8AdIetysYjCcedLZtTGvy6r2lmInSQCP0kNKPOHu7CLCC3N1_UDJgduzC9hrOMGfw4JaHR-HPFQ0K2mEwdviNgXIGoe8OSxvPRrR/s1600/stream-04.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi18s6bl3Fd_p3FBBFrcS2_8pQaDbcuRGnnZ3z9jxHJ8AdIetysYjCcedLZtTGvy6r2lmInSQCP0kNKPOHu7CLCC3N1_UDJgduzC9hrOMGfw4JaHR-HPFQ0K2mEwdviNgXIGoe8OSxvPRrR/s400/stream-04.png" width="400" /></a><br />
<br />
作成済と表示されたのち、ジョブトポロジを設定します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ7iLt921224RnVhXFIJb57a2jA_SC4EowvfCE20Iv1_4DIuaUy2KfNYJo8vg7LMyS1N5UjvNRNziz4QVW_WNKZDer8ZE_QSAdZp404Ck6UBwA14g2CM75iyPKbc1kRzSL_fVZLhGZa9l-/s1600/stream-05.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ7iLt921224RnVhXFIJb57a2jA_SC4EowvfCE20Iv1_4DIuaUy2KfNYJo8vg7LMyS1N5UjvNRNziz4QVW_WNKZDer8ZE_QSAdZp404Ck6UBwA14g2CM75iyPKbc1kRzSL_fVZLhGZa9l-/s400/stream-05.png" width="400" /></a><br />
<br />
入力のパネルをクリックし、、「+追加」を押して設定を行います。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFDes8_Z2vf8DCdpVcQ8FTPWH_qocIxHoECoccgKhyphenhyphen8HQa4YBJYt8h528ZVDuZ4-lI0Jz-wblussxJMX62iVwx2s1u_lboaDMp_xJX726rekKWwwREgzbbAQIMaTfKMoet02F6vwqNifRZ/s1600/stream-06.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFDes8_Z2vf8DCdpVcQ8FTPWH_qocIxHoECoccgKhyphenhyphen8HQa4YBJYt8h528ZVDuZ4-lI0Jz-wblussxJMX62iVwx2s1u_lboaDMp_xJX726rekKWwwREgzbbAQIMaTfKMoet02F6vwqNifRZ/s400/stream-06.png" width="400" /></a><br />
<br />
入力のエイリアスを入力し、ソースをIoT Hubにすると、各項目は自動的に設定されますので、問題がなければ作成を押してください。(今回は入力のエイリアスはobxbx1と設定しています)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-RPfhg5qJ4eMftCA6N2pxQauj0wPGxjfvKU_1LH510nIr_8lBwCuig88UqI9Qub-MHcVP7RrSk3IldxJrZIHahjvIdBU7S81E2gcx2GqpjE4iRtVAbg_VEatZSc1PRlipu9snV7aoakmV/s1600/stream-07.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-RPfhg5qJ4eMftCA6N2pxQauj0wPGxjfvKU_1LH510nIr_8lBwCuig88UqI9Qub-MHcVP7RrSk3IldxJrZIHahjvIdBU7S81E2gcx2GqpjE4iRtVAbg_VEatZSc1PRlipu9snV7aoakmV/s400/stream-07.png" width="400" /></a><br />
<br />
出力のパネルをクリックし、、「+追加」を押して設定を行います。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8_pqM7F7FFLJhHJuaq1fpm4wUZN8Vwbnm0eMX5vA6RrVsLBrRPBQNXE6JbWwZVvN_Dpzytirwz8zfKeBF75RGotiVuppfftN4n6jDjYbOZVOfu0rtTDa0MBU02bHc319_pKwjiGbL-MzZ/s1600/stream-08.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8_pqM7F7FFLJhHJuaq1fpm4wUZN8Vwbnm0eMX5vA6RrVsLBrRPBQNXE6JbWwZVvN_Dpzytirwz8zfKeBF75RGotiVuppfftN4n6jDjYbOZVOfu0rtTDa0MBU02bHc319_pKwjiGbL-MzZ/s400/stream-08.png" width="400" /></a><br />
<br />
出力エイリアスを設定して、シンクのメニューよりPower BIを選択します。<br />
今回は、出力エイリアスはpowerbibx1と設定しています。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3RQwcTxq6fmmVK8Jq-uDqWdqB-wNvHRy7EUQkMgJxg6ZP0GJsTbpe5lslIzom916gtIPp7vlHzy8dNJcFUeJwsprjqnO3yv_UAUOhJqrII_wBJddydubRgzKLbpqO0JmmPb9sALrL9pEA/s1600/stream-09.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3RQwcTxq6fmmVK8Jq-uDqWdqB-wNvHRy7EUQkMgJxg6ZP0GJsTbpe5lslIzom916gtIPp7vlHzy8dNJcFUeJwsprjqnO3yv_UAUOhJqrII_wBJddydubRgzKLbpqO0JmmPb9sALrL9pEA/s400/stream-09.png" width="400" /></a><br />
<br />
接続の承認ボタンを押すと、サインイン画面が出ますので、サインインを行うと承認が終了しますので、データセット名とテーブル名を入力して作成を行います。<br />
今回は、データセット名をfclsensor、テーブル名をsensorとしています。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggqkj7qXYX5Lt5UVyfiKpd5hVQ1PC5WlPWn1NEBS0nvdRNMyUN_R9Mi1SMP_Yj50iWfTBtr-pr4_KaQznb3y5qWL5Hk-4YqTvBXKtSwL85Jx80ZjTRgg3BDcXPY3vjt22_X99p9ASDRcHx/s1600/stream-10.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggqkj7qXYX5Lt5UVyfiKpd5hVQ1PC5WlPWn1NEBS0nvdRNMyUN_R9Mi1SMP_Yj50iWfTBtr-pr4_KaQznb3y5qWL5Hk-4YqTvBXKtSwL85Jx80ZjTRgg3BDcXPY3vjt22_X99p9ASDRcHx/s400/stream-10.png" width="400" /></a><br />
<br />
クエリをクリックして、編集し、保存します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEherAwJNxk6SXf4-2BW6NZaKbaDLWOC66NLFADueUHAy7Q3RdxwB6gMdlfK1-7aQ4U4uDn_BCI5UHKI_Lk1g5gnVAjlQzsUPFDMyZ3hbC7zk54Wt6llTX7qfDWTU9AnmnZqStFi1hjK8zd8/s1600/stream-11.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEherAwJNxk6SXf4-2BW6NZaKbaDLWOC66NLFADueUHAy7Q3RdxwB6gMdlfK1-7aQ4U4uDn_BCI5UHKI_Lk1g5gnVAjlQzsUPFDMyZ3hbC7zk54Wt6llTX7qfDWTU9AnmnZqStFi1hjK8zd8/s400/stream-11.png" /></a><br />
<br />
変換などを行わいない場合は、以下のように入出力のエイリアスを設定するだけです。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<br />
SELECT<br />
*<br />
INTO<br />
powerbibx1<br />
FROM<br />
obxbx1</div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh64DcfEumN5bA_ZcNQdxKTU0jWNxWt4pL7rYJZPTU5Q8Ly7R1fYHvnKH7q4VSE6X4MNhG7CeJFzVj0nj9gnTvRD_WJz_y5fq3nOOMYEl2m4LY7Qe_b5SsmCKLDZGSifGao4lllyXtZkCX/s1600/stream-11.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh64DcfEumN5bA_ZcNQdxKTU0jWNxWt4pL7rYJZPTU5Q8Ly7R1fYHvnKH7q4VSE6X4MNhG7CeJFzVj0nj9gnTvRD_WJz_y5fq3nOOMYEl2m4LY7Qe_b5SsmCKLDZGSifGao4lllyXtZkCX/s400/stream-11.png" width="400" /></a><br />
<br />
全て設定が終了したら、開始ボタンを押すとストリーミングジョブを開始します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzJnyTkeGcLbBpNp31uGiZC9t8kwyPSJJyUzUSm0Ry4jhn8KcyPoRA_MIzR8d8k1w7sWIIBCqNk4-4ydgHQGb6lcSYPfhE5i6tu2WiFUE2AvJBOzWxr9C_7wGQQg6yFT7luxkutSg182Ql/s1600/stream-12.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzJnyTkeGcLbBpNp31uGiZC9t8kwyPSJJyUzUSm0Ry4jhn8KcyPoRA_MIzR8d8k1w7sWIIBCqNk4-4ydgHQGb6lcSYPfhE5i6tu2WiFUE2AvJBOzWxr9C_7wGQQg6yFT7luxkutSg182Ql/s400/stream-12.png" width="400" /></a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtgw45nn8H7gejoH145ZsFhrZyDGlB3wgZObSF1SR3osWjiY7bRYAKnckj6MrXt4GPIIot4UIj95JOpiM71vgF1BjbosWVGPPKjEmQgGwMPGe2cNXg5wXTS7R6ErkPlptGUIQqBHH11oHo/s1600/stream-13.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtgw45nn8H7gejoH145ZsFhrZyDGlB3wgZObSF1SR3osWjiY7bRYAKnckj6MrXt4GPIIot4UIj95JOpiM71vgF1BjbosWVGPPKjEmQgGwMPGe2cNXg5wXTS7R6ErkPlptGUIQqBHH11oHo/s400/stream-13.png" width="400" /></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7g3DlBRdV9wKC01FGDg3RIJsA_s0Y_5hB8JH5ccIR4_-xD7hlkDT-Dmn5p-DnGBeNMUEpt-eBZIpHAVbVttr5-_RVqzI_7IH_xmaUl3vN7_6eTYfl0W2uH2gC9ZUJiEo6aQ_txzoV9TUy/s1600/stream-13.png" imageanchor="1"></a><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEx_X__ABvUkApMjXUu1AXav0pFOicLfPXmx3AxPwqCk3CnvQyJolssHFyBBzM3K_jQXXgvs2z1V6BIOzYpMna9nrxr3-E5jW2QaG5NpyI7bhiF7ry59NKLmT9VIjjefbPeQFV7H3GgOIS/s1600/stream-14.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEx_X__ABvUkApMjXUu1AXav0pFOicLfPXmx3AxPwqCk3CnvQyJolssHFyBBzM3K_jQXXgvs2z1V6BIOzYpMna9nrxr3-E5jW2QaG5NpyI7bhiF7ry59NKLmT9VIjjefbPeQFV7H3GgOIS/s400/stream-14.png" width="400" /></a><br />
<br />
ストリーミングジョブが正常に開始されました、というメッセージを確認してください。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfKiQnYK-hnSztLK79hj2kXH8Yepm4-mauQyBpFSQ_SwbzHCwpOWODSGFoMdk6q1cFtZEq4F4YZo5XY4eac_lyMugyA0bvM4CsHPy9BgCJdrWGi9Sp7uO5wrjoKWmtR6l0o22W2kICwrCd/s1600/stream-15.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfKiQnYK-hnSztLK79hj2kXH8Yepm4-mauQyBpFSQ_SwbzHCwpOWODSGFoMdk6q1cFtZEq4F4YZo5XY4eac_lyMugyA0bvM4CsHPy9BgCJdrWGi9Sp7uO5wrjoKWmtR6l0o22W2kICwrCd/s400/stream-15.png" width="400" /></a><br />
<br />
<b><span style="font-size: large;">7.Power BIでのデータの確認と表示</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Power BIにサインインすると、データセットに設定したデータセット名が表示されています。<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCqMk7OqqVfsw9SalcuZviMVQCbgInyfYpk0E-ao2qT3LvtmniXxLHYdK9vFm0bECUI0A-1svV8nJQ7Z1jssp7UYWHGcl2jqeWXPrBu6Le9O0M7apkocAt5TSQaCTjC87Bf0aNsDefbxm6/s1600/powerbi-02.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCqMk7OqqVfsw9SalcuZviMVQCbgInyfYpk0E-ao2qT3LvtmniXxLHYdK9vFm0bECUI0A-1svV8nJQ7Z1jssp7UYWHGcl2jqeWXPrBu6Le9O0M7apkocAt5TSQaCTjC87Bf0aNsDefbxm6/s400/powerbi-02.png" width="400" /></a><br />
<br />
表示されたデータセット名を押すと視覚化のメニューが出ます。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnPeh0N0MiGs23lhHqvFg60c4W3Cr1ikcMq4pLh5LusNn2G6vWAXKQRvd1sTnKiMcGZlbFAxLM0G20WDAYs3BVWeX8HnTidUcZrE31yVpPwyUIW5pTB0AVSgGGgKBQ6mKIjlV6nxocC7T/s1600/powerbi-03.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDnPeh0N0MiGs23lhHqvFg60c4W3Cr1ikcMq4pLh5LusNn2G6vWAXKQRvd1sTnKiMcGZlbFAxLM0G20WDAYs3BVWeX8HnTidUcZrE31yVpPwyUIW5pTB0AVSgGGgKBQ6mKIjlV6nxocC7T/s400/powerbi-03.png" width="400" /></a><br />
<br />
温度と時間を選択し、折れ線グラフを表示させてみます。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvj9qH0Pw1k-ybNH2j9J_gav5vjBxxWQ-eEgMLxugu4YRMgdcerHaxOSCJtgKZ4oDUaX8y4YtWVloKcIRO2roruZEXHBV8TTW8PtTQ73ck8zpXxIqr1YFepBeTo_T4HufyOIN8KOP6cTTG/s1600/powerbi-04.png" imageanchor="1"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvj9qH0Pw1k-ybNH2j9J_gav5vjBxxWQ-eEgMLxugu4YRMgdcerHaxOSCJtgKZ4oDUaX8y4YtWVloKcIRO2roruZEXHBV8TTW8PtTQ73ck8zpXxIqr1YFepBeTo_T4HufyOIN8KOP6cTTG/s400/powerbi-04.png" width="400" /></a><br />
<br />
上記の画面が確認できれば、今回のチュートリアルは終了です。<br />
<br />
<b><span style="font-size: large;">8.さいごに </span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
サンプル画面数が非常に多い記事となりましたが、Azureでの作業はデプロイ時間が短いこともあり、作業自体は非常に短時間で終わると思います。<br />
<br />
とりあえず、tipsとしては"-"を使わない。これにつきます。<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-40242856553976364452016-03-30T12:46:00.000+09:002016-04-08T04:06:55.064+09:00OpenBlocks IoT Familyをユーザー定義スクリプトと組み合わせて遠隔地へのアクセス手段として利用するOpenBlocks IoT Family には、モバイル回線での接続が可能なモデルがあります。モバイル回線を使って、遠隔地のアクセス手段にOpenBlocks IoT Familyを利用する方法を紹介します。<br />
<br />
<div style="background-color: #ffc78e; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<h3>
はじめに</h3>
<div>
<br /></div>
OpenBlocks IoT Family (以下OpenBlcoks)には、モバイル回線の通信機能があります。IoTゲートウェイとしては多くの場合常時ネットワーク接続手段の一つとして利用しますが、 OpenBlocksでは<b>モバイル</b><b>回線の ON / OFF を SMS のメッセージによって制御する機能</b>が用意されています。つまり通常時は通信していない状態にしておき、必要な時だけ回線を接続できるのです。また <b>SMS を使ってあらかじめ設定しておいたシェルスクリプトを動かす機能</b>もあります。これらのSMSによる制御機能を活用して、遠隔地のネットワークへアクセス手段としての OpenBlocks を利用します。<br />
<br />
なお <b>SMS を使って OpenBlocks を制御するためには、SMS に対応した SIM を使う必要があります</b>。データ通信のみの SIM では SMS を扱うことはできませんのでご注意下さい。<br />
<br />
<h3>
リモートアクセス</h3>
<div>
<br /></div>
次の図を見て下さい。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmSvin-c7LemFjO9TL2waISfVTesJKKwOIhQn_BCMRXkwidHvSg2CD0Tn_tU97oaKqVXxAPv-kGykQVv0AGAMebZJ82gKYjuBlyT1lx5mjaNhgZQ0r3w1xObTTiyb_2dZ2P77vohgQx_Y/s1600/Screenshot+2016-03-25+16.31.14.png" imageanchor="1"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmSvin-c7LemFjO9TL2waISfVTesJKKwOIhQn_BCMRXkwidHvSg2CD0Tn_tU97oaKqVXxAPv-kGykQVv0AGAMebZJ82gKYjuBlyT1lx5mjaNhgZQ0r3w1xObTTiyb_2dZ2P77vohgQx_Y/s400/Screenshot+2016-03-25+16.31.14.png" width="400" /></a><br />
<br />
このような環境で、遠隔地からメンテナンスなどでサーバーにアクセスしたいというのはシステムの運用ではごく普通の要望です。<br />
<br />
OpenBlocks の中身は Debian GNU/Linux のサーバーですので、遠隔地からOpenBlocksへログインできれば、目的のサーバーやネットワーク機器へアクセスできます。このために SSH (Secure Shell)のトンネルを活用してみます。<br />
<br />
<h3>
SSHポートフォワーディング</h3>
<br />
SSHにはTCPの接続を中継する機能が用意されています。これはポートフォワーディングやトンネリングと呼ばれます。このSSHのTCPの中継機能を例をあげて説明しましょう。<br />
<br />
ある会社のオフィス内にWebサーバー HostA があり、インターネット上にシステム運用者がアクセスできるサーバー HostB がある場合を例にします。オフィスには NAT を使ったファイアウォールが用意されていて、オフィス内部からインターネットへは比較的自由にアクセスできるような設定になっています。この場合以下の図のように HostA から HostB へ SSH を経由してログインするのは広く行われています。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiamOwhogZrAy1uRnnf41ZCUQ5EKIOk6gEKC3ZaA7xzt3vXSrb1vXdp2HoUYaHi1B7ApRkM2UVnozSqyY5okUk__mJ0fmF5s6-sXpIWB8Lln2H2bsXVHC6aCgr1GYedkaYYiuZT-fh1c68/s1600/Screenshot+2016-03-28+14.48.34.png" imageanchor="1"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiamOwhogZrAy1uRnnf41ZCUQ5EKIOk6gEKC3ZaA7xzt3vXSrb1vXdp2HoUYaHi1B7ApRkM2UVnozSqyY5okUk__mJ0fmF5s6-sXpIWB8Lln2H2bsXVHC6aCgr1GYedkaYYiuZT-fh1c68/s400/Screenshot+2016-03-28+14.48.34.png" width="400" /></a><br />
<div>
<br /></div>
<div>
ここでインターネット側にある HostB から HostA に SSH でログインしたい場合どうしたら良いのでしょうか。<br />
<br />
前述の通り HostA → HostB は特別な設定を行わなくても SSH で接続できるのは明らかですが、HostB → HostA の SSH 接続はファイアウォールがあることと、HostA がプライベート IP アドレスを利用しているため簡単にはできません。ここで利用するのが SSHによるポートフォワーディングです。<br />
<br />
次の図を見てください。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDRIpar69KYIn9PmNredaeGsNmmQ25MF9ZXnazzxXj9BWIa8BbJm_5lrypzuFlNPYs4ATxXVVgIuB8RpBSqLH99RiZQO9bIpCAdGk4mzIMS9ls3R6scr22Vsng8EfQ4lHXNKOquJHU-Xw/s1600/Screenshot+2016-03-28+15.01.09.png" imageanchor="1"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDRIpar69KYIn9PmNredaeGsNmmQ25MF9ZXnazzxXj9BWIa8BbJm_5lrypzuFlNPYs4ATxXVVgIuB8RpBSqLH99RiZQO9bIpCAdGk4mzIMS9ls3R6scr22Vsng8EfQ4lHXNKOquJHU-Xw/s400/Screenshot+2016-03-28+15.01.09.png" width="400" /></a><br />
<br />
この例は HostA から接続する際に、SSH のポートフォワーディングの設定で、HostB のIPv4 ループバックアドレスである 127.0.0.1 のポート番号 10022 を、HostA の IPv4 ループバックアドレスである 127.0.0.1 の ポート番号 22 つまり HostA の SSH サービスへ接続しています。<br />
<br />
具体的には HostA から HostB へ SSH 接続する場合に次のように SSH コマンドに -R オプションを指定して起動します。(注:今回 SSH接続のオプションは全てコマンドの引数で指定していますが、これらは SSH の config ファイルで指定できます)<br />
<br />
<div style="background-color: #ddddff; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">HostA$ <b>ssh -R 10022:127.0.0.1:22 HostB</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">.........</span><span style="font-family: "courier new" , "courier" , monospace;">.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">.....</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">.........</span><span style="font-family: "courier new" , "courier" , monospace;">.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">HostB$ </span></div>
<br />
SSH で HostA から HostB へログインできたら、前述のポートフォワーディングが設定できています。この状態になれば HostB 側で 次のように IPv4 アドレスで 127.0.0.1 ポート番号 10022 に接続する ssh コマンドを実行すると、HostA へログインできます<br />
<br />
<div style="background-color: #ddddff; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">HostB$ <b>ssh -p 10022 127.0.0.1</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">.........</span><span style="font-family: "courier new" , "courier" , monospace;">.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">.....</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">..........</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">HostA$ </span></div>
<br />
<h3>
リモートアクセスのための SSH の設定</h3>
</div>
<div>
<br />
SSH ポートフォワーディングを理解できたところで、OpenBlocks を設定してみます。前述の例で HostA が OpenBlocks となります。</div>
<div>
<br /></div>
<div>
まずは OpenBlocks で SSH ログイン認証のための鍵を作ります。機械的なログインに利用するため、パスフレーズは空にします。<br />
<br />
<div style="background-color: #ddddff; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">root@obsiot:~# </span><b style="font-family: 'courier new', courier, monospace;">ssh-keygen -t ecdsa -N "" -C "Remote Access for BX1"</b><br />
<span style="font-family: "courier new" , "courier" , monospace;">Generating public/private ecdsa key pair.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Enter file in which to save the key (/root/.ssh/id_ecdsa):</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Your identification has been saved in /root/.ssh/id_ecdsa.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Your public key has been saved in /root/.ssh/id_ecdsa.pub.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">The key fingerprint is:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">13:4d:49:02:63:b6:e5:ac:2b:77:c3:46:bb:d1:63:42 Remote Access for BX1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">The key's randomart image is:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">+--[ECDSA 256]---+</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| =.o.o. |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| o * +. |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| . + . |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| . . |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| . E |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| = + |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| . o O + |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| o o * . |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">| . |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">+-----------------+</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">root@obsiot:~#</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">root@obsiot:~# </span><b style="font-family: 'courier new', courier, monospace;">ls -l .ssh/id_ecdsa*</b><br />
<span style="font-family: "courier new" , "courier" , monospace;">-rw------- 1 root root 227 Mar 29 11:43 .ssh/id_ecdsa</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">-rw-r--r-- 1 root root 183 Mar 29 11:43 .ssh/id_ecdsa.pub</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">root@obsiot:~#</span></div>
<br />
この鍵を HostB との間でログインに使うため、authorized_keys を設定します。<br />
<br />
<div style="background-color: #ddddff; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">root@obsiot:~# <b>cat .ssh/id_ecdsa.pub >> .ssh/authorized_keys</b></span></div>
<br /></div>
<div>
またこの鍵のペアを HostB の SSH でログインするユーザー(ここでは tunuser )の ~/.ssh ディレクトリに設定します。<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: 'Hiragino Kaku Gothic ProN'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px;">
</div>
<br />
<div style="orphans: auto; text-align: start; text-indent: 0px; widows: 1;">
<div style="background-color: #ddddff; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">tunuser@HostB$ <b>ls -l .ssh</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">total 8</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">-rw------- 1 tunuser wheel 227 Mar 29 11:43 id_ecdsa</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">-rw-r--r-- 1 tunuser wheel 183 Mar 29 11:43 id_ecdsa.pub</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">tunuser@HostB$ </span><b style="font-family: 'courier new', courier, monospace;">cp .ssh/id_ecdsa.pub .ssh/authorized_keys</b><br />
<span style="font-family: "courier new" , "courier" , monospace;">tunuser@HostB$ </span><b style="font-family: 'courier new', courier, monospace;">ls -l .ssh</b><br />
<span style="font-family: "courier new" , "courier" , monospace;">total 12</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">-rw-r--r-- 1 tunuser wheel 183 Mar 29 12:22 authorized_keys</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">-rw------- 1 tunuser wheel 227 Mar 29 11:43 id_ecdsa</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">-rw-r--r-- 1 tunuser wheel 183 Mar 29 11:43 id_ecdsa.pub</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">tunuser@HostB$ </span></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: 'Hiragino Kaku Gothic ProN'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">
<br /></div>
</div>
以上が設定できたら OpenBlocks から HostB にログインできるかどうかを確認しみます。この時一緒にポートフォワーディングも指定しています。(注:OpenBlocks をインターネットへ接続した状態で実験しています)<br />
<br />
<div style="background-color: #ddddff; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">root@obsiot:~# </span><span style="font-family: "courier new" , "courier" , monospace;"><b>ssh -R 10022:127.0.0.1:22 tunuser@HostB</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">The authenticity of host 'HostB (XXX.XXX.XXX.XXX)' can't be established.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ECDSA key fingerprint is d5:5e:df:18:bb:69:8e:e7:91:11:f5:d5:ff:3d:90:c4.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Are you sure you want to continue connecting (yes/no)? <b>yes</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Warning: Permanently added 'HostB,XXX.XXX.XXX.XXX' (ECDSA) to the list of known hosts.<br />..........</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">.....</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">..........</span><br />
<div>
<span style="font-family: "courier new" , "courier" , monospace;">tunuser@HostB$ </span></div>
</div>
<br />
この通りログインを確認できました。ポートフォワーディングも指定してあるので、HostB 側から OpenBlocks へログインしてみます。(注:OpenBlocks のデフォルトではSSH 接続が閉じているため設定で解放する必要があります)<br />
<br />
<div>
<div style="background-color: #ddddff; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">tunuser@HostB$ </span><b style="font-family: 'courier new', courier, monospace;">ssh -p 10022 root@127.0.0.1</b><br />
<span style="font-family: "courier new" , "courier" , monospace;">The authenticity of host '[127.0.0.1]:10022 ([127.0.0.1]:10022)' can't be established.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ECDSA key fingerprint is 08:03:4c:2f:35:7b:15:d2:99:b8:42:f5:66:8c:3a:68.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">No matching host key fingerprint found in DNS.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Are you sure you want to continue connecting (yes/no)? <b>yes</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Warning: Permanently added '[127.0.0.1]:10022' (ECDSA) to the list of known hosts.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Linux obsiot.example.org 3.10.17-poky-edison #1 SMP PREEMPT Fri Mar 11 12:01:23 JST 2016 i686</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">The programs included with the Debian GNU/Linux system are free software;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">the exact distribution terms for each program are described in the</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">individual files in /usr/share/doc/*/copyright.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">permitted by applicable law.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Last login: Tue Mar 29 11:07:29 2016</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">root@obsiot:~#</span></div>
</div>
<div>
<br />
この通りポートフォワーディングを使って、インターネットにあるサーバー HostB から OpenBlocks へのログインが確認できました。<br />
<br />
<h3>
OpenBlocks の SMS コントロールコマンド(抜粋)</h3>
<div style="margin-left: 0pt;">
<br />
今回のリモートアクセスで利用するSMSコントロールコマンドを以下に挙げます。</div>
<div style="margin-left: 0pt;">
<span id="docs-internal-guid-72452a35-c0ff-43b8-4d3a-65a7e08e339e"><span id="docs-internal-guid-154012cc-c141-d16b-97e4-c367d98056b6"><br /></span></span>
<br />
<table style="border-collapse: collapse; border: none;"><colgroup><col width="106"></col><col width="494"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">コマンド</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">コマンドの内容</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">CON</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">モバイル回線を接続する</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">COFF</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">モバイル回線を切断する</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">SSHON</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">SSHを解放する</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">SSHOFF</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">SSHを閉鎖する</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">USCR1F</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "arial"; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">ユーザー定義のシェルスクリプトの1番をフォアグラウンドで実行する</span></div>
</td></tr>
</tbody></table>
</div>
<div>
<span id="docs-internal-guid-72452a35-c0ff-43b8-4d3a-65a7e08e339e"><span id="docs-internal-guid-154012cc-c141-d16b-97e4-c367d98056b6"><br /></span>OpenBlocks に設定した SIM の電話番号へ SMS を使ってこれらのコマンドを送ると、コマンドに応じて OpenBlocks が動作します。また SMS のコントロールコマンドは複数を"+"で接続して 1通の SMS で送ることで、連続した動作を指定できます。</span></div>
<div>
<br /></div>
<div>
例えば、モバイル回線を接続してユーザー定義シェルスクリプトの1番を実行し、モバイル回線を切断するには次のようなコマンドを送ります。</div>
<div>
<br /></div>
<div>
CON+USCR1F+COFF</div>
<div>
<br /></div>
<h3>
OpenBlocks の設定</h3>
</div>
<div>
<br /></div>
SMS 制御でリモートアクセスを行うための OpenBlocks の設定の要点をまとめてみます。<br />
<br />
<ol>
<li>通常時はモバイル回線は接続せず、回線の ON / OFF は SMS で制御する。</li>
<li>モバイル回線が ON になったら SSH で HostB へ接続してポートフォワーディングを有効にするシェルスクリプトを用意する</li>
</ol>
<br />
まず上記 1 を設定します。これは WEB の設定メニューの「ネットワーク」メニューの「基本」タブの下部にある「サービスネットワーク (モバイル回線)」で設定します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ8Ydc-NmL3UbVFA_2PNS58bXChvOtn2FBL9449kryc4TEiIwKN25lDgjpWCR0ZQfo9eZERMAsl5AAzCMZnvRHAU7rvG1an7n26BEpuJMoAdTsa1unsLi1Gsp1oidHsV7_-ejuvufDSn0/s1600/Screenshot+2016-03-29+14.18.56.png" imageanchor="1"><img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ8Ydc-NmL3UbVFA_2PNS58bXChvOtn2FBL9449kryc4TEiIwKN25lDgjpWCR0ZQfo9eZERMAsl5AAzCMZnvRHAU7rvG1an7n26BEpuJMoAdTsa1unsLi1Gsp1oidHsV7_-ejuvufDSn0/s320/Screenshot+2016-03-29+14.18.56.png" width="320" /></a><br />
<br />
各項目の設定ポイントは次の通りです。<br />
<ul>
<li>[使用設定]は「<b>使用する</b>」を選んでモバイル回線が利用できるようにします。</li>
<li>[APN]、[ユーザー名]、[パスワード]、[認証方式]の項目は利用する SIM に合わせて設定します。</li>
<li>[自動接続]は OpenBlocks の起動時にモバイル回線を接続するかどうかを設定するもので、通常時はモバイル回線は OFF にしておくので「<b>自動接続しない</b>」を選びます。</li>
<li>[SMSコントーロール]は「<b>有効</b>」を選択し、SMS の制御に使う電話番号を登録します。 OpenBlocks ではセキュリティ面から SMS の制御は、登録した電話番号からのみ受け付けるようになっています。</li>
</ul>
</div>
<div>
<br /></div>
<div>
<h3>
SSHポートフォワーディングを起動するシェルスクリプト</h3>
</div>
<div>
<br /></div>
<div>
SSHポートフォワーディングを起動するシェルスクリプトは、[拡張]メニューの[スクリプト編集]のタブで、「ユーザー定義スクリプト1」を選んでから内容を入力します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqJNFZTdUJbepXDIyaNVoraj7jDVTXsYk7HMEb0W8TmqtdaB6uJO4DA0fHCBV9CtczL7A4uQhdk9j-JIB7xOoyTaOrxRkM-DhbDyqE9J-0ImRwnT6YPRKrFFxoIc0xjAfd1ZyaYO1VnUo/s1600/Screenshot+2016-03-29+15.27.16.png" imageanchor="1"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqJNFZTdUJbepXDIyaNVoraj7jDVTXsYk7HMEb0W8TmqtdaB6uJO4DA0fHCBV9CtczL7A4uQhdk9j-JIB7xOoyTaOrxRkM-DhbDyqE9J-0ImRwnT6YPRKrFFxoIc0xjAfd1ZyaYO1VnUo/s400/Screenshot+2016-03-29+15.27.16.png" width="400" /></a><br />
<br />
シェルスクリプトの内容は次の通りです。<br />
<div>
<br />
<div style="background-color: #ddddff; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">#!/bin/sh</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">ssh -T -R 10022:127.0.0.1:22 tunuser@HostB sleep 600</span></div>
<br /></div>
<div>
この ssh コマンドはシェルスクリプトの中で起動するため、ユーザーのインタラクティブなコマンド操作を受け付ける必要はありません。そこで -T オプションを指定して、HostBでの pty を要求しないように設定しています。<br />
<br />
ssh コマンドで HostB に対して「sleep 600」を設定します。これは SSH が 600秒間(つまり10分間)接続し、その後 sleep の終了とともに SSH の接続が終了します。何もしないと 10 分間で接続が切れる設定となります。「え?それじゃ 10分間しか SSH 接続が利用できないの?」という心配の必要はありません。<b>SSH のポートフォワーディングでは、ポートフォワーディングの利用中は SSH 接続が切れることはありません</b>。つまりこのスクリプトが起動してから10分以内にポートフォワーディングの接続を使って、HostB から OpenBlocks へログインすれば、そのポートフォワーディング経由のログインセッションが続いている限りSSH 接続も維持されます。<br />
<br />
以上の設定が完了したら、OpenBlocksを一旦再起動します。<br />
<br />
<h3>
リモートアクセスを使ってみる</h3>
<div>
<br /></div>
<div>
以上の設定が終わったので、実際に試してみましょう。OpenBlocks の SIM の電話番号に対して次の SMS のメッセージを送ります。</div>
<div>
<br /></div>
<div>
<b>CON+SSHON+USCR1F+SSHOFF+COFF</b></div>
<br />
意味は、(1)モバイル回線を接続、(2)SSH接続を許可、(3)ユーザー定義シェルスクリプト1を実行、(4)シェルスクリプトの終了後SSH接続を不許可にし、(5)モバイル回線を切断、ということになります。<br />
<br />
SMS の送信後 40秒ぐらいで OpenBlocks が HostB に SSH 接続を行います。その状態で HostB から以下のコマンドを実行すれば、OpenBlocks へログインできます。<br />
<br />
<div style="background-color: #ddddff; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">tunuser@HostB$ <b>ssh -p 10022 root@127.0.0.1</b></span></div>
<br />
実際に試してみると SSH の接続までに 40秒近くかかるため、SSH 接続が成立したタイミングがはっきりしないという難点があることがわかりました。そこで例えばシェルスクリプトを次のように修正すると、tunuser アカウントのホームディレクトリに 「SSHOK」というファイルがあるか無いかで SSH 接続が成立しているかどうか判断できわかりやすくなります。<br />
<br />
<div>
<div style="background-color: #ddddff; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">#!/bin/sh</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br class="Apple-interchange-newline" />ssh -T -R 10022:127.0.0.1:22 tunuser@HostB 'touch SSHOK ; sleep 600 ; rm SSHOK'</span></div>
</div>
<br />
この他にもシェルスクリプトを工夫することで、HostB が停止している場合は別の HostC へ接続するなど様々なバリエーションが考えられます。<br />
<br />
<h3>
終わりに</h3>
<br class="Apple-interchange-newline" />
SSH ポートフォワーディングは、ここで紹介したものとは逆向きつまり SSH の接続元から接続先へのポートフォワーディングもできます。ちなみに紹介例の向きのポートフォワーディングをリモートフォワード、逆向きをローカルフォワードと言います。本例での HostB から OpenBlocks へ SSH でログインする場合にもポートフォワーディングを併用できるので、サーバーのリモートデスクトップ接続を外部へ中継することなども可能です。<br />
<br />
一昔前でしたらリモートアクセスには電話回線を通じてアナログモデムが使われているのが普通で、サーバーやネットワークのメンテナンスを行う人は必ずモデムを所有していました。しかし今ではモデムを所有している人は少なくなりつつあるどころか、モデムそのものの存在すら知らない人が増えているのも事実です。OpenBlocks のこのような使用例はモデムの代替の一つの解になるのではと思います。</div>
</div>
みんみんhttp://www.blogger.com/profile/13880354640850373463noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-9446503437458641212016-03-04T13:04:00.000+09:002016-03-04T13:04:45.757+09:00OpenBlocks IoT EX1 で microSDXC メモリーカードを利用するOpenBlocks IoT EX1 には microSD メモリーカードスロットが用意されています。このスロットを使って実際に microSDXC メモリーカードを読み書きする方法について説明します。<br />
<br />
<div style="background-color: #ffc78e; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<h3>
はじめに</h3>
<br />
OpenBlocks IoT EX1 (以下EX1)には、筐体内部に microSD メモリーカードスロットがあり microSDXC メモリーカード(以下 microSDXC)を利用できますが、実は、市販されている microSDXC をそのまま利用するためには、EX1側で少し設定作業が必要になります。<br />
<br />
ここでは microSDHC メモリーカード(以下 microSDHC)と比べながら、microSDXC を EX1 で読み書きする方法について説明しましょう。<br />
<br />
本文が長くなったので最後にまとめを用意してあります。ざっくりと概要を知りたい方は最後のまとめをお読みください。<br />
<br />
<h3>
microSDXC と miroSDHC</h3>
<div>
<br /></div>
<div>
今回用意したメモリーカードは次の2枚で、左側の黒いカードが microSDHC 16GB、右側の上部が赤いカードが microSDXC 64GB です。</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxmAQ3oGbnlBn6qxJDchipoNvMuBrQz2X1eKVY0D_aie_8bSAI-7RXRl9XNAY2PTvHDKOTuSCftc6snaZ_WpabfPc8dmx48Ga5IurAPNSqvlrtVJ_dpJwSQ0zFjY2mqR_zT1iTYMNTZX0/s1600/dscf1985.jpg" imageanchor="1"><img border="0" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxmAQ3oGbnlBn6qxJDchipoNvMuBrQz2X1eKVY0D_aie_8bSAI-7RXRl9XNAY2PTvHDKOTuSCftc6snaZ_WpabfPc8dmx48Ga5IurAPNSqvlrtVJ_dpJwSQ0zFjY2mqR_zT1iTYMNTZX0/s320/dscf1985.jpg" width="320" /></a></div>
<div>
<br /></div>
<h3>
microSDHC の利用</h3>
<div>
<br /></div>
<div>
まず microSDHC を EX1 にマウントしてみましょう。<br />
<br />
EX1 で microSD メモリーカードを利用するために EX1 本体の蓋を開ける必要がありますが、蓋を固定してあるネジを外す際は次のような<b>グリッップの太いしっかりした0番のプラスドライバー</b>を利用してください。</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1FqrekqqSO3JKb_ukioSHmEjZOoUHxvYYBchDROVcHDN7oTq_SSzO6lzsFsnbzeD2h19KiEpZGODAEzRttFyAgc1VGeTOCZ9RqWUlf24voFjj3ecClUHV505DEmqBfQPzebrSC-AdJwE/s1600/dscf1986-001.jpg" imageanchor="1"><img border="0" height="53" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1FqrekqqSO3JKb_ukioSHmEjZOoUHxvYYBchDROVcHDN7oTq_SSzO6lzsFsnbzeD2h19KiEpZGODAEzRttFyAgc1VGeTOCZ9RqWUlf24voFjj3ecClUHV505DEmqBfQPzebrSC-AdJwE/s400/dscf1986-001.jpg" width="400" /></a></div>
<div>
<br /></div>
<div>
よくある細い精密ドライバーでは力が十分にかからず、ネジを開けられないことがあります。</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg4q2ZeXSPsvR_jPzJEakZPNOlcXsyjzMP9id7zaRJABym7hni7jmtSJs_0F3d_sn8DtWmU5pjnsGtfC9WyOpGeFXOK1BliYxthrjYTKB-hOFrum4EJWSSeTSymV9WCxTSfYyT2F6oBfk/s1600/dscf1983.jpg" imageanchor="1"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg4q2ZeXSPsvR_jPzJEakZPNOlcXsyjzMP9id7zaRJABym7hni7jmtSJs_0F3d_sn8DtWmU5pjnsGtfC9WyOpGeFXOK1BliYxthrjYTKB-hOFrum4EJWSSeTSymV9WCxTSfYyT2F6oBfk/s200/dscf1983.jpg" width="200" /></a></div>
<div>
<br /></div>
<div>
この写真は microSDHC を EX1 に差し込んでいる途中の状態です。このままカチっと音がするまで奥に差し込みます。完全に差し込むと次のようになります。</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzVAEWei6vYcUO-s0mIu1ecsWKtAejdp7TiK5PL6wye33noU5IKaNahX9MFOhUHqv33JgdMw5x76fMMJpdYa-EdZrvmOXs3lZzaW5OvbVWVGIQ3zjo4NwujJG58qij98oELlpz_zcxTMk/s1600/dscf1984.jpg" imageanchor="1"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzVAEWei6vYcUO-s0mIu1ecsWKtAejdp7TiK5PL6wye33noU5IKaNahX9MFOhUHqv33JgdMw5x76fMMJpdYa-EdZrvmOXs3lZzaW5OvbVWVGIQ3zjo4NwujJG58qij98oELlpz_zcxTMk/s200/dscf1984.jpg" width="200" /></a></div>
<div>
<br /></div>
<div>
ここに刺した microSDHC のデバイス名は、/dev/mmcblk1 となります。<br />
<br />
次の例はまだ microSDHC カードを刺していない状態で、デバイスが存在しません。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># ls -l /dev/mmcblk1*</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ls: cannot access /dev/mmcblk1*: No such file or directory</span></div>
<div>
<br />
microSDHC を刺すと、次の通りデバイスが現れます。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># ls -l /dev/mmcblk1*</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">brw-rw---T 1 root floppy 179, 128 Feb 24 14:12 /dev/mmcblk1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></span>
<span style="font-family: "courier new" , "courier" , monospace;">brw-rw---T 1 root floppy 179, 129 Feb 24 14:12 /dev/mmcblk1p1</span></div>
<div>
<br />
ここで /dev/mmcblk1 が microSDHC カード全体を表し、/dev/mmcblk1p1 が microSDHC の最初のパーティションを表していて、実際の記憶領域はこのパーティションとなります。<br />
<br />
では実際に /dev/mmcblk1p1 をマウントしてみましょう。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># mount /dev/mmcblk1p1 /mnt </span><span style="font-family: inherit;">← microSDHC パーティションのマウント</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># mount | fgrep /mnt </span><span style="font-family: inherit;">← マウントできたかどうかの確認その1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1 on /mnt type vfat (rw,relatime,fmask=0022, dmask=0022,codepage=437,iocharset=iso8859-1, shortname=mixed,errors=remount-ro)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># df -h /mnt/.</span><span style="font-family: "courier new" , "courier" , monospace;"> </span>← moountできたかどうかの確認その2<br />
<span style="font-family: "courier new" , "courier" , monospace;">Filesystem Size Used Avail Use% Mounted on</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1 15G 2.2M 15G 1% /mnt</span></div>
<div>
<br />
この通りマウントできています。あとは /mnt ディレクトリの配下で microSDHC のデータを読み書きできます。<br />
<br />
ファイルのコピー等必要な作業が終わったら microSDHC を本体から抜きますが、抜く前には必ず unmount します。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># umount /mnt</span></div>
<div>
<br />
これで安全に microSDHC カードを安全に本体から抜くことができます。<br />
<br />
<h3>
microSDXC の利用</h3>
<br />
今度は microSDXC で同様の作業を行ってみましょう。<br />
<br />
まず本体に microSDXC カードを挿入します。<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ZRAMpiOX3ws_B7NVPoRwHmeFHK1nU_g29xyExZS4HxR-NWmrJMGrzr9bidRDi_HSUoXGRIcT4S9XxjtL9kwVG4ZYzT9Bm5l8n3pqIJzqJpYYGDJsisPxQkP1eiA5yr8fDPm56S36KL0/s1600/dscf1980.jpg" imageanchor="1"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ZRAMpiOX3ws_B7NVPoRwHmeFHK1nU_g29xyExZS4HxR-NWmrJMGrzr9bidRDi_HSUoXGRIcT4S9XxjtL9kwVG4ZYzT9Bm5l8n3pqIJzqJpYYGDJsisPxQkP1eiA5yr8fDPm56S36KL0/s200/dscf1980.jpg" width="200" /></a><br />
<br />
写真は差し込み途中のものですが、奥までしっかり差し込んで下さい。正しく差し込めば次のように microSDXC のデバイスが現れます。microSDXC でもデバイス名は microSDHC と同じ名前です。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># ls -l /dev/mmcblk1*</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">brw-rw---T 1 root floppy 179, 128 Feb 24 14:42 /dev/mmcblk1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">brw-rw---T 1 root floppy 179, 129 Feb 24 14:42 /dev/mmcblk1p1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span></div>
<div>
<br />
ではマウントしてみましょう<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># mount /dev/mmcblk1p1 /mnt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">mount: unknown filesystem type 'exfat'</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span></div>
</div>
</div>
</div>
</div>
</div>
<br />
exfatは知らないファイルシステムだというエラーメッセージが表示されました。df コマンドや、mount コマンドの結果を見ても次のように microSDXC のマウントはできていません。</div>
<div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: 'Hiragino Kaku Gothic ProN'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px;">
<div>
</div>
</div>
<br />
<div style="orphans: auto; text-align: start; text-indent: 0px; widows: 1;">
<div>
<div style="background-color: #f6f6f6; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># mount | fgrep /mnt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># df /mnt/.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Filesystem 1K-blocks Used Available Use% Mounted on</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/root 198337 156166 31931 84% /</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span></div>
</div>
<div>
<br /></div>
マウントに失敗した理由は、<b>市販の microSDXC は exFAT 形式でフォーマットされていて、OpenBlocks IoT Familyの標準の状態では exFAT 形式のドライバを持っていないからです。</b><br />
<br />
これに対して microSDHC は FAT32 形式でフォーマットしてあり、元々カーネルがドライバを持っています。<br />
<div>
<br /></div>
exFAT 形式のディスクを読み書きするためのドライバとツール類は、Debianのパッケージで用意されています。次のように exFAT 用のパッケージを探してみましょう。<br />
<div>
<div>
<div>
</div>
</div>
<br />
<div>
<div style="background-color: #f6f6f6; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># apt-get update </span><span style="font-family: inherit;">← パッケージインデックスの更新</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Hit http://ftp.plathome.co.jp ./ Release.gpg</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">---------- 中略 ---------- 中略 ----------</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Hit http://cdn.debian.or.jp wheezy-updates/main Translation-en</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Reading package lists... Done</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># apt-cache search exfat </span><span style="font-family: inherit;">← exFAT関係のパッケージの検索</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">exfat-utils - utilities to create, check, label and dump exFAT filesystem</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">exfat-fuse - read and write exFAT driver for FUSE</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span></div>
</div>
</div>
<br />
exfat-utils と exfat-fuse が見つかりました。ここでは exfat-utils をインストールします。exfat-fuse 並びに他に必要なパッケージが一緒にインストールされます。<br />
<div>
<div>
<div>
</div>
</div>
<br />
<div>
<div style="background-color: #f6f6f6; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># apt-get install exfat-utils</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Reading package lists... Done</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Building dependency tree</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Reading state information... Done</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">The following extra packages will be installed:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> exfat-fuse fuse libfuse2</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">The following NEW packages will be installed:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> exfat-fuse exfat-utils fuse libfuse2</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">0 upgraded, 4 newly installed, 0 to remove and 23 not upgraded.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Need to get 348 kB of archives.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">After this operation, 720 kB of additional disk space will be used.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Do you want to continue [Y/n]? y</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">---------- 中略 ---------- 中略 ----------</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Done.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">udev active, skipping device node creation.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Setting up exfat-fuse (0.9.7-2) ...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Setting up exfat-utils (0.9.7-2) ...</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span></div>
</div>
</div>
<br />
これで環境が整ったので microSDXC をマウントしてみます。<br />
<div>
<div>
<div>
</div>
</div>
<br />
<div>
<div style="background-color: #f6f6f6; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># mount /dev/mmcblk1p1 /mnt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">FUSE exfat 0.9.7</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># mount | fgrep /mnt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1 on /mnt type fuseblk (rw,nosuid,nodev,relatime, user_id=0,group_id=0,allow_other,blksize=4096)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># df -h /mnt/.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Filesystem Size Used Avail Use% Mounted on</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1 60G 26M 60G 1% /mnt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span></div>
</div>
</div>
<br />
マウントできたので、簡単に読み書きしてみます。<br />
<div>
<div>
<div>
</div>
</div>
<br />
<div>
<div style="background-color: #f6f6f6; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># cd /mnt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># ls</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># touch test</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># ls</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">test</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># ls -l test</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">-rwxr-xr-x 1 root root 0 Feb 24 15:39 test</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span></div>
</div>
</div>
<br />
microSDXC を抜く時もアンマウントを忘れないようにしてください。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># umount /mnt</span></div>
<div>
<br /></div>
<h3>
microSDXC を EXT4 形式で使う</h3>
<br />
microSDXC は exFAT 形式のまま使うには exFAT 形式サポート用のドライバとユーティリティが必要ですが、カード側をカーネルがサポートしているファイル形式に変換してから使う方法もあります。ここでは Linux で標準的な EXT4 形式でフォーマットしてみましょう。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># fdisk /dev/mmcblk1 </span><span style="font-family: inherit;">← fdisk コマンドでパーテションテーブルを変更する</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Command (m for help): p </span>← 現在の状態を確認する<br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">255 heads, 63 sectors/track, 7764 cylinders, total 124735488 sectors</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Units = sectors of 1 * 512 = 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Sector size (logical/physical): 512 bytes / 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">I/O size (minimum/optimal): 512 bytes / 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Disk identifier: 0x00000000</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> Device Boot Start End Blocks Id System</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1 32768 124735487 62351360 7 HPFS/NTFS/exFAT</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Command (m for help): t </span><span style="font-family: "courier new" , "courier" , monospace;"> </span>← パーテションタイプを変更<br />
<span style="font-family: "courier new" , "courier" , monospace;">Selected partition 1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Hex code (type L to list codes): 83 </span>← Linux の "83" を指定する<br />
<span style="font-family: "courier new" , "courier" , monospace;">Changed system type of partition 1 to 83 (Linux)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Command (m for help): p</span><span style="font-family: "courier new" , "courier" , monospace;"> </span>← 変更結果を確認する<br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">255 heads, 63 sectors/track, 7764 cylinders, total 124735488 sectors</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Units = sectors of 1 * 512 = 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Sector size (logical/physical): 512 bytes / 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">I/O size (minimum/optimal): 512 bytes / 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Disk identifier: 0x00000000</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> Device Boot Start End Blocks Id System</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1 32768 124735487 62351360 83 Linux</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Command (m for help): w</span><span style="font-family: "courier new" , "courier" , monospace;"> </span>← 変更を書き込んで fdisk を終了<br />
<span style="font-family: "courier new" , "courier" , monospace;">The partition table has been altered!</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Calling ioctl() to re-read partition table.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Syncing disks.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># fdisk -l /dev/mmcblk1 </span><span style="font-family: "courier new" , "courier" , monospace;"> </span>← 改めて変更結果を確認<br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Disk /dev/mmcblk1: 63.9 GB, 63864569856 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">255 heads, 63 sectors/track, 7764 cylinders, total 124735488 sectors</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Units = sectors of 1 * 512 = 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Sector size (logical/physical): 512 bytes / 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">I/O size (minimum/optimal): 512 bytes / 512 bytes</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Disk identifier: 0x00000000</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> Device Boot Start End Blocks Id System</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1 32768 124735487 62351360 83 Linux</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># mkfs -t ext4 /dev/mmcblk1p1 ← ext4ファイルシステムの作成</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">mke2fs 1.42.5 (29-Jul-2012)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Filesystem label=</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">OS type: Linux</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Block size=4096 (log=2)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Fragment size=4096 (log=2)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Stride=0 blocks, Stripe width=0 blocks</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">3899392 inodes, 15587840 blocks</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">779392 blocks (5.00%) reserved for the super user</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">First data block=0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Maximum filesystem blocks=0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">476 block groups</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">32768 blocks per group, 32768 fragments per group</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">8192 inodes per group</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Superblock backups stored on blocks:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>4096000, 7962624, 11239424</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Allocating group tables: done</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Writing inode tables: done</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Creating journal (32768 blocks): done</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Writing superblocks and filesystem accounting information: done</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># mount /dev/mmcblk1p1 /mnt ← マウントする</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># mount | fgrep /mnt</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1 on /mnt type ext4 (rw,relatime,data=ordered)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># df /mnt/.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Filesystem 1K-blocks Used Available Use% Mounted on</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">/dev/mmcblk1p1<span class="Apple-tab-span" style="white-space: pre;"> </span>61241372 53064<span class="Apple-tab-span" style="white-space: pre;"> </span>58054356 1% /mnt</span></div>
<div>
<br />
<h3>
まとめ</h3>
<div>
<br />
OpenBlocks IoT EX1 で microSDXC を利用する方法をまとめます。</div>
<div>
<ul>
<li>市販の microSDXC は exFAT 形式でフォーマットされている</li>
<li>exFAT 形式はそのままでは Linux のカーネルがサポートしていないため、次のいずれかの対応が必要となる</li>
<ul>
<li>exFAT 形式のドライバとユーティリティーをインストールして利用する</li>
<li>microSDXC のフォーマットを EXT4 などのLinux のファイルシステムに変換してから利用する</li>
</ul>
</ul>
<div>
<b>microSD メモリーカードはシステム運用に十分な信頼性を確保できない為</b>、ファイル交換やログ保存用等の限定用途で利用するのが安全です。<br />
<br />
また OpenBlocks IoT BX1, BX3 などでも、USB 二股ケーブルとUSBのメモリカードリーダライタを使って microSDXC を読み書きする場合には、同様の手続きが必要になります。</div>
</div>
</div>
</div>
</div>
みんみんhttp://www.blogger.com/profile/13880354640850373463noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-19438907152140878852016-02-26T11:59:00.000+09:002016-02-26T11:59:52.362+09:00OpenBlocks IoT Family で一時的な Wi-Fi クライアント接続を行うWeb ユーザーインターフェースの設定を変更せず、一時的に Wi-Fi クラアントとして OpenBlocks IoT Family を既設の Wi-Fi ネットワークへ接続する方法を紹介します。<br />
<br />
<div style="background-color: #ffc78e; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
OBDN 技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<h3>
はじめに</h3>
<br />
OpenBlocks IoT Family(以下OpenBlocks)の初期設定では、Wi-Fi インターフェースはアクセスポイントとして動作するようになっています。常時 3G や LTE のモバイル回線を利用する場合にこの設定は便利ですが、メンテナンス等の目的で一時的に Wi-Fi クライアントとして既設の Wi-Fi ネットワーク環境に接続したいことがあります。<br />
<br />
もちろん Web ユーザーインターフェース経由で設定を変更しても良いのですが、設定を戻すのを忘れて別のネットワーク環境に移った場合、Web ユーザーインターフェースへアクセスできず、設定の初期化が必要になるなど後々少々面倒くさいことになります。<br />
<br />
そこで Web ユーザーインターフェースの設定を変更せずに、一時的に OpenBlocks を Wi-Fi クライアントとして既設ネットワークへ接続する方法を紹介します。<br />
<br />
<h3>
Wi-Fi のアクセスポイントモードとクライアントモード</h3>
<br />
はじめに Wi-Fi のアクセスポイントになっている OpenBlocks がどういう状態であるかを整理してみましょう。ネットワークインターフェース(以下I/F)としては次のような状態になっています。<br />
<ul>
<li>Wi-Fi I/F はアクセスポイントモードに設定</li>
<li>Wi-Fi I/F で DHCP のサービスが稼働</li>
</ul>
したがって次の三つを行えば、アクセスポイントモードからクライアントモードへ切り替えて、既設の Wi-Fi ネットワークに接続できます。<br />
<ol>
<li>DHCP サービスを停止</li>
<li>Wi-Fi I/F をアクセスポイントモードからクライアントモードへ変更</li>
<li>Wi-Fi クライアントとして必要な設定の投入</li>
</ol>
<div>
これらを順に説明します。<br />
<br /></div>
<div>
<h3>
DHCP サービスの停止</h3>
</div>
<br />
DHCP サービスを停止するにはサービスを実施しているプロセスの dhcpd を停止するだけです。dhcpd については単純にkillで問題ありません。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># killall dhcpd</span></div>
<br />
<h3>
Wi-Fi I/F をアクセスポイントモードからクライアントモードへ変更</h3>
<br />
Wi-Fi I/F をアクセスポイントをクライアントのモードへ切り替えるのは、少し複雑です。というのも Wi-Fi I/F のドライバーがカーネルモジュールになっていて、モジュールのロード時にモード設定を行っているからです。また Wi-Fi アクセスポイントをサービスする hostapd というプロセスも動いています。手順としては次のようになります。<br />
<ol>
<li>hostapd の停止</li>
<li>Wi-Fi I/F の停止</li>
<li>ドライバーのモードの切り替え</li>
<li>Wi-Fi I/F の起動</li>
</ol>
具体的には次の各コマンドを実行します。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># killall hostapd</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># ifdown wlan0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># modprobe -r bcm4334x</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># modprobe bcm4334x op_mode=1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># ifup wlan0</span></div>
<div>
<br /></div>
<h3>
Wi-Fi クライアントとして必要な設定</h3>
<div>
<br />
以上まで完了したら、後は一般的な Linux を Wi-Fi に接続する場合と同じ手順となります。Wi-Fi クライアントとして必要な設定を行うには、次の2つの手順を踏むことになります。</div>
<div>
<ol>
<li>既設 Wi-Fi 環境への接続</li>
<li>DHCP クライアントとして設定</li>
</ol>
</div>
<div>
既設 Wi-Fi 環境へ接続するためには、SSID(ESSID)とパスフレーズを用意してwpa_supplicant を設定します。wpa_supplicant の設定の詳細は省略しますが、以下の例では /var/run/wpa.conf ファイルで Wi-Fi 接続の設定を行っています。最後に dhclient プログラムを起動すれば完了です。</div>
<div>
<br /></div>
<div>
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"># cat /var/run/wpa.conf</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ctrl_interface=/var/run/wpa_supplicant</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">network={</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ssid="WIFISSID"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> scan_ssid=1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> key_mgmt=WPA-PSK</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> psk="PASSWORD"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># wpa_supplicant -s -B -P /var/run/wpa_supplicant.wlan0.pid ¥</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> -i wlan0 -D nl80211,wext -c /var/run/wpa.conf</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># dhclient -v -pf /run/dhclient.wlan0.pid ¥</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> -lf /var/run/dhclient.wlan0.leases wlan0</span></div>
</div>
<div>
<br /></div>
<div>
以上で Wi-Fi クライアントへの切り替えは完了です。この作業では何ら設定を保存していないため次に OpenBlocks を再起動した場合は本来の設定が有効になり、Wi-Fi I/F はアクスセスポイントとして動作します。</div>
<div>
<br /></div>
<h3>
Wi-Fi クライアント設定のシェルスクリプト</h3>
<div>
<br />
上記に紹介した作業を毎回手作業で実施するには手順が多すぎますので、これらを実施するシェルスクリプトを最後に紹介します。</div>
<div>
<div>
<br /></div>
<div>
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
<span style="font-family: "courier new" , "courier" , monospace;">#!/bin/sh</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">OpenBlocks IoT familyでWebのユーザーインターフェースの設定を変更せず</span><span style="font-family: "courier new" , "courier" , monospace;">、</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">一時的にWi-Fiをクライアント設定に変更するシェルスクリプト</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;"><span style="font-family: "courier new" , "courier" , monospace;">このスクリプト中でsleep 1を多用しているのは、立て続けにコマンドを起</span><span style="font-family: "courier new" , "courier" , monospace;">動</span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">するとうまく動かないものがあるため、待ち時間を確保している</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">export PATH</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">次の2行はWi-Fi環境に合わせて設定する</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">SSID=WIFISSID<span class="Apple-tab-span" style="white-space: pre;"> </span># </span><span style="font-family: inherit;">Wi-Fi接続先のSSID</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">WKEY=PASSWORD<span class="Apple-tab-span" style="white-space: pre;"> </span># </span><span style="font-family: inherit;">Wi-Fi接続先のパスフレーズ</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">IF=wlan0<span class="Apple-tab-span" style="white-space: pre;"> </span># </span><span style="font-family: inherit;">無線I/F名 OpenBlocksの場合wlan0</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">WPACONF=/var/run/wpa.conf<span class="Apple-tab-span" style="white-space: pre;"> </span># </span><span style="font-family: inherit;">wpa_supplicantの設定ファイル名</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># Wi-Fi I/Fのモード切り替え</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">killall dhcpd hostapd<span class="Apple-tab-span" style="white-space: pre;"> </span>; sleep 1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ifdown wlan0<span class="Apple-tab-span" style="white-space: pre;"> </span>; sleep 1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">modprobe -r bcm4334x<span class="Apple-tab-span" style="white-space: pre;"> </span>; sleep 1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">modprobe bcm4334x op_mode=1<span class="Apple-tab-span" style="white-space: pre;"> </span>; sleep 1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ifup wlan0<span class="Apple-tab-span" style="white-space: pre;"> </span>; sleep 1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">/etc/network/interfaces の記載によって</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">ifupで付加される余計なIPアドレスの削除</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">ip addr del 192.168.254.254/24 dev ${IF}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">wpa_supplicantの設定ファイル(ここでは/var/run/wpa.conf)の生成</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">一般的なWPAの事前共有鍵の設定を前提にしているため、</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;"><span style="font-family: inherit;">Wi-Fi環境の設定に</span>応じて修正する</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">cat <<-EOT >$WPACONF</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>ctrl_interface=/var/run/wpa_supplicant</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>network={</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span> ssid="$SSID"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span> scan_ssid=1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span> key_mgmt=WPA-PSK</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span> psk="$WKEY"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">EOT</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">wpa_supplicantの起動</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">wpa_supplicant -s -B -P /var/run/wpa_supplicant.${IF}.pid \</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>-i ${IF} -D nl80211,wext -c $WPACONF</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">sleep 1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">dhcpクライアントサービスの起動</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">dhclient -v -pf /run/dhclient.${IF}.pid \</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>-lf /var/run/dhclient.${IF}.leases ${IF}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">Wi-Fi経由でのssh 接続を許可する場合、</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># </span><span style="font-family: inherit;">以下のコメントアウトを外してiptablesの行を有効にする</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"># iptables -A INPUT -p tcp --dport ssh -j ACCEPT</span></div>
</div>
</div>
<div>
<br /></div>
みんみんhttp://www.blogger.com/profile/13880354640850373463noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-8661948528730616112015-11-05T12:09:00.002+09:002015-11-27T09:53:25.557+09:00OpenBlocks 600D向けDebian8ファームウェアの非公式(Unofficial)リリースについて非公式となりますが、OpenBlocks 600D向けのDebian8パッケージを公開しました。<br />
<br />
レポジトリは以下の場所となります。<br />
<br />
<pre wrap=""><a class="moz-txt-link-freetext" href="http://ftp.plathome.co.jp/pub/OBS600/unofficial/debian/jessie/">http://ftp.plathome.co.jp/pub/OBS600/unofficial/debian/jessie/</a></pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYEPE_wex8a68oz6OM9Qk6RaifLZiocTgz2O8duKTV5dF2QRm9xvpVcZnYgcrpBAUCURF0NJHAlgFjK-k4zY0yh4udDpZU9pm4CFEoadIXeK2w_iQ4JJyDnEaz1dW3Mp2PHrYw4ypsyyop/s1600/obs600d_02_l.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYEPE_wex8a68oz6OM9Qk6RaifLZiocTgz2O8duKTV5dF2QRm9xvpVcZnYgcrpBAUCURF0NJHAlgFjK-k4zY0yh4udDpZU9pm4CFEoadIXeK2w_iQ4JJyDnEaz1dW3Mp2PHrYw4ypsyyop/s320/obs600d_02_l.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="background-color: #ffc78e; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
本公パッケージの公開にあたり、カスタマーケア等でのサポートは行っておりませんのでご了承の上ご利用願います。</div>
<br />
OBS600用ファームウェア 4.1.8-0の更新手順を記述します。<br />
<a href="https://www.blogger.com/null" name="前準備"></a>
<br />
<h2>
前準備</h2>
<br />
Debian6、Debian7のパッケージは使用できません。<br />
<br />
ラムディスクモード時のflashに保存しているパッケージとストレージ併用モード時のCFに保存しているパッケージは消去する必要があります。<br />
<br />
また、自作したプログラムは共有ライブラリを使用している場合は動作しない可能性があります。staticで作成したプログラムは動作すると思われます。<br />
<br />
<a href="https://www.blogger.com/null" name="ラムディスクモードで使用していた場合"></a>
<br />
<h3>
ラムディスクモードで使用していた場合</h3>
<br />
FLASH ROMのユーザ領域を初期化します。<br />
<ol>
<li>必要なファイルはバックアップをとってください。</li>
<li>shutdown後、INITボタンを押しながら電源ONしてください。</li>
<li>以下のコマンドでFLASH領域を初期化してください。
<code><pre># flashcfg -e
</pre>
</code></li>
</ol>
<a href="https://www.blogger.com/null" name="ストレージ併用モードCFで使用していた場合"></a><br />
<h3>
ストレージ併用モード(CF)で使用していた場合</h3>
<br />
CFをフォーマットします。<br />
<ol>
<li>必要なファイルはバックアップをとってください。</li>
<li>以下のコマンドでストレージ併用モードを解除します。
<code><pre># e2label /dev/sda1 ""
</pre>
</code></li>
<li>shutdown後、INITボタンを押しながら電源ONしてください。</li>
<li>再起動したら、念のため以下のコマンドでFLASH領域を初期化します。(必要なファイルがあった場合はバックアップをとっておいてください。)
<code><pre># flashcfg -e
</pre>
</code></li>
<li>以下のコマンドでCFをフォーマットした後、リブートします。
<code><pre># mkfs.ext4 -L DEBIAN /dev/sda1
# reboot
</pre>
</code></li>
</ol>
前準備は完了です。<br />
<a href="https://www.blogger.com/null" name="ファームウェアの更新"></a>
<br />
<h2>
ファームウェアの更新</h2>
<br />
更新の手順は今までのDebianファームウェアと同じです。<br />
まず、Debian8のファームウェアファイルを用意します。<br />
<br />
2015/10/19時点:<br />
<br />
<a href="http://ftp.plathome.co.jp/OBS600/unofficial/jessie/4.1.8-0/kernel-image-4.1.8-0.deb">http://ftp.plathome.co.jp/OBS600/unofficial/jessie/4.1.8-0/kernel-image-4.1.8-0.deb</a><br />
<br />
以下のコマンドでインストールします。<br />
<br />
<pre># dpkg -i kernel-image-4.1.8-0.deb
</pre>
<br />
インストール終了後、再起動してください。<br />
<br />
<h2>
補足</h2>
<br />
今回のファームウェアにおいては、(あまりにも使いにくいという理由で)systemdではなく、sysvinitに変更を行っています。<br />
<br />
<br />
<br />
<h2>
補足その2 (2015/11/26)</h2>
<h2>
</h2>
<pre wrap="">uboot-imageがないというご指摘があり、現在修正作業を行っています。</pre>
<pre wrap="">当面の回避策は以下の通りです。
以下のファイル</pre>
<pre wrap=""> </pre>
<pre wrap=""><a class="moz-txt-link-freetext" href="http://ftp.plathome.co.jp/pub/OBS600/unofficial/jessie/4.1.8-0/uImage.initrd.obs600">http://ftp.plathome.co.jp/pub/OBS600/unofficial/jessie/4.1.8-0/uImage.initrd.obs600</a> </pre>
<pre wrap=""> </pre>
<br /><pre wrap="">をダウンロードします。
以下のコマンドを実行します。
# flashcfg -f uImage.initrd.obs600</pre>
<pre wrap=""> </pre>
<pre wrap=""> </pre>
Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com13tag:blogger.com,1999:blog-3189805224875557512.post-6646360396226378402015-04-17T11:10:00.000+09:002015-04-17T11:11:19.410+09:00[.tested] TI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイ マルチデバイス対応 [BX1]今回は、以前ご紹介したTI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイのマルチデバイス対応の実装方法についてご紹介します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6h8LB7K7nhm6r5M9zGjFNiebto2s1Ja07P6WNLWQBEjne30xkG7QEqaWylnULdpSNyK5o-1ZSsNtPgXNeZteM-hTXt6qTpBiPJZLPl0kwUzzxpJZT-kQXLLgdjsZUhEAmrFLuZExKeOTV/s1600/IMG_2067.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6h8LB7K7nhm6r5M9zGjFNiebto2s1Ja07P6WNLWQBEjne30xkG7QEqaWylnULdpSNyK5o-1ZSsNtPgXNeZteM-hTXt6qTpBiPJZLPl0kwUzzxpJZT-kQXLLgdjsZUhEAmrFLuZExKeOTV/s1600/IMG_2067.JPG" height="300" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="background-color: #ffc78e; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison<br />
<div>
<br /></div>
<div>
<b><span style="font-size: large;">1. 事前準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
ネットワークへの接続、bluetoothの設定、開発環境および関連ツールのインストール、node.jsのインストールにつきましては<a href="http://obdnmagazine.blogspot.jp/2015/03/tested-ti-cc2541-sensor-tagibm-bluemix.html">前々回の記事</a>を参照してください。<br />
<br />
<b><span style="font-size: large;">2. センサーゲートウェイソフトウェアの構築</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
ソフトウェアを構築するディレクトリを作成します。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
# mkdir multi_device<br />
# cd multi_device</div>
<br />
今回必要なモジュールを導入します。<br />
libbluetooth-devパッケージも必要なため、導入していない場合は合わせてインストールしてください。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
# aptitude update<br />
# aptitude install libbluetooth-dev<br />
# npm install async<br />
# npm install getmac<br />
# npm install mqtt<br />
# npm install sensortag</div>
<br />
次に、ゲートウェイプログラムを作成します。<br />
今回は温度データを取得し、Bluemixへ送信するサンプルです。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
# vi multi_st2b.js</div>
<br />
<span style="background-color: #f6f6f6;">multi_st2b.js</span><br />
<span style="background-color: #f6f6f6;"><br /></span>
<br />
<div>
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
var SensorTag = require('sensortag');<br />
var async = require('async');<br />
var mqtt = require('mqtt');<br />
var getmac = require('getmac');<br />
<br />
// constants<br />
var u_port = "1883";<br />
var pub_topic = "iot-2/evt/sample/fmt/json";<br />
var qs_org = "quickstart";<br />
var qs_host = "quickstart.messaging.internetofthings.ibmcloud.com";<br />
var qs_type = "iotsample-ti-bbst";<br />
<br />
// globals<br />
var org = qs_org;<br />
var type = qs_type;<br />
var host = qs_host;<br />
var deviceId;<br />
var clientId;<br />
<br />
getmac.getMac(function(err, macAddress) {<br />
if (err) throw err;<br />
console.log(macAddress);<br />
deviceId = macAddress.replace(/:/g, '').toLowerCase();<br />
clientId = "d:" + org + ":" + type + ":" + deviceId;<br />
console.log('MQTT clientId = ' + clientId);<br />
client = mqtt.createClient(u_port, host, {<br />
clientId : clientId,<br />
keepalive : 30<br />
});<br />
console.log('MAC address = ' + deviceId);<br />
console.log('Go to the following link to see your device data;');<br />
console.log('http://quickstart.internetofthings.ibmcloud.com/#/device/' + deviceId + '/sensor/');<br />
});<br />
<div>
<br /></div>
<div>
<div>
function onDiscover(sensorTag) {</div>
<div>
console.log('discovered: ' + sensorTag.uuid + ', type = ' + sensorTag.type);</div>
<div>
<br /></div>
<div>
sensorTag.on('disconnect', function() {</div>
<div>
console.log('disconnected! ' + sensorTag.uuid);</div>
<div>
});</div>
<div>
<br /></div>
<div>
async.series([</div>
<div>
function(callback) {</div>
<div>
console.log('connectAndSetUp');</div>
<div>
sensorTag.connectAndSetUp(callback);</div>
<div>
},</div>
<div>
function(callback) {</div>
<div>
console.log('readDeviceName: ' + sensorTag.uuid);</div>
<div>
sensorTag.readDeviceName(function(error, deviceName) {</div>
<div>
console.log('\tdevice name = ' + deviceName);</div>
<div>
callback();</div>
<div>
});</div>
<div>
},</div>
<div>
function(callback) {</div>
<div>
console.log('enableIrTemperature');</div>
<div>
sensorTag.enableIrTemperature(callback);</div>
<div>
},</div>
<div>
function(callback) {</div>
<div>
setTimeout(callback, 2000);</div>
<div>
},</div>
</div>
<div>
<div>
function(callback) {</div>
<div>
sensorTag.on('irTemperatureChange', function(objectTemperature, ambientTemperature) {</div>
<div>
<br /></div>
<div>
var tagData = {};</div>
<div>
tagData.d = {};</div>
<div>
<br /></div>
<div>
tagData.d.deviceid = deviceId;</div>
<div>
tagData.d.uuid = sensorTag.uuid;</div>
<div>
tagData.d.rssi = sensorTag.rssi;</div>
<div>
tagData.d.proximity = sensorTag.proximity;</div>
<div>
tagData.d.objectTemperature = objectTemperature.toFixed(1);</div>
<div>
tagData.d.ambientTemperature = ambientTemperature.toFixed(1);</div>
<div>
<br /></div>
<div>
tagData.toJson = function() {</div>
<div>
return JSON.stringify(this);</div>
<div>
};</div>
<div>
<br /></div>
<div>
console.log(pub_topic, tagData.toJson());</div>
<div>
console.log(tagData.toJson());</div>
<div>
client.publish(pub_topic, tagData.toJson() );</div>
<div>
<br /></div>
<div>
console.log(sensorTag.uuid);</div>
<div>
console.log('\tobject temperature = %d °C', objectTemperature.toFixed(1));</div>
<div>
console.log('\tambient temperature = %d °C', ambientTemperature.toFixed(1))</div>
<div>
});</div>
<div>
<br /></div>
<div>
console.log('setIrTemperaturePeriod');</div>
<div>
sensorTag.setIrTemperaturePeriod(1000, function(error) {</div>
<div>
console.log('notifyIrTemperature');</div>
<div>
sensorTag.notifyIrTemperature(function(error) {</div>
<div>
});</div>
<div>
});</div>
<div>
},</div>
<div>
function(callback) {</div>
<div>
console.log('disableIrTemperature');</div>
<div>
sensorTag.disableIrTemperature(callback);</div>
<div>
},</div>
<div>
]</div>
<div>
);</div>
<div>
}</div>
<div>
<br /></div>
<div>
SensorTag.discoverAll(onDiscover);</div>
</div>
</div>
<br /></div>
<b><span style="font-size: large;">3. センサーゲートウェイソフトウェアの起動</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
TI CC2541 SensorTagを複数用意し、上記で作成したJavascriptプログラムを起動します。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
root@bx1:~/multi_device# node multi_st2b.js<br />
34:95:db:28:41:0e<br />
MQTT clientId = d:quickstart:iotsample-ti-bbst:3495db28410e<br />
createClient is deprecated, use connect instead<br />
MAC address = 3495db28410e<br />
Go to the following link to see your device data;<br />
http://quickstart.internetofthings.ibmcloud.com/#/device/3495db28410e/sensor/</div>
<br />
ここでは2台で試してみました。それぞれのセンサータグのサイドボタンを押すと、以下のようなメッセージが表示され、BluemixへMQTTによるデータ送信を開始します。<br />
<br />
<div style="background-color: #f6f6f6; border: 1px solid rgb(208, 208, 208); overflow: auto; padding: 8px; word-wrap: normal;">
discovered: 5c313ec119a5, type = cc2540<br />
connectAndSetUp<br />
discovered: 5c313ebff12e, type = cc2540<br />
connectAndSetUp</div>
<br />
<b><span style="font-size: large;">4. Bluemix側の設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Bluemix側は、<a href="http://obdnmagazine.blogspot.jp/2015/03/tested-ti-cc2541-sensor-tagibm-bluemix.html">前々回</a>、<a href="http://obdnmagazine.blogspot.jp/2015/03/tested-ibeaconibm-bluemix-bx1.html">前回</a>と同じテンプレートが利用できます。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEYMeYEm-M10EL5pOwSETIpzXVIIfihC1qKzGoGB5siouyDvcSPiX9eWUn5wZZ6WMhptJpW9IOXnxZcIWhXdDOLmf4yxpj9XcdJm2_irPA8VzVMtDYia2ile_Pzra2dmaATVxcSFobEUiW/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2015-04-16+18.32.08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6tAR1Q24ZnfJlkGEBYik8es3aX0p1eTjsnw_EpEYHL36pXtiiBO3PZsShMH0qo5k4l4_bHN7m09Jx4Niopc32fvDhJ_OHWpu5S7OoSe5UwquRIn5oEBPNbE8RJ88d2MJkRYeVcsfscOYI/s1600/bluemix-6.jpg" height="208" width="400" /></a></div>
<br />
今回は温度データのみですが、データを追加したい場合はインストールしたsensortagモジュール(node_modules/sensortag)にあるtest.jsなどを参照して、必要なデータを追加してください。<br />
<br />
<b><span style="font-size: large;">5. 最後に</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
今回は、TI CC2541 Sensor Tagを複数接続する例を紹介しました。<br />
さらに詳しい情報が知りたい方は<br />
https://github.com/sandeepmistry/node-sensortag<br />
を参照してください。<br />
<br /></div>
Daisuke Ogawahttp://www.blogger.com/profile/00501586185579150890noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-50053156283699125582015-03-13T16:06:00.002+09:002016-05-31T09:41:17.325+09:00[.tested] 受信したiBeaconの情報をIBM Bluemixで処理するためのゲートウェイ [BX1]<br />
スマホをビーコンの受信機とした位置情報の取得は、現在各地で実証実験が行われているところですが、小型で安価なビーコンタグの普及の加速により、その逆の形として、ビーコンを取り付けたモノや人の位置情報をビーコンの受信機により検知し、クラウド処理する事案が増えています。<br />
<br />
今回は、ibeaconの信号を受信し、uuid、受信したゲートウェイのデバイスID、電波強度であるrssiをIBMのBluemixで処理するためのゲートウェイソフトウェアの例を紹介します。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKsMWPwT5SPK3rDz8IX8zHByzB7zdi2zvgjvu6AkXa_PAj6cpXzK2GPZmOVG_T1svFLmYGjSyaZdEENjfVh_xpOErQ0v3iZtLyJUTm_6nPecV5PsZft6RJ71t5SHcRoy78fb-8ROVwkRz2/s1600/IMG_1998.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKsMWPwT5SPK3rDz8IX8zHByzB7zdi2zvgjvu6AkXa_PAj6cpXzK2GPZmOVG_T1svFLmYGjSyaZdEENjfVh_xpOErQ0v3iZtLyJUTm_6nPecV5PsZft6RJ71t5SHcRoy78fb-8ROVwkRz2/s1600/IMG_1998.JPG" width="400" /></a></div>
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison<br />
<br />
<b><span style="font-size: large;">1. 事前準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
<u><b>・ネットワークへの接続</b></u><br />
<br />
BX1
を外部ネットワークに接続可能な状態にします。本体にSIMを入れることにより3G通信も可能ですが、開発環境の構築や、パッケージの入手などはWifi
環境に接続するか、USB分岐ケーブルにUSB-Etherアダプタなどを利用して有線LAN接続することをおすすめします。<br />
<br />
<u><b>以下、WebUIの無い、先行開発キットでの手順となります。 </b></u><br />
<br />
<u><b>・bluetoothの設定</b></u> <br />
<br />
Bluetoothは、初期状態ではblockしてありますので、rfkillコマンドによりunblockしてください。<br />
具体的には、以下の手順で手動で行うか、<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# bluetooth_rfkill_event &<br />
# rfkill unblock bluetooth</div>
<br />
以下の3行をrc.localに追加します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
bluetooth_rfkill_event &<br />
sleep 1 <br />
rfkill unblock bluetooth</div>
<br />
・node.jsのインストール<br />
<br />
node.jsのインストール方法は、前回の記事を参照してください。<br />
<br />
---<b> </b><br />
<b>WebUIのインストールされた製品を使用される場合は、node.jsパッケージはインストール済、かつbluetooth設定はWebUIより行いますので、以下の手順でnpmだけを追加インストールしてください。</b><br />
<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# export TMPDIR=/var/tmp <br />
# curl -L https://npmjs.org/install.sh | sh</div>
<br />
<br />
<b><span style="font-size: large;">2. ibeaconゲートウェイソフトウェアの構築</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
ソフトウェアを構築するディレクトリを作成します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# mkdir ibeacon<br />
# cd ibeacon</div>
<br />
node.jsを使用してibeaconの送受信を行うbleaconモジュールを導入します。<br />
bleaconの導入には、 libbluetooth-devパッケージも必要なため、導入していない場合は合わせてインストールしてください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# aptitude update<br />
# aptitude install libbluetooth-dev<br />
# npm install bleacon</div>
<br />
bluemixへデータを送信するためのMQTTクライアントライブラリおよび、getmacライブラリをインストールします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# npm install mqtt<br />
# npm install getmac</div>
<br />
次に、ゲートウェイプログラムを作成します。 <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# vi ib2b.js</div>
<br />
ib2b.js<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
var bleacon = require("bleacon");<br />
var mqtt = require('mqtt');<br />
var getmac = require('getmac');<br />
<br />
// constants<br />
var u_port = "1883";<br />
var s_port = "8883";<br />
var pub_topic = "iot-2/evt/sample/fmt/json";<br />
var sub_topic = "iot-2/cmd/blink/fmt/json";<br />
var qs_org = "quickstart";<br />
var reg_domain = ".messaging.internetofthings.ibmcloud.com";<br />
var qs_host = "quickstart.messaging.internetofthings.ibmcloud.com";<br />
var qs_type = "iotsample-ti-bbst";<br />
var configFile = "./device.cfg";<br />
var ledPath ="/sys/class/leds/beaglebone:green:usr";<br />
var caCerts = ["./IoTFoundation.pem", "IoTFoundation-CA.pem"];<br />
<br />
<br />
// globals<br />
var org = qs_org;<br />
var type = qs_type;<br />
var host = qs_host;<br />
var deviceId;<br />
var clientId;<br />
var password;<br />
var username;<br />
<br />
getmac.getMac(function(err, macAddress) {<br />
if (err) throw err;<br />
console.log(macAddress);<br />
deviceId = macAddress.replace(/:/g, '').toLowerCase();<br />
clientId = "d:" + org + ":" + type + ":" + deviceId;<br />
console.log('MQTT clientId = ' + clientId);<br />
client = mqtt.createClient(u_port, host, {<br />
clientId : clientId,<br />
keepalive : 30<br />
});<br />
console.log('MAC address = ' + deviceId);<br />
console.log('Go to the following link to see your device data;');<br />
console.log('http://quickstart.internetofthings.ibmcloud.com/#/device/' + deviceId + '/sensor/');<br />
bleacon.startScanning();<br />
});<br />
<br />
bleacon.on('discover', function(bleacon) {<br />
var tagData = {};<br />
tagData.d = {};<br />
// console.log(bleacon);<br />
<br />
tagData.d.deviceid = deviceId;<br />
tagData.d.uuid = bleacon.uuid;<br />
tagData.d.rssi = bleacon.rssi;<br />
tagData.d.proximity = bleacon.proximity;<br />
<br />
tagData.toJson = function() {<br />
return JSON.stringify(this);<br />
};<br />
<br />
console.log(pub_topic, tagData.toJson());<br />
console.log(tagData.toJson());<br />
client.publish(pub_topic, tagData.toJson() );<br />
<br />
});</div>
<br />
<b><span style="font-size: large;">3. ゲートウェイソフトウェアの起動</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
ibeaconの送信機を用意して、上記で作成したJavascriptプログラムを起動します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
root@bx1:~/ibeacon# node ib2b<br />
34:95:db:28:41:d2<br />
MQTT clientId3 = d:quickstart:iotsample-ti-bbst:3495db2841d2<br />
createClient is deprecated, use connect instead<br />
MAC address = 3495db2841d2<br />
Go to the following link to see your device data;<br />
http://quickstart.internetofthings.ibmcloud.com/#/device/3495db2841d2/sensor/<br />
iot-2/evt/sample/fmt/json {"d":{"deviceid":"3495db2841d2","uuid":"1ae18c1c6c7b4aedb1664462634da855","rssi":-56,"proximity":"immediate"}}</div>
<br />
デバッグ用にBluemixへ送信するデータの内容をコンソール出力していますので、不要な場合は削除してください。<br />
<br />
<b><span style="font-size: large;">3. Bluemix側の設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Bluemix側は、前回と同じテンプレートが利用できます。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6tAR1Q24ZnfJlkGEBYik8es3aX0p1eTjsnw_EpEYHL36pXtiiBO3PZsShMH0qo5k4l4_bHN7m09Jx4Niopc32fvDhJ_OHWpu5S7OoSe5UwquRIn5oEBPNbE8RJ88d2MJkRYeVcsfscOYI/s1600/bluemix-6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6tAR1Q24ZnfJlkGEBYik8es3aX0p1eTjsnw_EpEYHL36pXtiiBO3PZsShMH0qo5k4l4_bHN7m09Jx4Niopc32fvDhJ_OHWpu5S7OoSe5UwquRIn5oEBPNbE8RJ88d2MJkRYeVcsfscOYI/s1600/bluemix-6.jpg" width="400" /></a></div>
<br />
JSON形式で出力されるデータは、<br />
deviceid: ゲートウェイのアドレス<br />
uuid: 検出したibeaconのuuid<br />
rssi: 電波強度<br />
proximity: 相対距離の情報<br />
となります。<br />
<br />
bleaconライブラリで得られるパラメータを追加したい場合は、以下のJavascriptプログラムの出力を参考にしてください。<br />
<br />
discover.js<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
var Bleacon = require("bleacon");<br />
Bleacon.startScanning();<br />
Bleacon.on("discover", function(bleacon) {<br />
console.dir(bleacon);<br />
});</div>
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
root@bx1:~/ibeacon# node discover.js<br />
{ uuid: '1ae18c1c6c7b4aedb1664462634da855',<br />
major: 0,<br />
minor: 0,<br />
measuredPower: -82,<br />
rssi: -49,<br />
accuracy: 0.22312232579283153,<br />
proximity: 'immediate' }</div>
<br />
<b><span style="font-size: large;">4. 最後に</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
iBeaconのハードウェアレポートに関しては、若干古い情報にはなりますが、以下のページが参考になると思います。<br />
<h1 class="entry-title">
<a href="http://www.aislelabs.com/reports/beacon-guide/"><span style="font-size: small;"><span style="font-weight: normal;">The Hitchhikers Guide to iBeacon Hardware: A Comprehensive Report by Aislelabs</span></span></a></h1>
<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-2974669496868279012015-03-11T16:54:00.000+09:002016-01-30T15:35:14.684+09:00[.tested] TI CC2541 Sensor TagのデータをIBM Bluemixで処理するためのセンサーゲートウェイ [BX1]この1月24日,25日に、天王洲のSamurai Startup Islandにおいて、<br />
<br />
<a href="http://everevo.com/event/18373">「IoTハック新年会2015」</a><br />
<br />
を行いました。<br />
このイベントは、IBMとSamurai Incubateが共催で『日常生活で使うモノ』をテーマ行うアイディアソン、ハッカソンで、クラウド環境としては、IBM BlueMix、デバイスとしては、TI CC2541センサータグ、ゲートウェイとして、OpenBlocks BX1を用意しています。<br />
<br />
今回は、上記ハッカソンで使用した、OpenBlocks BX1側のTI CC2541 SensorTagデバイスゲートウェイ実装方法について紹介します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1qZ7jKprYjW8WSrlVg20Y5Z5PSIh5sTK8HOtQ1d-T1kvVAqIPibhr2_KbFjvQm3A88YmGGGibGAr8yuSe0k5bEaBug4pD3BL0NyQ7NOznIoMXjSX39Xq0SjRIZpIIYGjZ2iLZ2lJJ3mkZ/s1600/IMG_1996.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1qZ7jKprYjW8WSrlVg20Y5Z5PSIh5sTK8HOtQ1d-T1kvVAqIPibhr2_KbFjvQm3A88YmGGGibGAr8yuSe0k5bEaBug4pD3BL0NyQ7NOznIoMXjSX39Xq0SjRIZpIIYGjZ2iLZ2lJJ3mkZ/s1600/IMG_1996.JPG" width="400" /></a></div>
<br />
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
OpenBlocks IoT BX1 Debian wheezy 7.8 / kernel 3.10.17-poky-edison<br />
<br />
<b><span style="font-size: large;">1. 事前準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
<u><b>・ネットワークへの接続</b></u><br />
<br />
BX1を外部ネットワークに接続可能な状態にします。本体にSIMを入れることにより3G通信も可能ですが、開発環境の構築や、パッケージの入手などはWifi環境に接続するか、USB分岐ケーブルにUSB-Etherアダプタなどを利用して有線LAN接続することをおすすめします。<br />
<br />
<u><b>以下、WebUIのない、先行開発キットでの事例となります。</b></u> <br />
<br />
<u><b>・bluetoothの設定</b></u> <br />
<br />
Bluetoothは、初期状態ではblockしてありますので、rfkillコマンドによりunblockしてください。<br />
具体的には、以下の手順で手動で行うか、<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# bluetooth_rfkill_event &<br />
# rfkill unblock bluetooth</div>
<br />
以下の3行をrc.localに追加します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
bluetooth_rfkill_event &<br />
sleep 1 <br />
rfkill unblock bluetooth</div>
<br />
<u><b>・開発環境および関連ツールのインストール</b></u><br />
<br />
node.jsをビルドするためには、開発環境が必要です。(IO開発ボード付きセットの場合は開発環境をプリインストールしています)<br />
また、今回必要になるパッケージ類を以下の手順でインストールします。 <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# aptitude update <br />
# tasksel install standard<br />
# aptitude install build-essential<br />
# aptitude install git </div>
<br />
<u><b>・node.jsのインストール</b></u><br />
<br />
node.jsはdebianのパッケージを使用せず、最新版を以下のサイトから入手し、ビルドしています。<br />
<br />
<a href="https://nodejs.org/">Node.js</a><br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# wget http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz<br />
# tar xvzf http://nodejs.org/dist/v0.12.0/node-v0.12.0.tar.gz<br />
# cd node-v0.12.0<br />
# ./configure<br />
# make -j3<br />
# make install</div>
<br />
<b><span style="font-size: large;">2. センサーゲートウェイソフトウェアの構築</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
IBM Internet of Thingsの以下のレシピページより、BeagleBone用のゲートウェイプログラムを入手します。<br />
<br />
<a href="https://developer.ibm.com/iot/recipes/ti-beaglebone-sensortag/">Texas Instruments BeagleBone with SensorTag - Internet of Things:</a><br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# git clone http://github.com/ibm-messaging/iot-beaglebone</div>
<br />
以下のディレクトリに移動し、setup.shを編集し、checkInstall bluezの行をコメントアウトします。<br />
(bluezはすでにインストールされているものを使用します。debian wheezyのaptで導入されるものは、BLEに対応していないバージョンのため使用しません) <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
:<br />
# checkInstall bluez<br />
checkInstall libbluetooth-dev<br />
:</div>
<br />
編集後、setup.shにより、動作環境の構築を行います。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
#./setup.sh</div>
<br />
次に、ゲートウェイプログラム本体の若干の修正を行います。<br />
これは、beaglebone向けに書かれていて、データを受け取りLEDを点滅させる記述があるのですが、 このLEDの点灯処理部分だけをコメントアウトしてしまいます。<br />
ここは、OpenBlocksのLEDの仕様で書き換えれば同様にBluemix側からLEDの点灯処理ができるのですが、今回は行っていません。 <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# vi iot_sensortag.js </div>
<br />
50行以下を以下の様に編集します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
// LED functions<br />
// run asynchronously, callbacks just trap unexpected errors<br />
function ledWrite(extra, content, callback) {<br />
// fs.writeFile(ledPath+extra, content, function(err) {<br />
// if (err) throw err;<br />
// });<br />
// if (callback) callback();<br />
}</div>
<br />
<b><span style="font-size: large;">2. センサーゲートウェイソフトウェアの起動</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
TI CC2541 SensorTagを用意し、編集したJavascriptプログラムを起動します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
root@bx1:~/iot-beaglebone/samples/nodejs# node iot_sensortag.js<br />
Press the side button on the SensorTag to connect</div>
<br />
メッセージに従い、センサータグのサイドボタンを押すと、接続を行い、BluemixへMQTTによるデータ送信を開始します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
root@bx1:~/iot-beaglebone/samples/nodejs# node iot_sensortag.js<br />
Press the side button on the SensorTag to connect<br />
SensorTag connected<br />
Discovering services and characteristics<br />
Device name = TI BLE Sensor Tag<br />
System id = 34:b1:f7:0:0:d5:d5:2a<br />
Serial number = N.A.<br />
Firmware revision = 1.01 (Feb 7 2013)<br />
Hardware revision = N.A.<br />
Software revision = N.A.<br />
Manufacturer name = Texas Instruments<br />
Enable IR temperature<br />
Enable accelerometer<br />
Enable humidity sensor<br />
Enable magnetometer<br />
Enable barometer<br />
Enable gyroscope<br />
MQTT clientId = d:quickstart:iotsample-ti-bbst:98f170697445<br />
MQTT Connected<br />
Sending data<br />
MAC address = 98f170697445<br />
Go to the following link to see your device data;<br />
http://quickstart.internetofthings.ibmcloud.com/#/device/98f170697445/sensor/</div>
<br />
<b><span style="font-size: large;">3. Bluemix側の設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Bluemixは、試用期間が30日あり、登録して30日間は無料ですべての機能を試すことが出来ます。<br />
(無料期間終了後は、クレジットカードの登録が必要ですが、375GB時間までは無料で使用できるようになっています)<br />
<br />
カタログのボイラープレートより、左上のNode-Redを使用したInternet of Things Foundationアプリケーションを選択します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuHUimghUsS4afLJdQ3o3fcF_tdHDvFg4wMRnHr4z1N20S9ilEQJDDF2YAn7v_HMtkEsBZHllg1jBD4uJvtdBYTUtXOm5nsv6vPGhjXO3yZ9dChBPIXTBi9VyYmjAEc-JU6xdso3v6YcgC/s1600/bluemix-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuHUimghUsS4afLJdQ3o3fcF_tdHDvFg4wMRnHr4z1N20S9ilEQJDDF2YAn7v_HMtkEsBZHllg1jBD4uJvtdBYTUtXOm5nsv6vPGhjXO3yZ9dChBPIXTBi9VyYmjAEc-JU6xdso3v6YcgC/s1600/bluemix-1.jpg" width="400" /></a></div>
<br />
インスタンスを起動します <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQBp2dvA2AhhDdB6xEDy-BwrRU3Cwa9gwzvikXOMvrDo_rmg8vcruNUA0AEzqGnZZOrdUjMo0vrB9i_SuQhJAFmO-EjdXf4FfFb1nMe_FYHXhPLkjsHY7WanWKB1T_AtPH2b056aYXdj87/s1600/bluemix-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQBp2dvA2AhhDdB6xEDy-BwrRU3Cwa9gwzvikXOMvrDo_rmg8vcruNUA0AEzqGnZZOrdUjMo0vrB9i_SuQhJAFmO-EjdXf4FfFb1nMe_FYHXhPLkjsHY7WanWKB1T_AtPH2b056aYXdj87/s1600/bluemix-2.jpg" width="400" /></a></div>
<br />
最初に簡単なサンプルプレートがありますので、この左側のIBM IoT App Inに、上記で立ち上げたゲートウェイソフトウェア起動時に表示されるMAC Addressを入力します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFvoKDiZhQ_aBnbl-_wrtDcrlxJN88L-WrXT8gw-eKf4VN7mjKFGzQw1Lz8Ss4DKsjpPT9yd5kAR0lZRGYL_3R4qZMtGbAn0lrTqmlyIUxic9lcbvbLYj3zoPYDZJcR9OWhSOTHvVtCnOd/s1600/bluemix-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFvoKDiZhQ_aBnbl-_wrtDcrlxJN88L-WrXT8gw-eKf4VN7mjKFGzQw1Lz8Ss4DKsjpPT9yd5kAR0lZRGYL_3R4qZMtGbAn0lrTqmlyIUxic9lcbvbLYj3zoPYDZJcR9OWhSOTHvVtCnOd/s1600/bluemix-3.jpg" width="400" /></a></div>
<br />
Deployし、すぐ右にあるDevice Dataのdebugタブを引き出すと、右のDebugウィンドウに、センサータグからデータがJSON形式で送信されていることが確認出来ます。 <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFUJBVjXNGv1EyPMzakvasmo0uvCea-hw5th1d8OWSNpkhWza3sUCBBfYx_mwAFhoHBERQl_MtFg3reRWtISw-iRiPF1RA3fG2kT5iwDp7Fitvc35DV0AW2eMLZif27Z2BRISvNU8BSvi-/s1600/bluemix-4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFUJBVjXNGv1EyPMzakvasmo0uvCea-hw5th1d8OWSNpkhWza3sUCBBfYx_mwAFhoHBERQl_MtFg3reRWtISw-iRiPF1RA3fG2kT5iwDp7Fitvc35DV0AW2eMLZif27Z2BRISvNU8BSvi-/s1600/bluemix-4.jpg" width="400" /></a></div>
<br />
様々な機能が用意されていますので、あとはPaaS側で処理を作成していくことになります。<br />
この環境はそのまま実稼働環境へと移行させることも出来ます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZBN-bMPRmLagxjibYzHeIK4NHSeEGdv5Zm0Bfb4Rbge-TRhv2RU-JzKa67_HZwADQu_J2isDtmOrQ200nxfhsfX9BG4sIokK0LaKhR_K56Wb_n78yFGp61JS7UWIxaooRz2b0LFgxnLcn/s1600/bluemix-5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZBN-bMPRmLagxjibYzHeIK4NHSeEGdv5Zm0Bfb4Rbge-TRhv2RU-JzKa67_HZwADQu_J2isDtmOrQ200nxfhsfX9BG4sIokK0LaKhR_K56Wb_n78yFGp61JS7UWIxaooRz2b0LFgxnLcn/s1600/bluemix-5.jpg" width="400" /></a></div>
<br />
<b><span style="font-size: large;">4. 最後に</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
今回は、TI CC2541 Sensor Tagを利用した例を紹介しました。<br />
ibeacon仕様のビーコンタグのデータをBluemixへ送信するテストプログラムも作成していますので、次回ご紹介します。<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-80824911881104434172014-11-25T16:45:00.001+09:002014-11-25T16:45:25.448+09:00OpenBlocks IoT BX1 ハンズオン開催中<div class="ttl04 mh20">
OpenBlocks IoT BX1のハンズオンDayを正式にスタートしました。<br />
<br />
今週より、BX1本体およびDockBoard(ES版)との組み合わせにてご利用いただけます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgniqHduF9Fkc3CYPf_38D2ZOKzKQ3g0oMj6tKSBhm5amXj2VNH1ytLd6xhh3Jee1j6C5a12x0NXap8RI5luVAIEjDailOlqhtsAlYyViYs6jWQO1t3lNocd58OmPn-j7wRz2bFxUfoZ1hK/s1600/BX_DockBoard.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgniqHduF9Fkc3CYPf_38D2ZOKzKQ3g0oMj6tKSBhm5amXj2VNH1ytLd6xhh3Jee1j6C5a12x0NXap8RI5luVAIEjDailOlqhtsAlYyViYs6jWQO1t3lNocd58OmPn-j7wRz2bFxUfoZ1hK/s1600/BX_DockBoard.JPG" height="300" width="400" /></a></div>
<br />
天王洲アイル、Samurai Startup Islandにて毎週水曜日(10:00-18:00)に開催。<br />
予約制となりますので、以下の開催概要にそってご予約下さい。<br />
当日でも空いていれば予約可能です。<br />
<br />
現在ほぼマンツーマンのハンズオンとなっており、使用できるセットも限られているため、多人数となる場合は、早めにご連絡いただき、機材などの調整をさせてください。<br />
<br />
<br />
------ <br />
<h3>
「ハンズオンDay」開催概要</h3>
</div>
<ul class="fontM">
<li class="lhL"><span style="font-weight: bold;">実施内容</span><br />
当社IoT向けマイクロサーバー「OpenBlocks® IoT BX1」を使用したハンズオンです。<br />
実際にOpenBlocks® IoT BX1の実機や開発環境に触れながら基本操作の確認や、アプリケーション開発、システム構築に必要となる事項の事前サーベイなどが可能です。<br />
<br />
参考:OpenBlocks® IoT BX1特設サイトURL<br />
<a href="http://openblocks.plathome.co.jp/products/special/bx1_sp/">http://openblocks.plathome.co.jp/products/special/bx1_sp/</a>
</li>
<li class="lhL"><span style="font-weight: bold;">対象となる方</span><br />
IoTのアプリケーション開発や、センサーデバイス接続開発、IoTサービス開発などを検討している方に最適です。
</li>
<li class="lhL"><span style="font-weight: bold;">開催スケジュール</span><br />
原則、毎週水曜日に実施致します。詳細なスケジュールは下記URLよりご確認下さい。<br />
<a href="http://goo.gl/vUxmwv">http://goo.gl/vUxmwv</a>
</li>
<li class="lhL"><span style="font-weight: bold;">参加方法</span><br />
機材の都合上事前予約が必要となります。開催スケジュールをご確認のうえ、当社WEBサイトの参加申込フォームよりお申込み下さい。<br />
<br />
参加申込フォームURL<br />
<a href="https://openblocks.plathome.co.jp/form/bx1_handson/input.html">https://openblocks.plathome.co.jp/form/bx1_handson/input.html</a>
</li>
<li class="lhL"><span style="font-weight: bold;">参加費用</span><br />
無料です。
</li>
<li class="lhL"><span style="font-weight: bold;">開催場所</span><br />
Samurai Startup Island<br />
住所:東京都品川区 東品川2-2-28 Tビル2F<br />
アクセス:天王洲アイル駅より徒歩5分<br />
<a href="http://samurai-startupisland.asia/access">http://samurai-startupisland.asia/access</a></li>
</ul>
Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-90554979162987719942014-10-08T14:09:00.000+09:002014-10-08T14:14:28.297+09:00OpenBlocks IoT BX1 開発者向け情報などOpenBlocks IoTファミリ BX1を発表しました。 <br />
<br />
<a href="http://www.plathome.co.jp/about/press/1409_01.html">M2M・IoTシステムの構築に最適な極小サイズのマイクロサーバー「OpenBlocks® IoTファミリ BX1」を発表</a><br />
<br />
OpenBlocksシリーズは、従来より複数のLANポートを持ち小型堅牢かつ汎用のLinux環境を提供するマイクロサーバとして、ネットワークの監視管理、ゲートウェイなど、様々なシーンで利用していただいていましたが、今回のBX1シリーズにおいては、Wifi/3G/BlueTooth(BLE対応)を標準サポートした、無線通信に重点を置いた製品となっています。<br />
<br />
発表ではスケルトンカバーに入った製品としてお見せしていますが、まずは内部写真をここに公開します。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3e2OPnqSKowZCwmdZskkxNueDA9FRLg2UQl6oSkzkdY_32OMqWEb2A1aZpG5qQoLG2nlDdgf-Hvy09fXZdJwZI0cAB52oqCzKL4Jg1te3aHhTrOq0_WzU8JpXIVnaLAwENSHPl0qd3YlA/s1600/IMG_1717.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3e2OPnqSKowZCwmdZskkxNueDA9FRLg2UQl6oSkzkdY_32OMqWEb2A1aZpG5qQoLG2nlDdgf-Hvy09fXZdJwZI0cAB52oqCzKL4Jg1te3aHhTrOq0_WzU8JpXIVnaLAwENSHPl0qd3YlA/s1600/IMG_1717.JPG" height="300" width="400" /></a></div>
<br />
カバーは試作品のため、スケルトン仕様となっていますが、製品ではホワイトとなる予定です。 <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN0t7IrGUXSA4z9_yBeLpeqAg9JSs8U0dUFceb2_HMvDfXXSqTYko5JEMNu0U52Gr7pG9cc65Vo0FSU2RKEg_DrbHFrS0_f2iPOjW9bLJhjlwV6z7vIwnZVMSWtzsJARPub3B5It7kZUgT/s1600/IMG_1718.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN0t7IrGUXSA4z9_yBeLpeqAg9JSs8U0dUFceb2_HMvDfXXSqTYko5JEMNu0U52Gr7pG9cc65Vo0FSU2RKEg_DrbHFrS0_f2iPOjW9bLJhjlwV6z7vIwnZVMSWtzsJARPub3B5It7kZUgT/s1600/IMG_1718.JPG" height="300" width="400" /></a></div>
<br />
外部コネクタ。上部がオプション有線接続用端子となり、ケーブルを交換することにより、USB(有線LAN含む)、シリアル(RS-232C/RS-485)、GPIO(最大19ポート)に対応します。<br />
下部がSIMスロットです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo1Hyg7UL1Lksy2RzqmHquxNzNrBWCtxuaxBnaLDfYZjFBQSi6bXWXV87PMNnegjSg2ynp87uNzL4cqmUGj6QR033c9aPwAPlgUNbRcWZ2gQpASmGtwNnU2xeL2ERVGtffhi6oEm6TvSd6/s1600/IMG_1720.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo1Hyg7UL1Lksy2RzqmHquxNzNrBWCtxuaxBnaLDfYZjFBQSi6bXWXV87PMNnegjSg2ynp87uNzL4cqmUGj6QR033c9aPwAPlgUNbRcWZ2gQpASmGtwNnU2xeL2ERVGtffhi6oEm6TvSd6/s1600/IMG_1720.JPG" height="300" width="400" /></a></div>
<br />
標準でUSBケーブルが添付します。本ケーブルはUSB側からの給電と、シリアル通信をサポートしており、PCに接続する場合は、 USBシリアル経由のコンソールとして見えます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqkTQf_dF4W_WxHnxqLfLgNJSFGUgRZoURDD95K9qq_h7YOZwZI-MV-TpXaJT1lmE00jDK6sTMxXd8esUMF49xauFF540BUuXa9rM_MAs2cMTSWd7AR_OAEK9HsuN-1RgqqwNTPPPDJwLd/s1600/IMG_1722.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqkTQf_dF4W_WxHnxqLfLgNJSFGUgRZoURDD95K9qq_h7YOZwZI-MV-TpXaJT1lmE00jDK6sTMxXd8esUMF49xauFF540BUuXa9rM_MAs2cMTSWd7AR_OAEK9HsuN-1RgqqwNTPPPDJwLd/s1600/IMG_1722.JPG" height="300" width="400" /></a></div>
<br />
本体基板の裏側です。 <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZn2Cg_RGwPeJ1W22lOVkkD0jyHAFzbcLvVL9nJd9y85xo1lLC_IKsfVJH9MAKfsE_yAlm8IRMW-H65LYa3UYcjw7-q3iTAnR4jVgZxvIOoMNxnc7DZNDhzwZV4hnKltLh8MU7SUnGwgCN/s1600/IMG_1723.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZn2Cg_RGwPeJ1W22lOVkkD0jyHAFzbcLvVL9nJd9y85xo1lLC_IKsfVJH9MAKfsE_yAlm8IRMW-H65LYa3UYcjw7-q3iTAnR4jVgZxvIOoMNxnc7DZNDhzwZV4hnKltLh8MU7SUnGwgCN/s1600/IMG_1723.JPG" height="300" width="400" /></a></div>
<br />
本体基板の上部写真です。<br />
<br />
本体の仕様は以下の通り。<br />
<br />
<table border="1" cellpadding="0" cellspacing="0" class="spec" style="width: 100%px;"><tbody>
<tr><th rowspan="2">CPU</th>
<th>モデル</th>
<td colspan="3">インテル® Atom™ プロセッサー 500MHz (デュアルコア)</td>
</tr>
<tr><th>動作速度</th>
<td colspan="3">500MHz (デュアルコア)</td>
</tr>
<tr>
<th>メインメモリ</th>
<th>オンボード</th>
<td colspan="3">1GB (LPDDR3)</td>
</tr>
<tr>
<th colspan="2" width="25%">FLASH ROM</th>
<td colspan="3">4GB (eMMC)</td>
</tr>
<tr>
<th colspan="2" rowspan="3">内部インターフェイス</th>
<td colspan="3">3G(W-CDMA)※1</td>
</tr>
<tr>
<td colspan="3">Bluetooth 4.0</td>
</tr>
<tr>
<td colspan="3">Wi-Fi (IEEE802.11a/b/g/n)</td>
</tr>
<tr>
<th colspan="2">外部インターフェイス</th>
<td colspan="3">USB 2.0(Type-A)ケーブル<br />
GPIO (最大19ポート) オプションケーブルにて対応<br />
シリアル 1ポート RS-232C/RS-485</td><td colspan="3"></td>
</tr>
<tr>
<th colspan="2" width="25%">寸法 (mm)</th>
<td colspan="3">41.6mm(W)x 96mm(D)x 11.3mm(H)(突起部含まず)</td>
</tr>
<tr>
<th colspan="2" width="25%">電源</th>
<td colspan="3">DC 5〜48V</td>
</tr>
<tr>
<th colspan="2" width="25%">出荷時OS</th>
<td colspan="2">Debian GNU/Linux</td></tr>
</tbody></table>
<br />
※1 NTTドコモ FOMA網に対応予定。他通信事業者向けも検討中。<br />
<br />
開発環境は、Debian GNU/Linuxを標準でサポートし、従来のOpenBlocksシリーズと同様に、実機ベースでの手早い開発環境をBXでも提供していきたいと考えています。<br />
<br />
提供時期ですが、開発者向けに、本体と各種IOを外だし出来るボードをセットにしたDPパッケージを先に提供し(時期は未定)、製品としては2月を予定しています。<br />
<br />
展示会の情報などは、以下のページでご案内しています。<br />
<br />
特設サイトURL:<br />
<a href="http://openblocks.plathome.co.jp/products/special/bx1_sp/">http://openblocks.plathome.co.jp/products/special/bx1_sp/</a><br />
<br />
Facebook:<br />
<br />
<a href="https://www.facebook.com/OpenBlocksIoT">https://www.facebook.com/OpenBlocksIoT</a><br />
<br />
<br />
<br />
現在、DPパッケージのリリースに前後して、いち早く製品をご覧いただけるよう、ハンズオンdayやハッカソン、アイディアソンなどを企画しておりますので、日程が決まり次第またお知らせします。<br />
<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-44865645415699377702014-08-08T15:21:00.000+09:002014-08-08T16:25:23.265+09:00[.tested] OpenECHO [debian Wheezy][AX3][A7][A6]OpenECHOは、ECHONET LiteをJavaで実装したライブラリであり、以下のサイトで公開されています。<br />
<br />
<div class="r">
<a href="https://github.com/SonyCSL/OpenECHO">SonyCSL/OpenECHO · GitHub</a><span id="goog_1819028886"></span><span id="goog_1819028887"></span></div>
<br />
今回は、OpenBlocks A7の内部GPIOポートを用い、ECHONET Lite対応機器として、簡単な実装を行ってみました。<br />
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
OpenBlocks A7 Debian 7.5 kernel:3.2.54<br />
<br />
<b><span style="font-size: large;">1. ハードウェアの準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
今回は、A7の基板上に実装された内部GPIOポートを利用しました。<br />
<br />
(A6の場合は、背面よりGPIOポートが接続可能です。AX3の場合は、GPIOのポートがないため、USB-GPIOアダプタなどを利用する必要があります。 )<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiXR-WvaF3b4RbkoxxDbqb1Hl1XyNutQBUHL9Z5Rz8ejKrqo825-ejyVLArdFgptd8HPzxed1fr_C5fPDHwtnKvqAlk0L4JcPOQw34WlqjHMsI-GWCAuLo1dB6Rm0UveOZv0gFj5YHRfPy/s1600/OpenECHO_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiXR-WvaF3b4RbkoxxDbqb1Hl1XyNutQBUHL9Z5Rz8ejKrqo825-ejyVLArdFgptd8HPzxed1fr_C5fPDHwtnKvqAlk0L4JcPOQw34WlqjHMsI-GWCAuLo1dB6Rm0UveOZv0gFj5YHRfPy/s1600/OpenECHO_1.JPG" height="300" width="400" /></a></div>
<br />
実際に何か照明機器を接続するといいのですが、今回は、LEDを抵抗(470Ω)と直列に接続しています。<br />
<br />
A7の内部GPIOピンは、以下の配置になっています。<br />
<br />
1: MPP17(GPIO_17) <br />
2: MPP7 (GPIO_7) ※PD禁止 <br />
3: MPP29 (GPIO_29) <br />
4: MPP28 (GPIO_28) <br />
5: MPP35 (GPIO_35) <br />
6: MPP34 (GPIO_34) <br />
7: MPP40 (GPIO_40) <br />
8: 未使用 <br />
9: 外部リセット入力 <br />
10: GND <br />
<br />
ピンの配置 <br />
| 9| 7| 5| 3| 1| <br />
|10| 8| 6| 4| 2|<br />
<br />
今回は、P7(GPIO 40)へLEDを接続しました。 <br />
<br />
<b><span style="font-size: large;">2. ソフトウェア (一般照明機器としての設定)</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
A7を一般照明機器としてセットアップする方法です。<br />
<br />
今回は、新たにGPIO回りのライブラリを作成せず、簡単なセットアップで試しました。<br />
<br />
・GPIOデバイスの作成<br />
<br />
GPIOデバイスは、以下の手順により操作可能となります。<br />
今回、プログラム上では、この設定を行っていませんので、下記の手順を実行した後、評価プログラムを起動させてください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# cd /sys/class/gpio<br />
# echo 40 > export<br />
# cd gpio40<br />
# echo out > direction</div>
<br />
ポートのON/OFF(LED点灯)テストは以下の操作により行います。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# echo 1 > value<br />
# echo 0 > value</div>
<br />
・OpenECHOによるサンプルプログラム<br />
<br />
今回は、以下のサイトのプログラムの一部を修正して使用しました。 <br />
<br />
<a href="http://armadillo.atmark-techno.com/howto/OpenECHO">Howto : ArmadilloでECHONET Lite (まとめ)</a><br />
<br />
ellight.jarのソースパッケージである、ellight.zipを展開して、Netbeans IDE 8.0により修正、ビルドしてください。<br />
今回、A7に搭載されたJREが、<br />
<br />
Java(TM) SE Embedded Runtime Environment (build 1.7.0_40-b43, headless)<br />
<br />
となりますので、JDKも7を導入して指定しています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpakQDPsRFhyY2NLPDjt_8IJV1yF5kKig_NgZDpSQz1Cfq97Xi2GHKUD6Gzgv0ybPc562lwk4tJ5ZSGT3I2wImx98SLErlNZh28ITPArX2cKHyj8Qjwu0nW1e7ZJmuD4ab_QcuVwsfaYUs/s1600/NetBeans_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpakQDPsRFhyY2NLPDjt_8IJV1yF5kKig_NgZDpSQz1Cfq97Xi2GHKUD6Gzgv0ybPc562lwk4tJ5ZSGT3I2wImx98SLErlNZh28ITPArX2cKHyj8Qjwu0nW1e7ZJmuD4ab_QcuVwsfaYUs/s1600/NetBeans_1.jpg" height="232" width="400" /></a></div>
<br />
MyLighting.javaを書き換えます。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
package ellight;<br />
<br />
import com.sonycsl.echo.eoj.device.housingfacilities.GeneralLighting;<br />
import java.io.BufferedReader;<br />
import java.io.IOException;<br />
import java.io.InputStream;<br />
import java.io.InputStreamReader;<br />
import java.util.logging.Level;<br />
import java.util.logging.Logger;<br />
<br />
public class MyLighting extends GeneralLighting {<br />
byte[] mStatus = {0x31};<br />
byte[] mMode = {0x41};<br />
byte[] mLocation = {0x00};<br />
byte[] mVersion = {0x01, 0x01, 0x61, 0x00};<br />
byte[] mFaultStatus = {0x42};<br />
byte[] mManufacturerCode = {0x00, 0x00, 0x00}; /* 未定義 */<br />
<br />
@Override<br />
protected boolean setOperationStatus(byte[] edt) {<br />
Runtime rt = Runtime.getRuntime();<br />
Process pr = null;<br />
try {<br />
/* LEDをON/OFF */<br />
if (edt[0] == 0x30)<br />
pr = rt.exec(new String[]<br />
{ "/bin/sh", "-c",<br />
"echo 1 > /sys/class/gpio/gpio40/value" });<br />
else if (edt[0] == 0x31)<br />
pr = rt.exec(new String[]<br />
{ "/bin/sh", "-c",<br />
"echo 0 > /sys/class/gpio/gpio40/value" });<br />
if (pr != null)<br />
pr.waitFor();<br />
/* 状態をECHNET Lite送信 */<br />
inform().reqInformOperationStatus().send();<br />
} catch (InterruptedException | IOException ex) {<br />
Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,<br />
null, ex);<br />
}<br />
return true;<br />
}<br />
<br />
@Override<br />
protected byte[] getOperationStatus() {<br />
try {<br />
Runtime rt = Runtime.getRuntime();<br />
/* LEDの点灯状態を取得 */<br />
Process pr = rt.exec("cat /sys/class/gpio/gpio40/value");<br />
InputStream is = pr.getInputStream();<br />
BufferedReader br = new BufferedReader(new InputStreamReader(is));<br />
String line = br.readLine();<br />
if (line != null && line.equals("0"))<br />
mStatus[0] = 0x31;<br />
else<br />
mStatus[0] = 0x30;<br />
} catch (IOException ex) {<br />
Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE, null, ex);<br />
}<br />
return mStatus;<br />
}<br />
<br />
@Override<br />
protected boolean setLightingModeSetting(byte[] edt) {<br />
mMode[0] = edt[0];<br />
<br />
try {<br />
inform().reqInformLightingModeSetting().send();<br />
} catch (IOException ex) {<br />
Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,<br />
null, ex);<br />
}<br />
return true;<br />
}<br />
<br />
@Override<br />
protected byte[] getLightingModeSetting() {<br />
return mMode;<br />
}<br />
<br />
@Override<br />
protected boolean setInstallationLocation(byte[] edt) {<br />
mLocation[0] = edt[0];<br />
<br />
try {<br />
inform().reqInformInstallationLocation().send();<br />
} catch (IOException ex) {<br />
Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,<br />
null, ex);<br />
}<br />
return true;<br />
}<br />
<br />
@Override<br />
protected byte[] getInstallationLocation() {<br />
return mLocation;<br />
}<br />
<br />
@Override<br />
protected byte[] getStandardVersionInformation() {<br />
return mVersion;<br />
}<br />
<br />
@Override<br />
protected byte[] getFaultStatus() {<br />
return mFaultStatus;<br />
}<br />
<br />
@Override<br />
protected byte[] getManufacturerCode() {<br />
return mManufacturerCode;<br />
}<br />
}</div>
<br />
ビルドしたパッケージを以下の構成でA7に転送します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# ls -lsR<br />
.:<br />
total 16<br />
4 -rw-r--r-- 1 root root 1323 Jul 17 13:29 README.TXT<br />
8 -rw-r--r-- 1 root root 5395 Jul 16 17:54 ellight.jar<br />
4 drwxr-xr-x 2 root root 4096 Jul 17 13:29 lib<br />
<br />
./lib:<br />
total 1040<br />
1040 -rw-r--r-- 1 root root 1061315 Jul 17 16:02 OpenECHO.jar</div>
<br />
起動方法は以下の通りです。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# java -jar ellight.jar </div>
<br />
<b><span style="font-size: large;">3. ソフトウェア (コントローラ)</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
コントローラとしては、Kadecot [公開実験版]を利用させてもらいました。<br />
Androidマシンを用意し、PlayStoreよりアプリをダウンロードして使用します。 <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeQI1_XRoT6jyHHrzCnjbtkb_QV1iqiaVYEpmYPvYrfrPihkChapqBH2E2yuSrTg6u1b7Ry4gxkGm2C5eKC-8CYHXzhQKs6SG31NMfYNDDrvI1qQwMqOwPQ_RlMHhW9gNQuDmxG1yvuf_Y/s1600/OpenECHO_2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeQI1_XRoT6jyHHrzCnjbtkb_QV1iqiaVYEpmYPvYrfrPihkChapqBH2E2yuSrTg6u1b7Ry4gxkGm2C5eKC-8CYHXzhQKs6SG31NMfYNDDrvI1qQwMqOwPQ_RlMHhW9gNQuDmxG1yvuf_Y/s1600/OpenECHO_2.JPG" height="300" width="400" /></a></div>
<br />
<div style="text-align: center;">
Kadecot: 機器のリスト画面</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWhzCPgFYmhz8MNQSE5DNDxf5dyOyrlAMfitwJVEK6KP4lmHLwOz64o-Jf7kCBuJ64DgWfYAeFMKqqG8iKnMJxe6Qq7ijlvaBeE9bDrBkX0PzRg1S5y9DSzG5OzGUZIk_urFvTc8wCENTl/s1600/OpenECHO_4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWhzCPgFYmhz8MNQSE5DNDxf5dyOyrlAMfitwJVEK6KP4lmHLwOz64o-Jf7kCBuJ64DgWfYAeFMKqqG8iKnMJxe6Qq7ijlvaBeE9bDrBkX0PzRg1S5y9DSzG5OzGUZIk_urFvTc8wCENTl/s1600/OpenECHO_4.JPG" height="300" width="400" /></a></div>
<br />
画面の照明機器をクリックすることにより、本体のLEDの点灯制御を行っています。<br />
<br />
<b><span style="font-size: large;">3. さいごに</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
今回はOpenECHOを評価するのが目的でしたので、GPIO回りの実装は、最低限動作確認出来る程度のものとなっています。<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-29287686293052196102014-06-16T16:45:00.000+09:002014-06-18T10:28:25.420+09:00[.tested] Wireshark [debian Wheezy][AX3][A7][A6]GUI版のネットワークアナライザ、WiresharkをOpenBlocks Aシリーズで利用するためのTipsです。<br />
<br />
<a href="http://www.wireshark.org/">Wireshark · Go Deep.:</a><br />
<div class="post-title entry-title">
<br /></div>
<検証環境><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
Debian 7.1 Wheezy<br />
OpenBlocks AX3/4 kernel: 3.2.54<br />
OpenBlocks A7 kernel 3.2.54 </div>
<br />
<使用機器><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)<br />
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル)</div>
<br />
<b><span style="font-size: large;">1. 導入前の準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
OpenBlocks Aシリーズは本体にグラフィック表示機能を持ちません。<br />
X環境を導入するためには、USB VGAディスプレイアダプタを利用するか、X端末ソフトウェアなどを利用する必要があります。<br />
<br />
USB VGAディスプレイアダプタについては、以下の記事を参考にしてください。 <br />
<br />
<div class="post-title entry-title">
<a href="http://obdnmagazine.blogspot.jp/2013/05/testedratoc-rex-usbdvi2-debian.html">【.tested】RATOC REX-USBDVI2 ディスプレイアダプタ [Debian Wheezy][AX3][A6]</a></div>
<br />
X端末ソフトウェアの導入方法に関しては、SourceForgeの以下の記事などを参考にしてください。<br />
<div class="r">
<br /></div>
<div class="r">
<a href="http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCYQFjAA&url=http%3A%2F%2Fsourceforge.jp%2Fmagazine%2F09%2F10%2F14%2F0753240&ei=D0ieU4XYBoKA8gWO-4IQ&usg=AFQjCNFFi_e6uS0EIiz-7b-I7PA5shnjng&sig2=1nl-SscOOAdNlp2swnUOXw&bvm=bv.68911936,d.dGc">フリーのWindows用Xサーバー「Xming」 - SourceForge.JP</a></div>
<br />
<b><span style="font-size: large;">2. Wiresharkの導入</span></b><br />
<hr color="#d0d0d0" size="1" />
<span style="font-size: small;"><a href="http://d.hatena.ne.jp/replication/20130609/1370708498" name="1370708498"></a></span><br />
<span style="font-size: small;">debianのパッケージを導入します。</span><br />
<span style="font-size: small;"> </span>
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
#aptitude install wireshark</div>
<br />
<b><span style="font-size: large;">3. 動作確認</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
メニューより起動するか、xtermなどからwiresharkを直接起動します。<br />
<br />
wiresharkは、セキュリティ上のポリシーから、rootで直接起動することを推奨していません。<br />
rootで起動した場合は、以下の警告メッセージが出力されます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLw3R2qYnSl3wIKYmDYSDSu-jAwb_fSjj15kFE7ajnAvltX2_9hM2R4AsJxOjGcIFmHHCLpg6_qOHxVERSF8bAmIcTkgYw0bzqteR_57xhRU_JSxJj6wnpk1vm5W4cYhB325rhz80-iYGM/s1600/wireshark_err_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLw3R2qYnSl3wIKYmDYSDSu-jAwb_fSjj15kFE7ajnAvltX2_9hM2R4AsJxOjGcIFmHHCLpg6_qOHxVERSF8bAmIcTkgYw0bzqteR_57xhRU_JSxJj6wnpk1vm5W4cYhB325rhz80-iYGM/s1600/wireshark_err_1.jpg" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFDd5mL-19K8-lBKqeqEA2LdhyphenhyphenkMwDCD-PuIKSSf2EkkW1vEF1c_r5fr-n_-reJPb-vsEo8sQw8jFLiBjQS9pNk-7535srFfPtYyw4RtJZB-PPwN3DwtqOjH73zSXzsVy3j2EV0WwJeFAn/s1600/wireshark_err_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFDd5mL-19K8-lBKqeqEA2LdhyphenhyphenkMwDCD-PuIKSSf2EkkW1vEF1c_r5fr-n_-reJPb-vsEo8sQw8jFLiBjQS9pNk-7535srFfPtYyw4RtJZB-PPwN3DwtqOjH73zSXzsVy3j2EV0WwJeFAn/s1600/wireshark_err_2.jpg" height="174" width="320" /></a></div>
<br />
そのため、一般ユーザでログインして、wiresharkを立ち上げることになりますが、 dumpcapというパケットキャプチャプログラムに許可を与える必要があります。<br />
wireshark wikiのページにもありますが、以下の方法で設定します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap</div>
<br />
ただし、このFile Capabilitiesの仕組みは、aufsでは対応しておらず、aufsによるOpenBlocksのディスク共有モードで利用する場合は、setcapによる許可が与えられません。<br />
( 一つの解決策としては、dumpcapに+sしてしまうという方法もありますが、前提から考えても、お勧めできません)<br />
<br />
ユーザモードによる動作を行いたい場合は、aufsではなく、ext4などのファイルシステムでシステムを構成する必要があります。<br />
rootfsの変更方法に関しては、以下の記事にて解説しています。<br />
<br />
<div class="post-title entry-title">
<span style="font-weight: normal;"><a href="http://obdnmagazine.blogspot.jp/2014/04/openblocks-rootfs-frasgrom-debian.html">OpenBlocks Aシリーズ rootfs変更方法 (FlashROMブート) [debian Wheezy][AX3][A7][A6]</a></span></div>
<br />
今回は、ext4にて作成したrootfsに変更することにより、dumpcapのFile Capabilityを変更しました。<br />
<br />
表示画面は以下のようになります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjwczg0t01NLdqdOW0H7upEzKY674JZUpv2Vq97XdaUUlhuUkKgX4bhDooqrSDQo4szhxHKLU7rgF0Eb6gc__0knLpF9oS8o0Pr0zvaxlNlquuPbpz2iOFOdVK9RvFc9kYM-zNy3Ubg9sb/s1600/wireshark_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjwczg0t01NLdqdOW0H7upEzKY674JZUpv2Vq97XdaUUlhuUkKgX4bhDooqrSDQo4szhxHKLU7rgF0Eb6gc__0knLpF9oS8o0Pr0zvaxlNlquuPbpz2iOFOdVK9RvFc9kYM-zNy3Ubg9sb/s1600/wireshark_2.jpg" height="320" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhdHhK8Mn50a0Rxvn6OR4J07CDYiEg28bmY3G9zT-364zNwG3f97455RuVb3AirlFm4JZ7W0l3TRgYNesixvzUkaBZvo-w5uoJT9PHKM2vCuPUvwicXCiTwDh5P7jtjJQPAAgOqxIt4-mP/s1600/wireshark_3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhdHhK8Mn50a0Rxvn6OR4J07CDYiEg28bmY3G9zT-364zNwG3f97455RuVb3AirlFm4JZ7W0l3TRgYNesixvzUkaBZvo-w5uoJT9PHKM2vCuPUvwicXCiTwDh5P7jtjJQPAAgOqxIt4-mP/s1600/wireshark_3.jpg" height="320" width="400" /></a></div>
<br />
なお、上記の画面は、Xmingを利用し、OpenBlocksにはwiresharkだけをインストールして使用しています。<br />
<br />
<b><span style="font-size: large;">4. さいごに</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
今回は、wiresharkの利用方法についてご紹介しました。<br />
GUIを使用しない場合、tsharkもdebianのパッケージとして提供されていますので、お試しください。<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-55838203937157972642014-06-09T15:42:00.001+09:002014-06-12T10:04:33.675+09:00[.tested] Planex GW-450D 無線LANアダプタ [AX3][A7][A6]Planex GW-450Dは、802.11ac/n/a/g/bに対応したUSB無線LANアダプタです。<br />
GW-450Dは、写真の小型のタイプと、稼働式アンテナのついたGW-450D KATANAがありますが、アンテナ以外は同一の設計の製品と思われます。<br />
Openblocks AX3およびA7での動作検証を行いました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWCit-rrlhlEX8Yj6wIdb_FYAh6kAmqvSTbWdtemV6moFRia-V_IK4FCsiGpTpVNjA5y-YEbjBmDfo8u8xio09aUNSVPtjtDU9gxIA6b7CqCjv95mTaObzDlDpyjk08S_s7YaT-FbwUBUO/s1600/PLANEX_GW-450D.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWCit-rrlhlEX8Yj6wIdb_FYAh6kAmqvSTbWdtemV6moFRia-V_IK4FCsiGpTpVNjA5y-YEbjBmDfo8u8xio09aUNSVPtjtDU9gxIA6b7CqCjv95mTaObzDlDpyjk08S_s7YaT-FbwUBUO/s1600/PLANEX_GW-450D.JPG" height="300" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Kps_UmBUdmBLLfqPJ4A4oy8nCPQQpvBg076CnmXBUixWMADu68XFUL7X5cOJtlberX6DMTq4i0phyt-TCHjN8xFEoV-HyDflRbo8N5-DDWQdJttVWvYIHKUQeSmXWHiyyRr5zXtzXED8/s1600/PLANEX_GW-450S.JPG" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
OpenBlocks AX3/4 Debian 7.5 kernel: 3.2.54<br />
OpenBlocks A7 Debian 7.5 kernel:3.2.54<br />
<br />
<b><span style="font-size: large;">1. 対応ドライバと事前準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
GW-450Dは、MediaTek MT7610Uを採用しており、現在AX3およびA7/A6に搭載されたカーネル3.2.54ではサポートされていません。<br />
Planex社の以下のページにおいて、開発者向け情報が公開されています。<br />
<br />
<a href="http://www.planex.co.jp/support/taiou/kisyu/developer_wifiusb.shtml">開発者向け情報|無線LAN USBアダプタ|プラネックス:</a><br />
<br />
ドライバのソースコードは、上記のページよりダウンロードできますが、今回はチップセットメーカであるMediaTek社のホームページよりダウンロードし、OpenBlocks向けにビルドしました。<br />
<br />
・カーネル構築環境の導入<br />
<br />
本ドライバは、ビルドする際に、カーネルの構築環境を参照するため、build-essentialsによる開発環境の構築のみでは、ドライバのビルドが出来ません。<br />
以下の手順を参考に、カーネルのソースを導入し、make modules_installまでを行っておく必要があります。<br />
<br />
<a href="http://obdnmagazine.blogspot.jp/2013/07/ax3a6.html">カーネルのカスタマイズ手順について(非公式版) [AX3][A6]</a><br />
<br />
・ソースコードの入手と展開<br />
<br />
以下のページの、7610U USBよりファイルをダウンロードして下さい。<br />
<br />
<a href="http://www.mediatek.com/en/downloads/">Downloads - MediaTek:</a><br />
<br />
ダウンロードしたファイルは以下の手順で解凍してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# tar jxfv mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2<br />
# cd mt7610u_wifi_sta_v3002_dpo_20130916</div>
<br />
common/rtusb_dev_id.cを編集します。<br />
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。<br />
アップデートにより内容が変更されている場合は、参考にして書き換えてください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
diff -u rtusb_dev_id.c.orig rtusb_dev_id.c<br />
--- rtusb_dev_id.c.orig 2014-06-09 15:18:30.209980000 +0900<br />
+++ rtusb_dev_id.c 2014-06-09 15:19:43.299980000 +0900<br />
@@ -36,6 +36,7 @@<br />
/* module table */<br />
USB_DEVICE_ID rtusb_dev_id[] = {<br />
#ifdef MT76x0<br />
+ {USB_DEVICE(0x2019,0xab31)}, /* MT7610U */<br />
{USB_DEVICE(0x148F,0x7610)}, /* MT7610U */<br />
{USB_DEVICE(0x0E8D,0x7610)}, /* MT7610U */<br />
{USB_DEVICE_AND_INTERFACE_INFO(0x0E8D, 0x7630, 0xff, 0x2, 0xff)}, /* MT7630U */</div>
<br />
os/linux/config.mkを編集し、wpa_supplicantのサポートをyにします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# diff -u config.mk.orig config.mk<br />
--- config.mk.orig 2014-06-09 15:22:00.759980000 +0900<br />
+++ config.mk 2014-06-09 15:22:17.039980000 +0900<br />
@@ -23,12 +23,12 @@<br />
<br />
# Support Wpa_Supplicant<br />
# i.e. wpa_supplicant -Dralink<br />
-HAS_WPA_SUPPLICANT=n<br />
+HAS_WPA_SUPPLICANT=y<br />
<br />
<br />
# Support Native WpaSupplicant for Network Maganger<br />
# i.e. wpa_supplicant -Dwext<br />
-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n<br />
+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y<br />
<br />
#Support Net interface block while Tx-Sw queue full<br />
HAS_BLOCK_NET_IF=n</div>
<br />
変更後、make および installを行います。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# make install</div>
<br />
README_STA_usbを参考に、コンフィギュレーションファイルをコピーします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# mkdir /etc/Wireless/RT2870STA<br />
# cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat</div>
<br />
A7の場合は、デバイスをUSBポートに差し込めば認識するのですが、AX3の場合は、ubootが設定したvmallocのサイズの関係で、ドライバがvmallocに失敗したというメッセージを出し、起動しません。<br />
起動時に一旦ubootに入り、<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# openblocks> setenv miscargs vmalloc=200M </div>
<br />
として、拡張する必要がありました。<br />
<br />
デバイスは、/dev/ra0となります。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
ra0 Link encap:Ethernet HWaddr 00:22:cf:e2:4d:39<br />
inet addr:192.168.10.95 Bcast:192.168.10.255 Mask:255.255.255.0<br />
inet6 addr: fe80::222:cfff:fee2:4d39/64 Scope:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br />
RX packets:247723 errors:9 dropped:0 overruns:0 frame:0<br />
TX packets:1591 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:1000<br />
RX bytes:62913475 (59.9 MiB) TX bytes:128084 (125.0 KiB)</div>
<br />
起動時に立ち上がらない場合は、<br />
/etc/modulesに<br />
mt7650u_sta<br />
を追加してください。<br />
<br />
<b><span style="font-size: large;">2. wpasupplicantパッケージの導入および設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
以下の記事を参照して下さい。<br />
<br />
<a href="http://obdnmagazine.blogspot.jp/2012/06/obdn-test-logitec-lan-w150n-lan-ax3.html">[.tested] Logitec LAN-W150N/U2WH(BK) 無線LANアダプタ [AX3]</a><br />
<br />
以下の通り、クライアントモードでの動作を確認しました。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# iwconfig ra0<br />
ra0 Ralink STA ESSID:"******" Nickname:"MT7610U_STA"<br />
Mode:Managed Frequency=2.412 GHz Access Point: 00:1D:73:C2:F4:00<br />
Bit Rate=108 Mb/s<br />
RTS thr:off Fragment thr:off<br />
Encryption key:9394-8D4B-D889-F2A3-0EF7-E943-73A8-719C [3] Security mode:open<br />
Link Quality=64/100 Signal level:-73 dBm Noise level:-73 dBm<br />
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0<br />
Tx excessive retries:0 Invalid misc:0 Missed beacon:0</div>
<br />
<span style="font-size: large;"><b>3. さいごに</b></span><br />
<hr color="#d0d0d0" size="1" />
<br />
今回は、クライアント接続のみのテストとしています。 <br />
AP化に関しては、hostapdが本アダプタをサポートしておらず、また、realtek社の様に専用のhostapdの配布もされていないため、今回は特に追いかけていません。<br />
新たな情報が入り次第、追記させていただきます。<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-86332655253941373882014-06-09T10:59:00.000+09:002014-06-09T11:00:21.645+09:00[.tested] Planex GW-450S 無線LANアダプタ [AX3][A7][A6]Planex GW450Sは、802.11ac/n/aに対応した5GHz帯専用のUSB無線LANアダプタです。<br />
Openblocks AX3およびA7での動作検証を行いました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Kps_UmBUdmBLLfqPJ4A4oy8nCPQQpvBg076CnmXBUixWMADu68XFUL7X5cOJtlberX6DMTq4i0phyt-TCHjN8xFEoV-HyDflRbo8N5-DDWQdJttVWvYIHKUQeSmXWHiyyRr5zXtzXED8/s1600/PLANEX_GW-450S.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Kps_UmBUdmBLLfqPJ4A4oy8nCPQQpvBg076CnmXBUixWMADu68XFUL7X5cOJtlberX6DMTq4i0phyt-TCHjN8xFEoV-HyDflRbo8N5-DDWQdJttVWvYIHKUQeSmXWHiyyRr5zXtzXED8/s1600/PLANEX_GW-450S.JPG" height="300" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
OpenBlocks AX3/4 Debian 7.5 kernel: 3.2.54<br />
OpenBlocks A7 Debian 7.5 kernel:3.2.54<br />
<br />
<b><span style="font-size: large;">1. 対応ドライバと事前準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
GW-450Sは、Reaktek 8811AUを採用しており、現在AX3およびA7/A6に搭載されたカーネル3.2.54ではサポートされていません。<br />
Planex社の以下のページにおいて、開発者向け情報が公開されています。<br />
<br />
<a href="http://www.planex.co.jp/support/taiou/kisyu/developer_wifiusb.shtml">開発者向け情報|無線LAN USBアダプタ|プラネックス:</a><br />
<br />
ドライバのソースコードをこのページのリンクからダウンロードし、OpenBlocks向けにビルドする必要があります。<br />
(2014/06/06現在、Reaktek社の製品情報ページからは8811Uの情報が検索出来ません)<br />
<br />
Realtek社のチップセットに関しては、以下の記事で行った手順にて検証作業を行います。<br />
<br />
<div class="post-title entry-title">
<a href="http://obdnmagazine.blogspot.jp/2013/04/tested-planex-gw-usvalue-ezgw.html"><span style="font-size: small;">[.tested] Planex GW-USValue-EZ/GW-USWExtreme/GW-USNano2 無線LANアダプタ [AX3][A6]</span></a></div>
<br />
・カーネル構築環境の導入<br />
<br />
本ドライバは、ビルドする際に、カーネルの構築環境を参照するため、build-essentialsによる開発環境の構築のみでは、ドライバのビルドが出来ません。<br />
以下の手順を参考に、カーネルのソースを導入し、make modules_installまでを行っておく必要があります。<br />
<br />
<a href="http://obdnmagazine.blogspot.jp/2013/07/ax3a6.html">カーネルのカスタマイズ手順について(非公式版) [AX3][A6]</a><br />
<br />
・ソースコードの入手と展開<br />
<br />
展開には、unzipが必要となります。 <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# aptitude install unzip</div>
<br />
上記、Planex社の開発者向け情報より、Linux版のソースコードを入手します<br />
ダウンロードしたファイルは以下の手順で解凍してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# unzip gw-450s_driver_linux_v424.zip<br />
# cd gw-450s_driver_linux_v424<br />
# unzip RTL8811AU_linux_v4.2.4_9533.20131209.zip</div>
<br />
このパッケージは、ターゲットが対応する機器ならば、作成されたディレクトリへ移動し、<br />
install.shによりインストールが行えるのですが、Openblocksは対応機器にありませんので、<br />
以下の手順によりドライバパッケージのコンパイルおよびインストールを行います。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# cd RTL8811AU_linux_v4.2.4_9533.20131209<br />
# cd driver<br />
# tar xvzf rtl8811AU_linux_v4.2.4_9533.20131209.tar.gz<br />
# cd rtl8811AU_linux_v4.2.4_9533.20131209</div>
<br />
Makefileを編集します。<br />
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。<br />
アップデートにより内容が変更されている場合は、参考にして書き換えてください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# diff -u Makefile.orig Makefile<br />
--- Makefile.orig 2014-06-06 10:02:14.427254000 +0900<br />
+++ Makefile 2014-06-06 10:05:18.947254000 +0900<br />
@@ -52,7 +52,8 @@<br />
CONFIG_LOAD_PHY_PARA_FROM_FILE = y<br />
CONFIG_ODM_ADAPTIVITY = n<br />
<br />
-CONFIG_PLATFORM_I386_PC = y<br />
+CONFIG_PLATFORM_I386_PC = n<br />
+CONFIG_PLATFORM_OBS_ARM = y<br />
CONFIG_PLATFORM_ANDROID_X86 = n<br />
CONFIG_PLATFORM_JB_X86 = n<br />
CONFIG_PLATFORM_ARM_S3C2K4 = n<br />
@@ -709,6 +710,17 @@<br />
CROSS_COMPILE ?=<br />
KVER := $(shell uname -r)<br />
KSRC := /lib/modules/$(KVER)/build<br />
+MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/<br />
+INSTALL_PREFIX :=<br />
+endif<br />
+<br />
+ifeq ($(CONFIG_PLATFORM_OBS_ARM), y)<br />
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN<br />
+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)<br />
+ARCH ?= arm<br />
+CROSS_COMPILE ?=<br />
+KVER := $(shell uname -r)<br />
+KSRC := /lib/modules/$(KVER)/build<br />
MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/<br />
INSTALL_PREFIX :=<br />
endif</div>
<br />
また、本デバイスのデバイスIDをドライバソースコードに追加する必要があります。<br />
os_dep/linux/usb_intf.cを編集し、RTL8821Aの項目にデバイスIDを追加登録してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
#ifdef CONFIG_RTL8821A<br />
/*=== Realtek demoboard ===*/<br />
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0811),.driver_info = RTL8821},/* Default ID */<br />
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0821),.driver_info = RTL8821},/* Default ID */<br />
{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8822),.driver_info = RTL8821},/* Default ID */<br />
/*=== Customer ID ===*/<br />
{USB_DEVICE(0x7392, 0xA811),.driver_info = RTL8821}, /* Edimax - Edimax */<br />
{USB_DEVICE(0x04BB, 0x0953),.driver_info = RTL8821}, /* I-O DATA - Edimax */<br />
{USB_DEVICE(0x2001, 0x3314),.driver_info = RTL8821}, /* D-Link - Cameo */<br />
{USB_DEVICE(0x2001, 0x3318),.driver_info = RTL8821}, /* D-Link - Cameo */<br />
{USB_DEVICE(0x0E66, 0x0023),.driver_info = RTL8821}, /* HAWKING - Edimax */<br />
<i><b> {USB_DEVICE(0x2019, 0xAB32),.driver_info = RTL8821}, /* Planex - Abocom */</b></i><br />
#endif</div>
<br />
変更後、make および installを行います。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# make install</div>
<br />
デバイスをUSBポートに差し込めば認識します。<br />
デバイスは、/dev/wlan0となります。<br />
<br />
起動時に立ち上がらない場合は、<br />
/etc/modulesに<br />
8821au<br />
を追加してください。<br />
<br />
本ドライバは、そのままmake するとデバッグメッセージをconsoleに表示しますので、console作業等で気になる場合は、include/autoconf.hにおいて、DEBUGもしくはDBGと書かれたdefine行をコメントアウトすることにより抑止出来ます。<br />
<br />
<b><span style="font-size: large;">2. wpasupplicantパッケージの導入および設定</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
以下の記事を参照して下さい。<br />
<br />
<a href="http://obdnmagazine.blogspot.jp/2012/06/obdn-test-logitec-lan-w150n-lan-ax3.html">[.tested] Logitec LAN-W150N/U2WH(BK) 無線LANアダプタ [AX3]</a><br />
<br />
本製品は5GHz帯専用の製品ですので、AP側も対応したものを使用する必要があります。 <br />
<br />
以下の通り、クライアントモードでの動作を確認しました。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# ifconfig wlan0<br />
wlan0 Link encap:Ethernet HWaddr 00:22:cf:eb:8d:2b<br />
inet addr:192.168.10.107 Bcast:192.168.10.255 Mask:255.255.255.0<br />
inet6 addr: fe80::222:cfff:feeb:8d2b/64 Scope:Link<br />
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1<br />
RX packets:19492 errors:0 dropped:3063 overruns:0 frame:0<br />
TX packets:2187 errors:0 dropped:4 overruns:0 carrier:0<br />
collisions:0 txqueuelen:1000<br />
RX bytes:172328795 (164.3 MiB) TX bytes:4108434 (3.9 MiB)</div>
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# iwconfig wlan0<br />
wlan0 IEEE 802.11an ESSID:"******" Nickname:"<WIFI@REALTEK>"<br />
Mode:Managed Frequency:5.18 GHz Access Point: 00:1D:73:C2:F2:A0<br />
Bit Rate:150 Mb/s Sensitivity:0/0<br />
Retry:off RTS thr:off Fragment thr:off<br />
Encryption key:****-****-****-****-****-****-****-**** Security mode:open<br />
Power Management:off<br />
Link Quality=48/100 Signal level=56/100 Noise level=0/100<br />
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0<br />
Tx excessive retries:0 Invalid misc:0 Missed beacon:0</div>
<br />
<span style="font-size: large;"><b>3. さいごに</b></span><br />
<hr color="#d0d0d0" size="1" />
<br />
今回は、クライアント接続のみのテストとしています。 <br />
AP化や、WPSボタンの使用方法に関しては、前回の記事を参考に試してみてください。<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-89200496632658571462014-05-14T15:21:00.000+09:002014-05-14T15:45:35.090+09:00[.tested] express + socket.ioによるWebSocket実装方法について [debian Wheezy][AX3][A7][A6]前回インストールした、node.js上でexpressおよびsocket.ioを使用した、Websocket通信のテストを行ってみました。<br />
Aシリーズでのnode.jsのビルド方法については、前回の記事を参考にしてください。<br />
<br />
<div class="post-title entry-title">
<span style="font-size: small;"><span style="font-weight: normal;"><a href="http://obdnmagazine.blogspot.jp/2014/05/tested-nodejs-debian-wheezyax3a7a6.html">[.tested] node.js [debian Wheezy][AX3][A7][A6]</a></span></span></div>
<br />
<検証環境><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
Debian 7.1 Wheezy<br />
OpenBlocks AX3/4 kernel: 3.2.40<br />
OpenBlocks A7 Ketnel 3.2.40 </div>
<br />
<使用機器><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)<br />
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル) </div>
<br />
<b><span style="font-size: large;">1. 導入前の準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
express 4.0以降、雛形を作成するexpressコマンドは分離されているため、express-generatorをインストールします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# sudo npm install -g express-generator</div>
<br />
<b><span style="font-size: large;">2. socket.ioのサンプルプログラムの作成</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
下記の記事を参考に、chatのサンプルプログラムをexpress 4.0向けに導入してみました。<br />
<br />
<div class="title">
<span style="font-size: small;"><a href="http://d.hatena.ne.jp/replication/20130609/1370708498" name="1370708498">【初心者向け】node.js(0.10x) + socket.io(0.9x)のサンプルプログラム</a></span></div>
<br />
雛形を作成します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# express -e sample</div>
<br />
以下、sampleというディレクトリに雛形が作成されます。<br />
<br />
package.jsonを以下の内容に修正します。<br />
socket.ioを追加することにより、npm installによりsocket.ioも組み込まれます。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
{<br />
"name": "application-name",<br />
"version": "0.0.1",<br />
"private": true,<br />
"scripts": {<br />
"start": "node ./bin/www"<br />
},<br />
"dependencies": {<br />
"express": "~4.0.0",<br />
"static-favicon": "~1.0.0",<br />
"morgan": "~1.0.0",<br />
"cookie-parser": "~1.0.1",<br />
"body-parser": "~1.0.0",<br />
"debug": "~0.7.4",<br />
"ejs": "~0.8.5",<br />
"socket.io": "~*"<br />
}<br />
}</div>
<br />
bin/wwwにchatプログラム本体を記述します。<br />
// add以下が追加される部分です。 <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre class="syntax-highlight"><span class="synComment">#!/usr/bin/env node
var debug = require('debug')('my-application');
var app = require('../app');
app.set('port', process.env.PORT || 3000);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
}); </span></pre>
<pre class="syntax-highlight"><span class="synComment">
</span></pre>
<pre class="syntax-highlight"><span class="synComment">// add start</span>
<span class="synIdentifier">var</span> socketIO = require(<span class="synConstant">'socket.io'</span>);
<span class="synComment">// クライアントの接続を待つ(IPアドレスとポート番号を結びつけます)</span>
<span class="synIdentifier">var</span> io = socketIO.listen(server);
<span class="synComment">// クライアントが接続してきたときの処理</span>
io.sockets.on(<span class="synConstant">'connection'</span>, <span class="synIdentifier">function</span>(socket) <span class="synIdentifier">{</span>
console.log(<span class="synConstant">"connection"</span>);
<span class="synComment">// メッセージを受けたときの処理</span>
socket.on(<span class="synConstant">'message'</span>, <span class="synIdentifier">function</span>(data) <span class="synIdentifier">{</span>
<span class="synComment">// つながっているクライアント全員に送信</span>
console.log(<span class="synConstant">"message"</span>);
io.sockets.emit(<span class="synConstant">'message'</span>, <span class="synIdentifier">{</span> value: data.value <span class="synIdentifier">}</span>);
<span class="synIdentifier">}</span>);
<span class="synComment">// クライアントが切断したときの処理</span>
socket.on(<span class="synConstant">'disconnect'</span>, <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span>
console.log(<span class="synConstant">"disconnect"</span>);
<span class="synIdentifier">}</span>);
<span class="synIdentifier">}</span>);</pre>
</div>
<br />
クライアントサイドとして、views/index.ejsを作成します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre class="syntax-highlight"><script src=<span class="synConstant">"/socket.io/socket.io.js"</span>></script>
<script type=<span class="synConstant">"text/javascript"</span>>
<span class="synIdentifier">var</span> socket = io.connect(<span class="synConstant">'http://<u><i>接続するサーバのURLまたはIPアドレス</i></u>:3000'</span>);
socket.on(<span class="synConstant">'connect'</span>, <span class="synIdentifier">function</span>(msg) <span class="synIdentifier">{</span>
console.log(<span class="synConstant">"connet"</span>);
<span class="synStatement">document</span>.getElementById(<span class="synConstant">"connectId"</span>).innerHTML =
<span class="synConstant">"あなたの接続ID::"</span> + socket.socket.transport.sessid;
<span class="synStatement">document</span>.getElementById(<span class="synConstant">"type"</span>).innerHTML =
<span class="synConstant">"接続方式::"</span> + socket.socket.transport.name;
<span class="synIdentifier">}</span>);
<span class="synComment">// メッセージを受けたとき</span>
socket.on(<span class="synConstant">'message'</span>, <span class="synIdentifier">function</span>(msg) <span class="synIdentifier">{</span>
<span class="synComment">// メッセージを画面に表示する</span>
<span class="synStatement">document</span>.getElementById(<span class="synConstant">"receiveMsg"</span>).innerHTML = msg.value;
<span class="synIdentifier">}</span>);
<span class="synComment">// メッセージを送る</span>
<span class="synIdentifier">function</span> SendMsg() <span class="synIdentifier">{</span>
<span class="synIdentifier">var</span> msg = <span class="synStatement">document</span>.getElementById(<span class="synConstant">"message"</span>).value;
<span class="synComment">// メッセージを発射する</span>
socket.emit(<span class="synConstant">'message'</span>, <span class="synIdentifier">{</span> value: msg <span class="synIdentifier">}</span>);
<span class="synIdentifier">}</span>
<span class="synComment">// 切断する</span>
<span class="synIdentifier">function</span> DisConnect() <span class="synIdentifier">{</span>
<span class="synIdentifier">var</span> msg = socket.socket.transport.sessid + <span class="synConstant">"は切断しました。"</span>;
<span class="synComment">// メッセージを発射する</span>
socket.emit(<span class="synConstant">'message'</span>, <span class="synIdentifier">{</span> value: msg <span class="synIdentifier">}</span>);
<span class="synComment">// socketを切断する</span>
socket.disconnect();
<span class="synIdentifier">}</span>
</script>
<!DOCTYPE html>
<html>
<head>
<meta charset=<span class="synConstant">"UTF-8"</span>>
<title><%= title %></title>
<link rel=<span class="synConstant">'stylesheet'</span> href=<span class="synConstant">'/stylesheets/style.css'</span> />
</head>
<body>
<h1>socket.ioのサンプルプログラム</h1>
<div id=<span class="synConstant">"connectId"</span>></div>
<div id=<span class="synConstant">"type"</span>></div>
<br>
<input type=<span class="synConstant">"text"</span> id=<span class="synConstant">"message"</span> value=<span class="synConstant">""</span>>
<input type=<span class="synConstant">"button"</span> value=<span class="synConstant">"メッセージを送る"</span> onclick=<span class="synConstant">"SendMsg()"</span>>
<input type=<span class="synConstant">"button"</span> value=<span class="synConstant">"切断する"</span> onclick=<span class="synConstant">"DisConnect()"</span>>
<div id=<span class="synConstant">"receiveMsg"</span>></div>
</body>
</html></pre>
</div>
<br />
必要なパッケージをインストールします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# npm install</div>
<br />
<b><span style="font-size: large;">3. 動作確認</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
サーバを起動します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# ./bin/www</div>
<br />
Webブラウザを立ち上げ、以下のURLまたはIPアドレスを指定してアクセスしてください。 <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
http://サーバのURLまたはIPアドレス:3000</div>
<br />
複数のブラウザ画面を立ち上げ、相互に入力した文字が表示されることを確認してください。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYMnj0_JGkEbBpSvykyNL_Bns-fSwSFwpeFw3EI3HhYrl6GJ7LY6AaBRAYPpKJ1kylXw3XDoNlVK0bfIx-VxCmx0bubJqFDJkLWd_CMxHIf2msD_dcSJohTRvM1hYey8duVXpnL5rf-1Ur/s1600/chat_sample1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYMnj0_JGkEbBpSvykyNL_Bns-fSwSFwpeFw3EI3HhYrl6GJ7LY6AaBRAYPpKJ1kylXw3XDoNlVK0bfIx-VxCmx0bubJqFDJkLWd_CMxHIf2msD_dcSJohTRvM1hYey8duVXpnL5rf-1Ur/s1600/chat_sample1.jpg" height="290" width="400" /></a></div>
<br />
<b><span style="font-size: large;">4. さいごに</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
上記の手順により、Aシリーズ上でビルドしたnode.jsのsocket.ioモジュールによるWebSocket通信の確認を行いました。<br />
<br />
今回は、express 4の場合、functionの定義方法などが異なるため、参考にしたサイトより、必要な部分だけを抜き出して利用させていただきました。<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-85540827874535713402014-05-09T14:19:00.001+09:002014-05-12T12:01:25.137+09:00[.tested] node.js [debian Wheezy][AX3][A7][A6]node.jsはサーバサイドのJavaScriptインタプリタです。<br />
今回は、node.jsのOpenBlocks Aシリーズへの導入を行いました。<br />
<br />
<検証環境><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
Debian 7.1 Wheezy<br />
OpenBlocks AX3/4 kernel: 3.2.40<br />
OpenBlocks A7 Ketnel 3.2.40 </div>
<br />
<使用機器><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)<br />
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル) </div>
<br />
<b><span style="font-size: large;">1. 導入前の準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
node.jsは、公式サイトからソースコードをダウンロードしてビルドを行います。<br />
そのため、開発環境のインストールを行っておく必要があります。<br />
<br />
<span style="font-size: small;"><a href="http://obdnmagazine.blogspot.jp/2014/02/openblocks-debian-wheezyax3a7a6.html">OpenBlocks における開発環境構築手順について [debian Wheezy][AX3][A7][A6]</a></span><br />
<br />
検索などをすると、npmのインストールのためにcurlを入れる事例などありますが、現状では、node.jsのインストールによりnpmもインストールされますので必要ありません。<br />
<br />
<b><span style="font-size: large;">2. node.jsのビルド</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
node.jsの公式サイトより最新のソースパッケージを入手してください。<br />
<br />
<div class="r">
<span style="font-size: small;"><a href="http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDMQFjAB&url=http%3A%2F%2Fnodejs.org%2F&ei=oF5sU62pOsn5kgXX74HoDw&usg=AFQjCNE4Ts3F1ZWcYkLwsfNqE6RHZgUpyg&sig2=L-mamFqji98lErUR7_3QYQ&bvm=bv.66330100,d.dGI&cad=rja">node.js</a></span></div>
<br />
以下の例は、2014/05/09時点での最新のバージョンです。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# wget http://nodejs.org/dist/v0.10.28/node-v0.10.28.tar.gz</div>
<br />
展開します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# tar xvzf node-v0.10.28.tar.gz<br />
# cd node-v0.10.28</div>
<br />
一般的には、ここでconfigureしてmakeするだけなのですが、Aシリーズの場合は、以下のパラメータを指定する必要があります。<br />
<br />
<u><b>AX3の場合</b></u><br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# ./configure --without-snapshot --with-arm-float-abi=hard</div>
<br />
<b><u>A7/6の場合</u></b><br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# ./configure --without-snapshot</div>
<br />
また、A7/6の場合、一部のソースコードを修正する必要があります。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# vi deps/v8/src/arm/macro-assembler-arm.cc</div>
<br />
以下のイタリック表記の3行を追加してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
// We always generate arm code, never thumb code, even if V8 is compiled to<br />
// thumb, so we require inter-working support<br />
#if defined(__thumb__) && !defined(USE_THUMB_INTERWORK)<br />
#error "flag -mthumb-interwork missing"<br />
#endif<br />
<br />
<span style="color: #cc0000;"><i>// ADD THESE THREE LINES TO macro-assembler-arm.cc<br /><br />#if !defined(CAN_USE_THUMB_INSTRUCTIONS)<br /># define CAN_USE_THUMB_INSTRUCTIONS 1<br />#endif</i></span><br />
<br />
// We do not support thumb inter-working with an arm architecture not supporting<br />
// the blx instruction (below v5t). If you know what CPU you are compiling for<br />
// you can use -march=armv7 or similar.<br />
#if defined(USE_THUMB_INTERWORK) && !defined(CAN_USE_THUMB_INSTRUCTIONS)<br />
# error "For thumb inter-working we require an architecture which supports blx"<br />
#endif</div>
<br />
上記の修正および、configureの実行を行った後、makeを実行し、インストールします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# make<br />
# make install </div>
<br />
<br />
<b><span style="font-size: large;">3. 動作確認その他</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
インストール後、nodeコマンドを実行し動作を確認してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# node -v<br />
v0.10.28</div>
<br />
前述しましたが、npmは同時にインストールされます。<br />
<br />
<br />
プロジェクト毎に必要なモジュールはインストールされますので、特にグローバルにインストールする必要はないようです。<br />
<br />
*) 2014/05/12 expressに関しての記述は削除しました。<br />
Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-56839106252643041512014-04-25T10:25:00.000+09:002014-04-25T15:52:29.247+09:00[.tested] Tomcat7の導入について [debian Wheezy][AX3][A7][A6] Apache Tomcatの導入方法について、若干のTipsも交えてご紹介します。<br />
<br />
<br />
<br />
<検証環境><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
Debian 7.1 Wheezy<br />
OpenBlocks AX3/4 kernel: 3.2.40<br />
OpenBlocks A7 Ketnel 3.2.40 <br />
OpenBlocks A6 kernel: 3.2.40 </div>
<br />
<使用機器><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)<br />
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル) <br />
OpenBlocks A6 DPパッケージ (DPパッケージのみjavaライセンス付きでの出荷をしています) </div>
<br />
<b><span style="font-size: large;">1.Tomcat 7 のインストール</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
Apache Tomcat 7は、Debian Wheezyのパッケージとしても用意されていますが、合わせてOpenJDK6を導入してしまいます。<br />
OpenBlocksシリーズは、Oracle Javaを標準搭載していますので(A6はDPモデルのみ)、Tomcatのパッケージのみを公式のサイトよりダウンロードしてインストールすることをおすすめします。<br />
<br />
<span style="font-size: large;"><b><a href="http://tomcat.apache.org/">Apache Tomcat</a></b></span><br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-7/v7.0.53/bin/apache-tomcat-7.0.53.tar.gz</div>
<br />
/usr/localの下に展開します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# tar zxpvf apache-tomcat-7.0.53.tar.gz -C /usr/local</div>
<br />
setenv.shを作成します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# vi /usr/local/apache-tomcat-7.0.53/bin/setenv.sh</div>
<br />
下記の内容を記述してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
#!/bin/bash<br />
JRE_HOME=/usr/lib/jre<br />
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom" </div>
<br />
JAVA_OPTSの設定は、linuxの/dev/randumの仕様によるもので、特にOpenBlocks A7の場合において、再起動時の環境ノイズの再収集時間に起因する起動遅延を解消するものです。<br />
randomを使用する場合は、上記の記述を削除してください。(A7の場合30分程度、AX3の場合はばらつきがあり、20秒程度で立ち上がる場合もあれば、6分かかる場合もありました)<br />
<br />
<b><span style="font-size: large;">2. 動作確認および開発環境の構築について</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
手動での立ち上げは以下の様に行ってください。<br />
<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# /usr/local/apache-tomcat-7.0.53/bin/startup.sh</div>
<br />
ブラウザで動作確認をする場合は、以下のURLとなります。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
http://<i>URLまたはIPアドレス</i>:8080</div>
<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-88493923227321406822014-04-23T14:13:00.001+09:002014-04-25T15:52:39.569+09:00[.tested] RXTXによるjavaのシリアル通信について [debian Wheezy][AX3][A7][A6]RXTXライブラリを使用したjavaのシリアル通信を行う際のパッケージ導入方法について説明します。<br />
<br /><検証環境><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
Debian 7.1 Wheezy<br />
OpenBlocks AX3/4 kernel: 3.2.40<br />
OpenBlocks A7 Ketnel 3.2.40 <br />
OpenBlocks A6 kernel: 3.2.40 </div>
<br />
<使用機器><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)<br />
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル) <br />
OpenBlocks A6 DPパッケージ (DPパッケージのみjavaライセンス付きでの出荷をしています) </div>
<br />
<b><span style="font-size: large;">1. RXTXライブラリおよびlibrxtxSerialのインストール</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
それぞれ、Debainのパッケージによりインストールします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# aptitude install librxtx-java<br />
# aptitude install libserializer-java</div>
<br />
RXTXライブラリを以下の場所にコピーします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# cp /usr/share/java/RXTXcomm.jar /usr/lib/jre/lib/ext/</div>
<br />
librxtxSerialを以下の場所にコピーします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# cp /usr/lib/jni/librxtxSerial-2.2pre1.so /usr/lib/jre/lib/arm/librxtxSerial.so</div>
<br />
<b><span style="font-size: large;">2. 動作確認および開発環境の構築について</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
RXTXによるシリアル通信を行うのであれば、上記のセットアップにより、基本的には、他のプラットフォーム上で開発したclassファイルやjarファイルを実行できるかと思います。<br />
<br />
OpenBlocks上で開発も行う場合は、一つの方法としては、Debianのパッケージより、java7-jdkなどを導入する方法があります。( 導入されるのはopenjdkです )<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# aptitude install java7-jdk</div>
<br />
java7-jdkにも、librxtxSerialが含まれますので、こちらを使用する場合は、libserializer-javaの導入の必要はありません。<br />
<br />
作成したプログラムは、以下のようにjavacにてクラスファイルに変換してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# javac -cp /usr/lib/jre/lib/ext/RXTXcomm.jar test.java</div>
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-46903293773098268482014-04-18T13:39:00.000+09:002014-04-18T14:20:23.202+09:00OpenBlocks Aシリーズ rootfs変更方法 (SSD(SATA)ブート) [debian Wheezy][AX3][A7][A6]OpenBlocks Aシリーズのカーネルの起動をSSD(SATA)から行う方法について<br />
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
本機能は、OpenBlocksの機能の一部として実装されているものですが、当社の提供する標準のパッケージ構成ではないため、動作の保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
Debian 7.1 Wheezy<br />
OpenBlocks AX3/4 kernel: 3.2.40<br />
OpenBlocks A7 Ketnel 3.2.40 <br />
OpenBlocks A6 kernel: 3.2.40 </div>
<br />
<使用機器><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)<br />
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル) <br />
OpenBlocks A6 DPパッケージ (もしくは、SSD搭載モデル) </div>
<br />
<b><span style="font-size: large;">1. SSDの準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
SSDを用意します。もし、標準構成でDEBIANのラベルを設定済みでしたら、ラベルを削除し、本体を再起動してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# e2label /dev/sda1 ""<br />
</div>
<br />
再起動後、ラベルを/に変更します。<br />
を再起動してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# e2label /dev/sda1 /<br />
</div>
<br />
ファイルシステムは、現在のAシリーズはすべてext4を採用していますが、ubootがカーネルの起動を行うドライブは、ext3までしか対応していません。<br />
再フォーマットが必要な場合は、以下の通り、ext3などを使用してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# mke2fs -j -L "/" /dev/sda1<br />
</div>
<br />
<b><span style="font-size: large;">2. debootstrapによるrootfsの作成と修正</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
rootfs
は、以下の記事と同様に、debootstrapで作成しました。詳細については、以下の記事を参考にしてください。<br />
<br />
<div class="post-title entry-title">
<a href="http://obdnmagazine.blogspot.jp/2014/04/openblocks-rootfs-frasgrom-debian.html">OpenBlocks Aシリーズ rootfs変更方法 (FlashROMブート) [debian Wheezy][AX3][A7][A6]</a></div>
<br />
<b><span style="font-size: large;">3. SSDブート用のファームウェアの作成</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
SSDブート用ファームウェアは、LinuxであればPCでもAシリーズでも作成することができます。<br />
<ol>
<li>FTPサイトよりSSDブート用のラムディスクイメージを取ってきます。<br />
<br />A6/A7 : <a href="ftp://ftp.plathome.co.jp/pub/ssdlinux/1.0.0-LATEST/arm-obsa6/installation/ramdisk.image-extboot.obsa6.gz">ftp://ftp.plathome.co.jp/pub/ssdlinux/1.0.0-LATEST/arm-obsa6/installation/ramdisk.image-extboot.obsa6.gz</a><br />
<br />AX3 : <a href="ftp://ftp.plathome.co.jp/pub/ssdlinux/1.1.0-LATEST/arm-obsax3/installation/ramdisk.image-extboot.obsax3.gz">ftp://ftp.plathome.co.jp/pub/ssdlinux/1.1.0-LATEST/arm-obsax3/installation/ramdisk.image-extboot.obsax3.gz</a><br /><br /> </li>
<li> FTPサイトよりカーネルを取ってきます。<br />
<br />A6 : <a href="ftp://ftp.plathome.co.jp/pub/OBSA6/wheezy/3.2.40-3/zImage">ftp://ftp.plathome.co.jp/pub/OBSA6/wheezy/3.2.40-3/zImage</a><br />
<br />A7 : <a href="ftp://ftp.plathome.co.jp/pub/OBSA7/wheezy/3.2.40-4/zImage">ftp://ftp.plathome.co.jp/pub/OBSA7/wheezy/3.2.40-4/zImage</a><br />
<br />AX3 : <a href="ftp://ftp.plathome.co.jp/pub/OBSAX3/wheezy/3.2.40-4/zImage">ftp://ftp.plathome.co.jp/pub/OBSAX3/wheezy/3.2.40-4/zImage</a> </li>
<li>uboot-mkimageパッケージをインストールします。<br /><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# apt-get install uboot-mkimage
</div>
<br />
<code><pre></pre>
</code></li>
<li>mkimageコマンドでSSDブート用ファームウェアを作成します。<br />
<br />AX3の場合(A6/A7ではラムディスク名とファームウェア名を変更します)<br /><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# mkimage -n "コメント(日付やバージョンなど)" -A arm -O linux -T multi -C none -a 0x8000 -e 0x8000 -d zImage:ramdisk.image-extboot.obsax3.gz uImage.initrd-extboot.obsax3
</div>
<br />
<code></code></li>
<li> rootfsの/bootにSSDブート用ファームウェアをコピーします。<br />
<br />AX3でSSDがsda1の場合<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# mount /dev/sda1 /mnt<br />
# cp uImage.initrd-extboot.obsax3 /mnt/boot<br />
# umount /mnt
</div>
<br />
</li>
<li>rootfsとするパーティションのラベルを"/"にします。<br /><br />
rootfsが/dev/sda1の場合<br /><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# e2label /dev/sda1 /</div>
</li>
</ol>
<b><span style="font-size: large;">3. ブート方式の切り替え</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
ユーザーズマニュアルを参考に、本体のDIP SW3をONにして立ち上げます。(SATA起動)<br />
SATA起動に切り替えた場合のconsoleメッセージは以下の通りです。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre>U-Boot 1.1.4 (Feb 5 2014 - 12:38:30)
Plat'Home version: 1.2.13 A7 (Base: Marvell version: 3.5.9)
U-Boot code: 00600000 -> 0067FFF0 BSS: -> 006CF480
Soc: 88F6282 A1CPU running @ 600Mhz L2 running @ 300Mhz
SysClock = 300Mhz , TClock = 200Mhz
DRAM (DDR3) CAS Latency = 6 tRP = 5 tRAS = 15 tRCD=5
DRAM CS[0] base 0x00000000 size 256MB
DRAM CS[1] base 0x10000000 size 256MB
DRAM CS[2] base 0x20000000 size 256MB
DRAM CS[3] base 0x30000000 size 256MB
DRAM Total size 1GB 16bit width
Addresses 8M - 0M are saved for the U-Boot usage.
Mem malloc Initialization (8M - 7M): Done
NAND:256 MB
POST: mac verify Eth0 PASSED Eth1 PASSED
CPU : Marvell Feroceon (Rev 1)
Streaming disabled
Write allocate disabled
Module 0 is RGMII
USB 0: host mode
USB 1: host mode
USB 2: host mode
USB 3: host mode
Net: egiga0, egiga1
Hit any key to stop autoboot: 0
Run Boot Selection Script
*** SW 1 IS OFF ***
*** SW 2 IS OFF ***
*** SW 3 IS ON, Boot from SATA ***
Reset IDE:
Marvell Serial ATA Adapter
Integrated Sata device found
[0 0 0]: Enable DMA mode (6)
Device 0 @ 0 0:
Model: ADATA SSD S396 30GB Firm: 3.3.2 Ser#: 02501132500100000227
Type: Hard Disk
Supports 48-bit addressing
Capacity: 30533.8 MB = 29.8 GB (62533296 x 512)
Loading ...
2926770 bytes read
Bootargs: ramdisk_size=8192 root=LABEL=/ vmalloc=200M rootdelay=7 mtdparts=nand_mtd:0x1c0000@0x0(uboot)
ro,0x2c0000@0x1c0000(env),0x160000@0x480000(test)ro,0x540000@0x5e0000(conf),0x3d40000@0xb20000(linux),0x9660000@0x4860000
(user),0x2140000@0xdec0000(opt) console=ttyS0,115200
## Booting image at 02000000 ...
Image Name: OBS-A7-3.2.40-4
Created: 2014-04-18 2:37:42 UTC
Image Type: ARM Linux Multi-File Image (uncompressed)
Data Size: 2926706 Bytes = 2.8 MB
Load Address: 00008000
Entry Point: 00008000
Contents:
Image 0: 2542808 Bytes = 2.4 MB
Image 1: 383886 Bytes = 374.9 kB
Verifying Checksum ... OK
OK
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 3.2.40 (root@release-firmware) (gcc version 4.7.2 (Debian 4.7.2-4) ) #1 Fri Mar 7 16:24:48 JST 2014
CPU: Feroceon 88FR131 [56251311] revision 1 (ARMv5TE), cr=00053977
CPU: VIVT data cache, VIVT instruction cache
Machine: Plat'Home OpenBlocks A7
Memory policy: ECC disabled, Data cache writeback
BUG: mapping for 0xf4000000 at 0xf4000000 overlaps vmalloc space
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 260096
Kernel command line: ramdisk_size=8192 root=LABEL=/ vmalloc=200M rootdelay=7 mtdparts=nand_mtd:0x1c0000@0x0(uboot)
ro,0x2c0000@0x1c0000(env),0x160000@0x480000(test)ro,0x540000@0x5e0000(conf),0x3d40000@0xb20000(linux),0x9660000@0x4860000
(user),0x2140000@0xdec0000(opt) console=ttyS0,115200
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 1024MB = 1024MB total
Memory: 1033400k/1033400k available, 15176k reserved, 229376K highmem</pre>
</div>
<br />
電源を入れ直すか、bootと入力して起動してください。<br />
<br />
<b><span style="font-size: large;">4. 補足</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
SATA起動は、ext3以前のファイルシステムをサポートしており、現状では、ext4でフォーマットされたドライブからの起動が出来ません。<br />
rootfsをext4で使用したい場合は、起動用のパーティションとして、/dev/sda1を、rootfs用のパーティションとして/dev/sda2を別に作成して使用してください。<br />
<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0tag:blogger.com,1999:blog-3189805224875557512.post-18325710086177268662014-04-17T17:10:00.000+09:002014-06-12T11:57:40.727+09:00OpenBlocks Aシリーズ rootfs変更方法 (FlashROMブート) [debian Wheezy][AX3][A7][A6]OpenBlocks AシリーズにおいてrootfsをSSDに変更する手順を記述します。<br />
<br />
OpenBlocks Aシリーズでは、ディスクレス運用のためのRAMディスクモードと、ストレージ併用モードを標準的にサポートしています。<br />
(それぞれのモードについては、以下の記事を参照してください。)<br />
<br />
<div class="post-title entry-title">
<a href="http://obdnmagazine.blogspot.jp/2013/01/openblocks.html">OpenBlocksの動作モードについて</a></div>
<br />
ストレージ併用モードにおいて、SSDなどのストレージデバイスはaufs(squeezeベースまではunion)によるマウントを行っていますが、aufsによる共有モードではなく、SSDに構築したrootfsを直接マウントして使用することも可能です。<br />
<br />
また、カーネル自体も、フラッシュROMからだけでなく、SSDなどのストレージデバイスからの起動も行えます。<br />
<br />
今回は、フラッシュROMから起動し、SSD側で用意したrootfsをマウントする方法について解説します。<br />
<br />
rootfsはDebian, Fedora, Ubuntuなど好きなものをあらかじめ作成して使用しますが、今回は、debootstarapを用いてDebian wheezyパッケージを作成し、OpenBlocks独自のハードウェア制御を追加した、標準のファームウェアパッケージと同等の機能を持つものを作成しました。<br />
<br />
<div style="background-color: #ffc78e; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
本機能は、OpenBlocksの機能の一部として実装されているものですが、当社の提供する標準のパッケージ構成ではないため、動作の保証およびサポートを行うものではありません。<br />
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。</div>
<br />
<検証環境><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
Debian 7.1 Wheezy<br />
OpenBlocks AX3/4 kernel: 3.2.40<br />
OpenBlocks A7 Ketnel 3.2.40 <br />
OpenBlocks A6 kernel: 3.2.40 </div>
<br />
<使用機器><br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)<br />
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル) <br />
OpenBlocks A6 DPパッケージ (もしくは、SSD搭載モデル) </div>
<br />
<b><span style="font-size: large;">1. SSDの準備</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
SSDを用意します。もし、標準構成でDEBIANのラベルを設定済みでしたら、ラベルを削除し、本体を再起動してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># e2label /dev/sda1 ""</pre>
</div>
<br />
再起動後、ラベルを/に変更します。<br />
を再起動してください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># e2label /dev/sda1 /</pre>
</div>
<br />
ファイルシステムは、現在のAシリーズはすべてext4を採用しています。<br />
もし、新たにフォーマットする場合は、以下のコマンドをご使用下さい。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># mkfs.ext4 -L "/" /dev/sda1</pre>
</div>
<br />
<b><span style="font-size: large;">2. debootstrapによるrootfsの作成と修正</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
SSDを/mntにマウントして、rootfsを作成しますが、標準のファームウェアパッケージにはdebootstrapが含まれていたいため、debootstrapをインストールする必要があります。<br />
なお、ファームウェアをRAMディスクモードで起動した後、ネットワークの設定を行う必要があります。 <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># aptitude update</pre>
<pre># aptitude install debootstrap </pre>
</div>
<br />
インストールしたパッケージを保存する場合は、以下のflashcfgコマンドにて行ってください。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># flashcfg -S </pre>
</div>
<br />
SSDを/mntにmountします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># mount /dev/sda1 /mnt</pre>
</div>
<br />
debootstrapにより、rootfsを作成します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># debootstrap --exclude=ed,nano --arch armel wheezy /mnt http://ftp.jp.debian.org/debian</pre>
</div>
<br />
/mnt/etc/inittabのT0のパラメータを修正します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre>T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100</pre>
</div>
<br />
chrootしてrootパスワードを変更します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># chroot /mnt</pre>
<pre># passwd root</pre>
<pre># exit </pre>
</div>
<br />
ファームウェアから必要なファイルをコピーし、モジュール構成を更新します。 <br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># cp -R /lib/modules /mnt/lib
# cp /usr/sbin/runled /mnt/usr/sbin
# cp /usr/sbin/pshd /mnt/usr/sbin</pre>
<pre># depmod -a</pre>
</div>
<br />
<br />
fstabを編集します。<br />
ext4の場合は、以下の通り。ext3の場合はdiscardは不要です。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># vi /mnt/etc/fstab</pre>
<pre></pre>
<pre>/dev/sda1 / ext3 defaults notime, discard
proc /proc proc defaults 0 0
#none /tmp tmpfs size=64m 0 0
#cgroup /sys/fs/cgroup cgroup defaults 0 0</pre>
</div>
<br />
/etcの下のinit関連のファイルをコピーします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
# cp /etc/init.d/pshd /mnt/etc/init.d<br />
# cp /etc/init.d/runled /mnt/etc/init.d<br />
<br />
# cd /mnt/etc/rc0.d<br />
# ln -s ../init.d/pshd K01pshd<br />
# ln -s ../init.d/runled K01runled<br />
<br />
# cd /mnt/etc/rc2.d<br />
# ln -s ../init.d/pshd S99pshd<br />
# ln -s ../init.d/runled S99runled<br />
<br />
# cd /mnt/etc/rc6.d<br />
# ln -s ../init.d/pshd K01pshd<br />
# ln -s ../init.d/runled K01runled<br />
<br />
# cp /etc/init.d/.depend.start /mnt/etc/init.d<br />
# cp /etc/init.d/.depend.stop /mnt/etc/init.d</div>
<br />
/etc/apt/sources.listをコピーします。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre># cp /etc/apt/sources.lst /mnt/etc/apt</pre>
</div>
<br />
<b><span style="font-size: large;">3. ubootのパラメータ変更と起動</span></b><br />
<hr color="#d0d0d0" size="1" />
<br />
OpenBlocks本体を再起動します。<br />
起動時にコンソール上でキーボードを押すとubootのプロンプトが表示されます。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre>openblocks> printenv root
root=/dev/ram
openblocks> setenv root /dev/sda1
openblocks> saveenv
Saving Environment to Flash...</pre>
</div>
<br />
電源を入れ直すか、bootと入力して起動してください。<br />
<br />
なお、rootfsをUSBストレージなどで構築した場合、 USBストレージの初期化の時間の関係で、マウントエラーが起きます。その場合は、rootdelayパラメータで調整してください。<br />
<br />
システムを元に戻す場合は、rootに/dev/ramを設定します。<br />
<br />
<div style="background-color: #f6f6f6; border: solid #d0d0d0 1px; overflow: auto; padding: 8px; word-wrap: normal;">
<pre>openblocks> setenv root /dev/ram</pre>
<pre>openblocks> saveenv
Saving Environment to Flash...</pre>
</div>
<br />
<br />Toshiya Gotohttp://www.blogger.com/profile/17672016601856650400noreply@blogger.com0