0

3gネットワークを使用して、raspberrypiからホストされているphp+mysqlデータベースに一連のセンサー読み取り値を送信しています。

帯域幅とエネルギーを節約するために、センサーの読み取り値を1秒ごとにアップロードするのではなく、定期的に、つまり5分ごとにアップロードすることをお勧めします。そこで、POSTプロセスのアップロードを容易にするために、JSON形式を使用して読み取り値を収集することにしました。

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

また、timer2モジュールを使用してタイマーを設定します。

>>> timer2.apply_interval(msecs, fun, args, kwargs, priority=0)

現在、楽しみは5 * 3600*1000ごとに呼び出されます。楽しいことに、私はペイロードをアップロードし、データ収集の次のラウンドのためにペイロードの内容をリセットします:

>>> r = requests.post(url, data=json.dumps(payload))

質問:

  • メインスレッドからデータを収集しているときに、変数ペイロードの内容を楽しいものからリセットすることをお勧めしますか?

  • これを行うためのより良い方法はありますか?

4

1 に答える 1

0

センサーからデータベースへのデータフローをモデル化するようにプログラムを編成する必要があります。したがって、ポーリングレートでサンプリングメソッドを呼び出す単一のタイマーがあります。サンプリングメソッドの結果をバッファリングメソッドに渡します。バッファリング期間が経過するまでバッファを埋めます。最後に、バッファがいっぱいになるたびに、バッファを投稿します。

import random
import time

def generate_samples():
    while True:
        input('Press ENTER to simulate next sample...')
        yield random.random()

def period_elapsed(period_start, period_duration):
    return period_start + period_duration < time.time()

def collect_buffers(samples, buffer_period):
    buffer_time = time.time()
    buffer_samples = []
    for sample in samples:
        buffer_samples.append(sample)
        if period_elapsed(buffer_time, buffer_period):
            yield buffer_samples
            buffer_samples = []
            buffer_time = time.time()

def post_buffers(buffers, url):
    for b in buffers:
        requests.post(url, data=json.dumps(buffer))

post_buffers(collect_buffers(generate_samples(), 300), 'http://localhost:3000')
于 2013-02-24T19:03:05.540 に答える