[ラズパイ] Pico W でネットワークリクエストを繰り返すとECONNABORTEDエラーが発生する場合

投稿者: | 2024-03-17

Pico W で5秒おきにリクエストを送信するプログラムを実行してみます。

import utime
import network
import urequests

#Wi-FiのSSIDとパスワードを設定
ssid = ''
password = ''

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# 接続が確認できない場合は1秒おきに再確認する(最大10回)
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    utime.sleep(1)

# 接続できない場合はエラーを返す
if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('Connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])
    
    # ここで通信処理
    for i in range(1, 10):
        url = 'https://www.yahoo.co.jp/'
        print('i = %d' % i)
        r = urequests.get(url)
        utime.sleep(5)
    
    # 切断
    wlan.disconnect()
    print('Disconnect')

すると以下のようなエラーが発生しました。

waiting for connection...
waiting for connection...
waiting for connection...
waiting for connection...
Connected
ip = 192.168.11.10
i = 1
i = 2
i = 3
Traceback (most recent call last):
  File "<stdin>", line 35, in <module>
  File "requests/__init__.py", line 180, in get
  File "requests/__init__.py", line 91, in request
OSError: [Errno 103] ECONNABORTED

何回か実行しても3回目の送信時にエラーが発生していました。

調べてみた結果、どうやら接続が相手側から強制的にクローズされたみたいです。

リクエストした後の待機時間を60秒に増やしてみました。

    # ここで通信処理
    for i in range(1, 10):
        url = 'https://www.yahoo.co.jp/'
        print('i = %d' % i)
        r = urequests.get(url)
        utime.sleep(60)

実行結果です。

waiting for connection...
waiting for connection...
waiting for connection...
waiting for connection...
Connected
ip = 192.168.11.10
i = 1
i = 2
i = 3
Traceback (most recent call last):
  File "<stdin>", line 36, in <module>
  File "requests/__init__.py", line 180, in get
  File "requests/__init__.py", line 76, in request
OSError: -2

何かエラー内容は変わりましたが、多分原因は同じと思われます。

さらに待機時間を120秒に増やしてみましたが結果は同じでした。

URLを変更して他のサイトへリクエストを繰り返し送信した時はエラーが発生しないで正常に動作していたので、接続する相手によって条件があり、発生してしまうエラーのようです。