Wi-Fi®への接続方法とREST APIにHTTPリクエストする方法を学びます。
Author: Karl Söderby、Last revision: 2024/02/05
モノのインターネット(internet of Things: IoT)は、インターネットに接続したデバイスの総称で、Nano ESP32もその一つです。内蔵アンテナを使い、ボードはインターネットに接続し通信することができます。
根症では、ボードをWi-Fi®ネットワークに接続するのに必要な基本的な方法と、インターネットにテスト接続する方法を示します。
この章では、以下を学びます。
- Nano ESP32をWi-Fi®ネットワークに接続する方法
- インターネット経由でAPIにリクエストする方法
- JSONを使い、レスポンスを可読形式にする方法
- インターネットの時刻サーバーから現在時刻を取得する方法
モノのインターネット(internet of Things: IoT)
IoTは、調査するにはとても広大な領域です。この章では、インターネットへ簡単なリクエストを送信することを達成することに注目します。
IoTを使うには、考える必要のある多くの要素があります。単純化のため、2つの部分に分けて考えます。
- Wi-Fi®ネットワーク(ルーター)への接続方法
- インターネットでリクエストを送信する方法
この章では、network
やsocket
、urequests
といった、多くの新しいモジュールを使います。
Wi-Fi®に接続する
Wi-Fi®への接続は、非常に簡単な概念で、スマートフォンやPCを接続するのにとても似ています。
MicroPythonでは、以下のスクリプトにある数行のコードで実現できます。
import network
WIFI_NETWORK='YOUR_NETWORK_NAME'
WIFI_PASSWORD='YOUR_NETWORK_PASSWORD'
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_NETWORK, WIFI_PASSWORD)
print()
print("Connected to ",WIFI_NETWORK)
ネットワーク名とパスワードを設定し、wlan
オブジェクトを作成し、active
とsっていし、Wi-Fi®ネットワークにconnect
(接続)します。
一度Wi-Fi®ネットワークに接続すると、インターネットにリクエストを送信します。
リクエストを送信する
Wi-Fi®ネットワークに接続できたということは、インターネットアクセスができるようになったことを意味します。接続をテストするために、サーバーにリクエストを送信します。
リクエストを送信するには、urequests
モジュールを使う必要があります。urequests
モジュールを使えば、URL(と追加の情報)を入力し、サーバーに送信するリクエストを作成します。今回は、google.comにテストリクエストを送信します。
このためには、前の例で使ったWi-Fi®接続コードに、リクエストを作成するための数行を追加します。
import urequests
import network
# Request a random cat fact from the Meowfacts API
url = "https://meowfacts.herokuapp.com/"
WIFI_NETWORK='YOUR_NETWORK_NAME'
WIFI_PASSWORD='YOUR_NETWORK_PASSWORD'
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_NETWORK, WIFI_PASSWORD)
print()
print("Connected to ",WIFI_NETWORK)
response = urequests.get(url)
print(response.text)
上記では、サーバーに接続し、何かを要求しています。これは、インターネット経由でデータを交換するための最も一般的な方法のひとつで、IoTデバイスを利用するための基本構造です。
演習1: Wi-Fi自動接続
多くのIoTプロジェクトを計画しているのであれば、ボードをWi-Fi®ネットワークに自動的に接続したくなるかもしれません。
このため、boot.py
ファイルを編集できます。このファイルのコードは、ボードの電源を入れたら最初に実行されるファイルだということを思い出してください。boot.py
を編集するには、エディタを起動し、左側のファイルリストから、該当のファイルを選択してください。
boot.py
ファイルに、先ほど示したWi-Fi接続用のコードをペーストします。
"""
This code goes into "boot.py".
It will automatically run when
you start your board, and connects
to the Wi-Fi network specified.
"""
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_NETWORK, WIFI_PASSWORD)
print()
print("Connected to ",WIFI_NETWORK)
エディタのSAVEボタンをクリックするのを忘れないでください。これで、既存のboot.py
ファイルを新しいものに置き換えます。
演習2: 気象データを取得する
この演習では、気象データを提供するAPIにリクエストを送信します。リクエストに、世界のどこの都市のデータを取得したいのかを指定する方法と、リクエスト結果から必要なデータだけを取得する方法を示します。
- OpenWeatherにアカウントを登録する
- API keysセクションに行き、新しいAPIキーを作成する
- コードエディタを起動し、以下のスクリプトを、
main.py
にコピーペーストする。コードの先頭に、API_KEY
変数があることに注意してください。ステップ2でしゅとくした、APIキーをペーストしてください。
"""
Simple GET request to OpenWeather.
This prints out the current temperature
of the city specified in the city_name
variable.
"""
import urequests
# URL, API key and name of city variables.
# Change the api_key and the city_name
url = "https://api.openweathermap.org/data/2.5/weather?q="
api_key = "YOUR_API_KEY"
city_name = "YOUR_CITY"
# Here we build a request URL
response = urequests.get(url + city_name + "&appid=" + api_key)
# Print out the complete response
print(response.text)
print()
# Convert to a JSON object
response_data = response.json()
# Access temperature object
temp_kelvin = response_data['main']['temp']
# Because it is in kelvin, convert to celsius
temp_celsius = int(temp_kelvin) - 273.15
print("Temp (K):", temp_kelvin)
print("Temp (C):", temp_celsius)
一度スクリプトを実行すると、少しして、レスポンスを受信します。このスクリプトは、以下のように設計されています。
- リクエストを送信し、レスポンスを受信する
- レスポンスは、人間には可読性が低い(多くのデータがある)ので、JSONオブジェクトに変換し、特定のデータにアクセス可能とする
- データにアクセスしたら、表示する
世界のどこからでも気象情報を取得できるデバイスになりました。
演習2: インターネット時計
この演習では、Network Time Protocol(NTP)サーバーにリクエストを送信します。
ボードは現在時刻を知らないので、時刻を保持しているサーバーにリクエストを送信する必要があります。
コードエディタを起動し、以下のスクリプトをmain.py
にコピー・ペーストします。
import network, usocket, ustruct, utime
TIMESTAMP = 2208988800
# Create new socket
client = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
client.bind(("", 8080))
#client.settimeout(3.0)
# Get addr info via DNS
addr = usocket.getaddrinfo("pool.ntp.org", 123)[0][4]
# Send query
client.sendto('\x1b' + 47 * '\0', addr)
data, address = client.recvfrom(1024)
# Print time
t = ustruct.unpack(">IIIIIIIIIIII", data)[10] - TIMESTAMP
print ("Year:%d Month:%d Day:%d Time: %d:%d:%d" % (utime.localtime(t)[0:6]))
# Close socket
client.close()
そして、“Run"ボタンをクリックし、実行します。
この例は、前の演習よりも高度なものです。簡潔に言えば、以下を行っています。
- 特定のサーバー(ntp.pool.org)にリクエストを送信する。このサーバーは現在時刻を保持しており、他のデバイスからのリクエストを受け付けている。
- レスポンスを、年/月/日/時間/分/秒の形式で、端末に表示する
おめでとうございます。細心の時刻を取得できました。つまり、ボードは世界と同期されました。
プロジェクトアイデア: アラームクロック
上記の演習で、気象情報と現在時刻を取得しました。これらを組み合わせ、時刻を保持し、アラームの設定ができ、気象情報の更新ができる、素晴らしいアラームクロックが作成可能です。
これを作りたければ、現在時刻と、どういう天気なのかを示す短い要約やアイコンを表示するディスプレイが必要です。
有用と思われるリンクを示します。
まとめ
この章では、モノのインターネット(internet of Things: IoT)が、インターネットに接続したデバイスの総称であるという簡単な説明をしました。
以下を学びました。
- Wi-Fi®ネットワークに正しく接続する
- インターネットでHTTPリクエストを送信する方法
- 有用なデータを取得する方法(気象情報と現在時刻)
IoTは非常に大きな分野で、ほんの少しだけ見たことになります。MicroPythonを使えば、世界と同期したプロジェクトを簡単に作成できます。
次の章: 部品の利用例
オリジナルのページ
https://docs.arduino.cc/micropython/micropython-course/course/internet-of-things/
最終更新日
April 14, 2024