Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.
動作確認
ロガー: 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

使用例

受信側(ロギング側)

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の文字列が保存される.

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アドレスを設定する仕組みを使うのでもいいかも。

将来的にはこの機能を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;

として使う。

使ってみた。

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

変更したのは以下の処理で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秒おきに送信されていて、だいたいあっている。

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした