私の質問の短いバージョン:
HTTP またはシリアル ポートを介して受信した入力をリッスンして応答し、これらのチャネルを介して独自に通信を開始できる単一の Python スクリプトを設計するにはどうすればよいですか? 私の問題は、(i) Web フレームワークを使用して HTTP 入力のポートをリッスンし、(ii) 着信 HTTP 要求に依存しない他の作業も行う単一のスクリプトを設計する方法を理解していないことです。
詳細バージョン: Python を使用して、次のことを行うシステムを設計したいと考えています。
- 不定期のレポート用にシリアル ポートをリッスンします。具体的には、JeeNodeセンサー (ワイヤレス Arduino 互換モジュール) のネットワークがあり、中央のJeeLinkと通信します。これは、USB 経由でコンピューターに接続し、 pySerial経由で Python スクリプトと通信します。
- 不定期の入力のために Web URL をリッスンします。具体的には、ユーザーは SMS 経由でシステムにコマンドをTwilio番号に送信します。Twilio は SMS メッセージをインターセプトし、指定した URL に投稿します。Bottle マイクロ Web フレームワークを使用して、新しい HTTP リクエストをリッスンします。
- 両方のタイプ (シリアルと HTTP) の入力に応答します。たとえば、ユーザーがコマンド「Sleep」をテキスト送信した場合、(i) シリアル ポートを介してセンサーにスリープ状態になるように指示します -> JeeLink (その後、コマンドがリモコンに転送されます)。(ii) 送信者 (および場合によっては他のユーザー) に、コマンドが受信され、実行されていることを返信します。
- ときどき、ユーザー (HTTP -> Twilio -> SMS 経由) またはリモート センサー (シリアル -> JeeLink 経由) への独自の通信を開始しますが、入力イベントは発生しません。2 つの例: (1) 新しい入力を受け取っていない場合でも、N 分ごとにユーザーまたはリモート センサーに報告したいと考えています。(2) リモコンが実際にスリープ モードになったことをユーザーに伝えたい。リモコンはバッテリー駆動であるため、ほとんどの時間をアクセスできない低電力モードで過ごします。5 分ごとにワイヤレスの「チェックイン」を開始した場合にのみ、JeeLink から新しいコマンドを受信できます。そのため、技術的にはリモートはユーザー コマンドに応答してスリープ (またはウェイクアップなど) しますが、コマンドと応答は事実上独立しています。
私の問題は、私が見た Web フレームワークの使用例のすべてが、すべての促進イベントが HTTP リクエストを介して発生することを想定しているように見えることです。Bottle オブジェクトを作成し、指定された URL パスに一致する HTTP 要求が検出されるたびに実行されるコードをそのオブジェクトにバインドするデコレータを使用できます。しかし、シリアルポートをリッスンするなど、HTTPイベントとは無関係の他の作業を同時に実行しながら、それを行う方法がわかりません。
多くの苦労の後、私が現在検討している潜在的な解決策は次のとおりです。
- 機能を個別のスクリプトに分割します。A.py は HTTP 経由でテキスト メッセージをリッスンし、関連情報をデータベースに書き込みます。B.py は、新しいレコードのデータベースを継続的に読み取り、それに応じて反応するだけでなく、シリアル モニターをリッスンして他の作業を行います。これは問題なく機能するように見えますが、エレガントではないように感じます。私が気付いていないより簡単な解決策があるのではないかと思います。
- 多分答えはPythonデコレータに関連していますか? さまざまなデコレーターを使用して URL パスを指定し、一致する HTTP 要求が着信したときに、デコレーターにバインドされたコードを実行します。それで、HTTPリクエストをリッスンするのではなく、「メイン」のPythonコードが指示したときに実行される他の種類のデコレータを指定する方法があるのではないかと思いますか?しかし、これが本当かどうかを知るには、デコレータについて十分に知りません。