2018年08月25日

Kibanaコード更新方法

OSS版のKibanaで可視化ツールとして使用する場合に
ちょっと表示の挙動を変えたい、
表示文字列を変えたい
ということがある場合に今回、紹介する方法が役立ちます。


Kibanaはhtmlやjsのコードを最適化して
最適化したファイルから起動します。
そのため、Kibanaのsrcフォルダといったコードのフォルダを
修正、更新しても反映されません。



修正を反映させるポイントは
kibanaフォルダ直下のoptimizeフォルダ内のファイルを全部消す
ことです。

次回の起動時に自動的にsrcフォルダ等からoptimizeデータが生成され、
修正を反映させることができます。


なお、OSS版のKibanaはApache2のため、
修正箇所を外部に公開する必要はありませんが、
ユーザー側に修正箇所を知らせる必要があります。

posted by Crescent at 21:28| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年08月18日

WIZnet ioLibrary NTPの不具合

W5500などのEthenetr IC用のCライブラリ、
WIZnet ioLibraryの中でNTPの不具合の対処方法を紹介します。

ネットワークから時刻を取得して同期する機能として
NTPがあります。クライアント側のみに対応したSNTPの関数が
WIZnet ioLibraryの中に用意されています。


ArduinoではC++サンプルコードがあり、
NTPの不具合は受けません。


不具合としては
NTPで時刻を取得できない現象です。

原因としてはリトライカウントが増えず、
リクエストの再送信が行われませんでした。
1回目の時刻取得のリクエスト以降、
再送されず、ずっと返答待ち状態になってしまいます。

特に接続直後のネットワークが確立していない状態で
NTPで時刻取得のリクエストすると
1回目のリクエストを落としてしまう可能性が非常に高く、
リクエストの再送信が重要となります。



Cライブラリで用意されているSNTP関数の中に
int8_t SNTP_run(datetime *time)があり、
リトライカウントに応じた処理をしています。

【修正前】
〜〜〜〜〜〜〜〜〜〜
if(ntp_retry_cnt<0xFFFF)
{
  if(ntp_retry_cnt==0)//first send request, no need to wait
  {
    sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
    ntp_retry_cnt++;
  }
  else // send request again? it should wait for a while
  {
    if((ntp_retry_cnt % 0xFFF) == 0) //wait time
〜〜〜〜〜〜〜〜〜〜


【修正後】
〜〜〜〜〜〜〜〜〜〜
if(ntp_retry_cnt<0xFFFF)
{
  if(ntp_retry_cnt==0)//first send request, no need to wait
  {
    sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
    ntp_retry_cnt++;
  }
  else // send request again? it should wait for a while
  {
     ntp_retry_cnt++;//追加
     if((ntp_retry_cnt % 0xFFF) == 0) //wait time
〜〜〜〜〜〜〜〜〜〜

上記の修正である間隔でリクエストの再送信が行われるようになります。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年08月04日

Arduino& W5500からelasticsearchへのデータ投入

今回はArduino&W5500からelasticsearchへデータ投入する方法を紹介します。

W5500の代わりにESP32やESP02などのWiFiモジュールでもほとんど同じです。


httpクライアントからpostしてデータを
elasticsearchへ投入するのが正統派の方法です。

今回はコードを減らすため、
httpクライアントを使用せずにTCPのみでデータを投入します。

httpのpostは結局、TCPで下記の文字列送っているだけなので、
単純な処理であればTCPのみで実装できます。


POST /test_index1/data HTTP/1.1
Content-Type: application/json
Content-Length: 99
Host: 192.168.XXX.XXX:9200
Connection: close

{
"index":"test_index",
"type":"data",
"date": "2018-07-10T13:56:06.000Z",
"temp": 28.5,
"humd": 70.2
}


1. Elasticsearch側の設定
 Elasticsearchを起動させているPCのLANといった外部からデータを投入するため、
 config/elasticsearch.ymlファイルに下記の文字を追記します。

# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 0.0.0.0
http.port: 9200
transport.host: localhost
transport.tcp.port: 9300


2. Elasticsearchを起動させているPCのLANを設定します。
 今回はW5500とPCをLANケーブルで直結します。
 最近のLANは自動的に接続状態を判別するため、
 クロスケーブルでなくても、普通のストレートケーブルが使用できます。

 直結でDHCP無効のため、PC 192.168.1.1と設定します。

elastic-arduino0.png

 なお、W5500側は192.168.1.2を設定しています。

3. W5500&Arduinoの設定
 W5500のシールドを乗せたArduinoに下記のコードを書き込みます。
 今回のコードはデータ送信後のhttp post成功の有無を確認していません。
 実際の運用ではデータ送信後の200、201などの成功有無確認が必要です。

 処理の流れ
 [W5500初期化]→[接続]→[データ送信]→[切断]

4. 動作確認
 PCとW5500をLANケーブルで接続し、Elasticsearchを起動させます。
 この状態でコードを書き込んだArduinoの電源を入れ、
 シリアルモニタで確認するとデータが投入されます。
 成功すると下記のように
 「HTTP/1.1 201 Created…」
 と成功したことが分かります。

elastic-arduino.png

5. Elasticsearch Kibanaの動作確認
 kibanaを起動させます。
 最初はインデックスパターンが何も設定されていないため、
 データを投入しても何も表示されません。
 Manegementから今回の「test_index」を欄に入れ、
 「Next Step」をクリックします。

 kibana-1.png


 続いて送信データ内の日付情報のデータを選択します。
 「Create index pattern」をクリックして設定を完了します。



 「Discover」に戻って、右上の時間範囲を「This year」などを選択すると
 データが入っていることが分かります。



  kibanaは未来のデータは表示できません。
 また、今回投入したデータの日付は固定時刻ですが、
 実際はRTC等からUTC時刻を取得して送信する必要があります。

 このようにArduinoからElasticsearchに簡単にデータ投入が可能です。
 W5500でなくても同様のシリーズの他、
 無線LANでTCP送信可能なESP-WROOM-02やESP-WROOM-32からでも簡単に
   Elasticsearchにデータ投入して、kibanaで可視化することができます。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする