2017年10月21日

MicroPythonでurequestsを使う

ESP32版のMicroPythonでは、urequestsモジュールが標準で組み込まれています(現時点では)。
これはWebサーバにリクエストを投げて、応答を得るためのライブラリで、PythonのrequestsモジュールのMicroPython版(機能はだいぶ削られていますが)です。

現時点では、GET、HEAD、PUT、POST、PATCH、DELETEの各HTTPリクエストが実装されています。
PATCHというHTTPメソッドがあるんですね。初めて知りました。
ただ、このモジュールのソースを見るとHTTPバージョン1.0でリクエストを投げるようになっているので、HTTP 1.1のメソッドであるPATCHを要求するとエラーになる可能性もあるように思います。

サーバから返された結果はResponseオブジェクトに格納されます。

このオブジェクトは、

 status_code HTTPステータスコード(正常なら200)
 reason HTTPステータスコードのReason(正常なら'OK')
 encoding 文字コード(ただし現状では'utf-8'固定の実装となっている)
 content 生の応答データ
 text contentをencodingに従ってテキストに変換したもの
 json() contentをjsonとして解釈したもの(ujsonモジュールを使用)
 
を得ることができます。

内部的には、HTTPヘッダを読み終えた時点でソケットオブジェクトがResponseオブジェクトに渡されます。
ソケットオブジェクトはrawプロパティにセットされ、contentが初めて参照されたときにそのソケットからデータを読んでオブジェクト内にキャッシュするようになっています。
ソケットをcloseするには、close()を呼びます。

何度か例題に取り上げた、現在の為替レートを得るWebサービスにアクセスするには、以下のようになります。



WiFiに接続する部分は上記には入っていませんが、それでも短いですね。

ただし、現時点ではこのコードはESP32/ESP8266のMicroPythonでないと動かないと思います。
urequestsは内部でsocket.readline()を使用していますが、CC3100やWIZnet5Kなど、上記以外のNICではreadline()が実装されていないからです。

そのため、WIZnet5Kに関してはTCP/IP実装はlwIPを使用し、WIZnet5Kは単なるイーサネットインタフェースとして使用するようなMicroPython側のドライバ実装が現在テスト中のようです。

stm32: Incorporate lwip stack and use Wiznet in MACRAW mode by dpgeorge ・ Pull Request #3379 ・ micropython/micropython

ただ、TCP/IPをメインCPUで処理するため、WIZnet5Kのソケット機能を使う場合よりも速度は低下するようです。
ラベル:MicroPython
posted by boochow at 18:28| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
人気記事