GR-CITRUS+WA-MIKANでHTTP GET通信のレスポンスを受信する


GR-CITRUS標準のGET通信ではレスポンスの受信ができないと分かり、
ESPのATコマンドを叩いてどうにかレスポンスを見れないか試行錯誤しました。

環境

  • GR-CITRUS
  • WA-MIKAN-FULL
  • microUSBケーブル
  • Visual Studio Code 1.30.2

導入の手順は以前記事を書いたので、そちらを参考にしてください。

Wi-Fiの疎通確認

WA-MIKANにGR-CITRUSを差し込んで、まずWi-Fiの疎通確認をします。

main.rb
Usb = Serial.new(0,115200)

def log obj
    Usb.println obj.to_s
end  

SSID = "Wi-FiのSSID"
PASS = "Wi-Fiのパスワード"

System.useWiFi()
log "Wi-Fi Station Mode Setting"
log WiFi.setMode(1)

log "Wi-Fi connecting..."
log WiFi.connect(SSID, PASS)

log "Wi-Fi IP Address"
log WiFi.ipconfig

log "Wi-Fi Connection Closed"
log WiFi.disconnect()

Wi-Fi Station Mode Setting

OK

Wi-Fi connecting...
WIFI CONNECTED
WIFI GOT IP

OK

Wi-Fi IP Address
+CIFSR:STAIP,"IPアドレス"
+CIFSR:STAMAC,"MACアドレス"
(念のため隠してます)

OK

Wi-Fi Connection Closed

OK

繋がることが確認できました!

GET通信の概要を見てみる

GR-CITRUSのメソッド早見表を見てみます。

HTTPのGET通信は、SDカードを使用する場合のみしか結果が見れないようです。
しかし、どうせならSDカード無しでも結果が見れたらいいなと思い、
実装してみることにしました。

実装

WA-MIKANに搭載されているESP8266のATコマンドをWiFi.atで直接叩いてみました。
工夫することで多様なリクエストを送れたりすると思います。

main.rb
Usb = Serial.new(0,115200)

def log obj
    Usb.print obj.to_s
end

SSID = "Wi-FiのSSID"
PASS = "Wi-Fiのパスワード"

log "Wi-Fi Station Mode Setting"
log WiFi.setMode(1)

log "WiFi connecting..."
log WiFi.connect(SSID,PASS)

log "Wi-Fi IP Address"
log WiFi.ipconfig

log "Wi-Fi multiConnect"
log WiFi.multiConnect(1)

log  WiFi.at('AT+CIFSR',1).to_s

host = "34.195.201.244"   # httpbin.org/getでレスポンスを確かめる
                          # ドメイン名だとDNSエラーで弾かれることが多いので、nslookupでIPアドレスを調べるのがおすすめ
url = "/get"

log WiFi.at('AT+CIPMUX=0',1).to_s
log WiFi.at('AT+CIPSTART="TCP","' + host + '",80',1).to_s

#ヘッダー部分作成
s  = "GET #{url} HTTP/1.1"
s += "\r\n"
s += "User-Agent: GR-CITRUS"
s += "\r\n"
s += "Host: #{host}"
s += "\r\n"
s += "Content-Type: application/json"
s += "\r\n"
s += "\r\n"

log s

log WiFi.at('AT+CIPSEND='+s.bytesize.to_s,1).to_s
delay(100)
log WiFi.at(s,1).to_s

delay(500)

log "Wi-Fi Connection Closed"
log WiFi.at('AT+CIPCLOSE',1).to_s

Wi-Fi Station Mode Setting

OK

(省略)

Recv 102 bytes

SEND OK

+IPD,354:HTTP/1.1 200 OK
access-control-allow-credentials: true
access-control-allow-origin: *
connection: keep-alive
content-type: application/json
date: Fri, 29 Nov 2019 08:39:53 GMT
referrer-policy: no-referrer-when-downgrade
server: nginx
transfer-encoding: chunked
x-content-encoding-over-network: gzip
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block

{
"args": {},
"headers": {
"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "ja,en-US;q=0.9,en;q=0.8",
"Host": "httpbin.org",
"Referer": "http://httpbin.org/",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
},
"origin": "159.28.168.41, 159.28.168.41",
"url": "https://httpbin.org/get"
}

JSON形式のレスポンスがVSCodeのコンソールに返ってきます。

まとめ

Rubyの扱いにまだ慣れていないので、今はコンソールに結果を出すだけですが、
いずれはレスポンスの結果を見てLEDを点灯させる……といったことをできるようにしたいと思いました。