python > udpLogger > UDP受信した文字列をファイル保存する

```txt:動作確認
ロガー: Mac OS X 10.8.5 ターミナル
データ送信: CentOS 6.5 または ESP8266
```

僕がよく訪問するブログにてESP8266のGPIO数の制限によりSD保存などを行うためのGPIO割当てができないことがある、というような記載があった。

GPIO数の制限に対してどうするか考えた時、borgSensorSystem1で実現しようとしていたことを思い出した。「SD保存機能を外に持たせる」ということ。

とりあえず機能を確認するためのpythonコードを実装した。SD保存でなくローカルファイル保存とした。

## 動作

ポート: 7001
通信: UDP

上記ポートに対して`CR`までの文字列を受信したらファイル保存する。

ファイルは`Log`フォルダ以下に日付が名前についたものとする（例: `Log/160418.log`)

## code v0.1

[v0.1 @ github](https://github.com/yasokada/python-160418_udpLogger/releases/tag/v0.1)

## 使用例

### 受信側(ロギング側)

Mac OS X 10.8.5のターミナルにてudpLogger.pyスクリプトを置いた場所に移動して、プログラムを実行状態にする.

```
$ cd /Users/7of9/Documents/pythonProject/python-160418_udpLogger 
$ python udpLogger.py
```

今回の動作例では、こちらのIPアドレスは 192.168.10.3 となっている

### 送信側 (例)

送信例としてCentOS 6.5から以下のように実行する.
ESP8266からの送信に対応する。

```
$ echo "AAA" | nc -w 1 -u 192.168.10.3 7001
$ echo "BBB" | nc -w 1 -u 192.168.10.3 7001
```

以上によりpython実行側のLogフォルダ以下に上記のAAA, BBBの文字列が保存される.

```txt:Log/160418.log
2016/04/18,22:07:57,587,AAA
2016/04/18,22:08:05,649,BBB
```

587, 649はそれぞれの時刻のミリ秒の値。

## 備考

通常、udpLoggerのIPアドレスを送信者(ESP8266)は知らない.ある範囲のIPアドレスに問い合わせをしてudpLoggerのIPを知る仕組みが必要。 

当面は固定IPアドレスで使うというのも手ではある。

あるいは[送信先IPアドレスを設定する仕組み](http://qiita.com/exabugs/items/2f67ae363a1387c8967c)を使うのでもいいかも。

将来的にはこの機能をESP8266+SDやSD保存モジュールなどと置き換えることで保存機能のポータビリティを持たせたい。うまく置き換えできれば「リスコフの置換原則」と同様、データ送信者は置き換わったことを知らずにその機能が使用できる、となる。

SD保存をESP8266で持たせるのと、WiFi通信をするのとどちらが低消費電力かは未消化。

## ESP8266側コード
(追記 2016/04/19)

ESP8266側から送信するコード例は以下に投稿していた。

http://qiita.com/7of9/items/a61999a914ae02673b8d

```
static const char *kRemoteIpadr = "192.168.10.4";
static const int kRmoteUdpPort = 9000;
```
を上記の場合に合わせて

```
static const char *kRemoteIpadr = "192.168.10.3";
static const int kRmoteUdpPort = 7001;
```
として使う。

使ってみた。

```txt:Log/160419.log
2016/04/19,07:02:34,522,from ESP8266
2016/04/19,07:02:34,522,from ESP8266
2016/04/19,07:02:37,399,from ESP8266
2016/04/19,07:02:34,522,from ESP8266
2016/04/19,07:02:37,399,from ESP8266
2016/04/19,07:02:40,401,from ESP8266
2016/04/19,07:02:34,522,from ESP8266
2016/04/19,07:02:37,399,from ESP8266
2016/04/19,07:02:40,401,from ESP8266
2016/04/19,07:02:43,400,from ESP8266
2016/04/19,07:02:34,522,from ESP8266
2016/04/19,07:02:37,399,from ESP8266
2016/04/19,07:02:40,401,from ESP8266
2016/04/19,07:02:43,400,from ESP8266
2016/04/19,07:02:46,401,from ESP8266
```

5回送信したはずが上記のようなログになっている。
バグがあるようだ。


## code v0.2 (保存処理修正)

前に受信した文字列をloggerインスタンスの中で保持したものに新規受信文字列を追加した上で保存処理（追記）していたバグがあったので修正した。

[v0.2 @ github](https://github.com/yasokada/python-160418_udpLogger/releases/tag/v0.2)

変更したのは以下の処理でlogger.clear()を追加したこと。

```udpLogger.py
def procData(rcvdat, logger):
	workdat = rcvdat.rstrip() # remove CR, LF
	print workdat
	logger.add(workdat)
	logger.save()
	logger.clear()
```

以下の通り、同じ時刻のデータが保存されなくなった(バグフィックスできた)。
ESP8266からは3秒おきに送信されていて、だいたいあっている。

```txt:Log/160419.py
2016/04/19,07:10:29,147,from ESP8266
2016/04/19,07:10:32,219,from ESP8266
2016/04/19,07:10:35,189,from ESP8266
2016/04/19,07:11:26,185,from ESP8266
2016/04/19,07:11:29,155,from ESP8266
2016/04/19,07:11:32,227,from ESP8266
2016/04/19,07:11:35,199,from ESP8266
2016/04/19,07:11:38,166,from ESP8266
```