CircuitPython 10行プログラミング Step3 (5) Wi-Fi その2 ソケット

 前回、Wi-Fiでルータへ接続し、DHCPサーバからIPアドレスを振られたところまでを確認しました。ここでは、LAN接続してあるKeysightの測定器34461Aにsocketで接続します。

 python2を使った接続例を参考にプログラムを作ります。

  IoTで使うPython入門Step3-計測 (1) DMM 34461A-①

 Windows10にPython3.8.0をインストールしたときに修正したプログラムです。

import socket

ipAddr = "K-34461A-16054.local"
ports = 5025

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ipAddr, ports))

#s.send('*RST\n'.encode('ascii'))
s.send('*IDN?\n'.encode('ascii'))
print('ID: ' + str(s.recv(256).decode('ascii')).strip() )
s.send('CONF:VOLT:AC 100,0.001\n'.encode())
s.send('VOLT:AC:BAND 20\n'.encode())
s.send('READ?\n'.encode())
print('AC: ' + s.recv(64).decode())
s.close()

 実行結果です。

 最近、Keysightの資料でも、pythonの記述事例が出てきました。

  Using Python and Sockets

CircuitPython はMicroPythonベース

 Docs » ESP8266 用クイックリファレンス » ESP8266用 MicroPythonチュートリアル » 5. ネットワーク - TCPソケットの解説記事を見ると、通常のPythonのsokectプログラムとは異なります。

 import socket

は、同じですが、

 addr_info = socket.getaddrinfo("towel.blinkenlights.nl", 23)

getaddrinfo()関数で接続をします。そして、不要な部分を破棄し、

 addr = addr_info[0][-1]

そのaddrでconnectします。

s = socket.socket()
s.connect(addr)

プログラム

 前回のサンプルから、Wi-Fiの接続までをコピペします。

import board
import busio
from digitalio import DigitalInOut
import adafruit_esp32spi.adafruit_esp32spi_socket as sockets
from adafruit_esp32spi import adafruit_esp32spi
import adafruit_requests as requests
import time

esp32_cs = DigitalInOut(board.ESP_CS)
esp32_ready = DigitalInOut(board.ESP_BUSY)
esp32_reset = DigitalInOut(board.ESP_RESET)

spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)

requests.set_socket(sockets, esp)
if esp.status == adafruit_esp32spi.WL_IDLE_STATUS:
print("ESP32 found and in idle mode")
print("Connecting to AP...")

while not esp.is_connected:
try:
esp.connect_AP(b'Buffalo-G-20EA', b'xxxxxx')
except RuntimeError as e:
print("could not connect to AP, retrying: ",e)
continue
print("Connected to", str(esp.ssid, 'utf-8'), "\tRSSI:", esp.rssi)
print("My IP address is", esp.pretty_ip(esp.ip_address))

 つづいて、前項のソケットの接続方法を記述します。Windowsやラズパイでは、.localが使えます(mDNSやavahiの名前解決)が、CircuitPythonではサポートされていないので、IPアドレスを直接記述します。

#host = "K-34461A-16054.local"
ipAddr = "192.168.111.111"
ports = 5025

addr_info = sockets.getaddrinfo(ipAddr, ports)
print(addr_info)
addr = addr_info[0][-1]
print(addr)
skt = sockets.socket()
print("connect to")
skt.connect(addr)
print("connect'd")
print("send to")
skt.send("*IDN?\n") 
print("received")
data = skt.recv(64).decode()
print(data)
skt.close()
print("Done")

 受信するrecv()関数は、処理系によっては、送られてくる文字数がバッファより少ないと終了しません。CircuitPythonでもそういう仕様のようです。機器名の問い合わせの*IDN?に対して、このDMMは約70文字を返してきます。recv(256)では、受け取りが終了しませんでした。

 実行結果です。