いっぺーちゃんの いろいろやってみよ~

micropython on ESP32 でTwitter(その4)

前回の受信プログラムはブロッキング動作のため、受信動作を行うとコールバック以外の処理が行えなくなってしまいます。
そこで、今回はノンブロッキング動作に変更して他の処理を行えるように変更してみます。

とはいえ、tiny_twitterモジュールには既にノンブロッキング動作を行える仕組みが組み込んであります。
以下のプログラムをコンソールでコピペ実行するか、pyboard.pyで実行します。

 

consumer_key    = '取得した Consumer key'
consumer_secret = '取得した Consumer secret'
access_token    = '取得した Access Token'
access_secret   = '取得した Access Token Secret'

import sys
platform = sys.platform
# platform :    ESP32 => 'esp32'
#               Linux => 'linux'

from tiny_twitter import tiny_twitter
import ujson as json

if platform == 'esp32' :
    # ESP32のときは時刻合わせする
    import ntptime
    import utime
    utime.set_time(ntptime.time())

# データ受信時のコールバック関数
def CallbackFunc(jsn) :
    # print("#### " + json.dumps(jsn))
    print("--------\n" + jsn.get("text", "NO_DATA") + "\n--------")

# 初期化
tw = tiny_twitter(consumer_key, consumer_secret, access_token, access_secret, CallbackFunc, blocking=False, debug=True)


# twitterに接続
param = {"with":"user", "track":"てすとつぃーと"};
tw.userstream(param);


# プロンプト
prmpt = ['-', '\\', '|', '/']
# 表示するプロンプトのインデックス
idx = 0
# 受信ループ
while True :
    if tw.recieve() < 0 :
        # クローズされたら終了
        break
    # プロンプトをくるくる回す
    print(prmpt[idx], end="\r")
    idx = (idx + 1) & 0x03

tiny_twitter.userstream()は、twitterに接続し、レスポンスヘッダを受信した後戻ってきます。

後は定期的にtiny_twitter.recieve()を実行します。
受信データがあれば、ブロッキング動作時と同様にcallbackが呼び出されます。
このプログラムでは、特にほかにやることがないので、プロンプトをくるくると回しています。
フォントが円マーク(¥)でなく、バックスラッシュ(\)なら棒がくるくる回っているように見えると思いますが。。。

 

以下、前回からの変更箇所の説明。

初期化のパラメータに「blocking=False」を追加しています。
パラメータ blockingは、省略時Trueになるように設定されているので、前回のプログラムでは「blocking=True」を指定したのと同等です。

 

tw = tiny_twitter(consumer_key, consumer_secret, access_token, access_secret, CallbackFunc, blocking=False, debug=True)

 

メインループです。
定期的にtw.recieve()をコールして受信処理を行っています。
接続がクローズされると、tw.recieve()は-1を返します。それ以外(受信データがあってもなくても)は0を返します。
接続がクローズされたらループから抜けてプログラム終了です。
ループ内では'-', '\'(半角), '|', '/' を順に表示しています。
実際はここで本来やりたい処理を行います。

# プロンプト
prmpt = ['-', '\\', '|', '/']
# 表示するプロンプトのインデックス
idx = 0
# 受信ループ
while True :
    if tw.recieve() < 0 :
        # クローズされたら終了
        break
    # プロンプトをくるくる回す
    print(prmpt[idx], end="\r")
    idx = (idx + 1) & 0x03

 

明示的にクローズしたいときは、以下のように実行します。

tw.close()

 

micropython on ESP32 でTwitter シリーズはこれにて一旦終了です。