🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

3759閲覧

Arduinoに設定した固定IPでブラウザからアクセスできません。

Kumampet

総合スコア5

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/01/09 03:32

編集2021/01/09 06:52

前提・実現したいこと

Arduinoのピン情報をNode.jsで取得したいです
具体的にはA0ピンの値をNode.jsで取得し、ブラウザにただ表示させるだけです。

発生している問題・エラーメッセージ

まったく同じことをしている方のサイトを参考に実装しましたが、IPAddressに設定したアドレスに接続しても、応答せずERR_CONNECTION_TIMED_OUTになってしまいます。

URL

1192.168.1.28:3000

BrowserErr

1ERR_CONNECTION_TIMED_OUT

また、Arduinoのログのほうでも、接続したり切断したりを繰り返しているように見えました。
イメージ説明

構成

イメージ説明

https://kimizuka.hatenablog.com/entry/2016/07/12/235535

該当のソースコード

Arduinoに書き込んだプログラム

sample.c

1#include <Ethernet.h> 2#include <SPI.h> 3 4byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0xF2, 0xD6}; 5IPAddress ip(192, 168, 1, 28); // ArduinoのIP 6byte server[] = {192, 168, 1, 27}; //localhost 7 8// CdSの値 9int val = 0; 10 11// 使用するピン 12int iPin = A0; 13 14// POSTする間隔 15int INTERVAL = 500; 16 17// Port番号 18int port = 3000; 19 20// クライアント 21EthernetClient client; 22 23void setup() 24{ 25 Ethernet.begin(mac, ip); 26 Serial.begin(9600); 27 28 if (Ethernet.begin(mac) == 0) 29 { 30 Serial.println("Failed to configure Ethernet using DHCP"); 31 Ethernet.begin(mac, ip); 32 } 33 34 delay(1000); 35} 36 37void loop() 38{ 39 Serial.println("connecting..."); 40 val = analogRead(iPin); 41 if (client.connect(server, port)) 42 { //デフォルトのポート番号は3000 43 Serial.println("connected"); 44 client.println("POST /api/?val=" + String(val) + " HTTP/1.1"); 45 client.println("Host 192.168.1.28:" + port); 46 client.println("Content-Type: application/x-www-form-urlencoded"); 47 client.println("User-Agent: Arduino Post Client"); 48 client.println("Connection: close"); 49 client.print("Content-Length: "); 50 client.println(String(val).length()); 51 client.println(); 52 client.println(String(val)); 53 client.stop(); 54 Serial.println("disconnecting."); 55 Serial.println("POST /api/?val=" + String(val) + " HTTP/1.1"); 56 } 57 else 58 { 59 Serial.println("connection failed"); 60 } 61 62 delay(INTERVAL); 63}

get.js

1"use strict"; 2 3var http = require("http"), 4 url = require("url"), 5 server; 6 7server = http.createServer(function (request, response) { 8 request.on("end", function() { 9 var urlObj; 10 11 switch (request.method) { 12 case "POST": 13 urlObj = url.parse(request.url, true); 14 15 switch (urlObj.pathname) { 16 case "/api/": 17 console.log(urlObj.query.val); 18 response.end(); 19 break; 20 } 21 break; 22 } 23 }).resume(); 24}).listen(3000);

試したこと

再起動や、ArduinoのUSB、LANの繋ぎ変えなどをしましたが効果なしでした。

補足情報(FW/ツールのバージョンなど)

PC, Arduinoともにルーターに有線でつながれています。

追記情報

Arduinoの構成についてご指摘をいただきましたので追記させていただきます。

本体:Arduino UNO R3 + Ethernetシールド
となってます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/01/09 05:12 編集

client.println("Host 163.143.134.94:" + port); って、合ってますか? コードの最初の方に書いてある2つのIPアドレス IPAddress ip(192, 168, 1, 28); // ArduinoのIP byte server[] = {192, 168, 1, 27}; //localhost と全然違いますけど
y_waiwai

2021/01/09 05:06

ルータの設定で、DHCPのIP配布範囲はどうなってるでしょうか。 また、Arduinoのなにを使ってるんでしょうか。 標準のArduinoではLANに接続できません
Kumampet

2021/01/09 06:50

> client.println("Host 163.143.134.94:" + port); って、合ってますか? コードの最初の方に書いてある2つのIPアドレス IPAddress ip(192, 168, 1, 28); // ArduinoのIP byte server[] = {192, 168, 1, 27}; //localhost と全然違いますけど これは出力についてでしたので、変更し忘れてました。 正しくはIPAddress ip(192, 168, 1, 28)の値です。 > ルータの設定で、DHCPのIP配布範囲はどうなってるでしょうか。 また、Arduinoのなにを使ってるんでしょうか。 標準のArduinoではLANに接続できません ルーターの設定には入れていないのでこれは現在検証中です Arduinoにはイーサネットシールドを接続してあります。 > こういうの使ってるのですかね https://www.switch-science.com/catalog/2270/ 質問文に追記した方がいいですよ はい、使用しております。 見た目は若干違いますが、有線接続できるようにはなっております。
jbpb0

2021/01/09 07:55

パソコンのOSは何ですか?
Kumampet

2021/01/09 07:59

OSはWindows 10 home 64bitです。
jbpb0

2021/01/09 09:47 編集

> ルーターの設定には入れていない WindowsのIPアドレスを固定じゃなくて自動取得できる設定に変えて、有線接続でちゃんとネットワークにつながってる状態になったら、コマンドプロンプトで ipconfig/all を実行してみてください いろいろ表示される中で、たぶん「イーサネット アダプター...」的なことが書いてあるあたりで、 IPv4 アドレス . . . . . . . . . . . .: と サブネット マスク . . . . . . . . . .: の右に数字が書いてあるところがあるはずです その数字の組み合わせから、ルーターが管理しているそのネットワークの情報が分かります WindowsとArduinoのそれぞれに設定する固定IPアドレスが、それと矛盾しないようにしないといけません あと、現状の設定でIPアドレスの一番下に27とか28とか使ってますが、そういう小さい数字のアドレスは、ルーターが(自動取得用に)DHCPで配布する範囲に入ってるかもしれないので、他の機器と被るかもしれません 固定IPアドレスには(ネットワークの設定と矛盾しない範囲で)大きめの数字のアドレスを使う方が無難ですよ
Kumampet

2021/01/10 09:44

WindosのIP取得方法はもともと自動でした。 windows側が192, 168, 1, 27となりました。 また、空いているポートを調べてみた結果.26も空いていましたので、今回使った次第です。
jbpb0

2021/01/10 10:22

参考にされてるWebページでは、「server[] =...」のIPアドレスはカンマじゃなくてピリオド区切りです また、参考ページでは「client.println("Host:...」はPCのIPアドレスです
Kumampet

2021/01/10 10:34

それは理解しております。 プログラムではカンマ区切りで入力するようになってましたので、プログラム内ではカンマ区切りにしております。
thkana

2021/01/10 14:02

Javascriptはほとんど知りませんが、 > ブラウザにただ表示させるだけです。 ブラウザ関係あります? プログラム中に console.log(urlObj.query.val); とあるので、node.jsのコンソール画面に表示が出るのではないですか? あなたと全く同じ手順を回答者が試せるように、あなたの行ったことを一通り書いてみていただけますか?
dodox86

2021/01/11 00:26

Node.jsのHTTPサーバーにはリモートから接続できているのでしょうか。 arduinoでの接続の前に確認するべきだと思います。 また、コメントが右往左往しているので良く分かりませんが、arduino側からのHTTPリクエストのヘッダーフィールド "Host:"は、リモートサーバーのものをセットします。サーバーのIPアドレスが192.168.1.27なら client.println("Host 192.168.1.28:" + port); ではなく、client.println("Host: 192.168.1.27:3000"); のようになるはずです。まぁ、ヘッダーフィールドが間違っていても接続自体はできますが。
guest

回答2

0

ベストアンサー

Arduinoの有線Ethernetを持っていないので、ESP32 DevkitCのWiFiで同様のことを試してみました。

node.jsのREPLを立ち上げて質問のスクリプトを流し込み

JavaScript

1Welcome to Node.js v14.15.4. 2Type ".help" for more information. 3> "use strict"; 4'use strict' 5> 6> var http = require("http"), 7... url = require("url"), 8... server; 9undefined 10> 11> server = http.createServer(function (request, response) { 12... request.on("end", function() { 13..... var urlObj; 14..... 15... switch (request.method) { 16... case "POST": 17... urlObj = url.parse(request.url, true); 18... 19... switch (urlObj.pathname) { 20... case "/api/": 21... console.log(urlObj.query.val); 22... response.end(); 23... break; 24... } 25... break; 26... } 27... }).resume(); 28... }).listen(3000); 29<ref *1> Server { 30 maxHeaderSize: undefined, 31 insecureHTTPParser: undefined, 32 _events: [Object: null prototype] { 33 request: [Function (anonymous)], 34 connection: [Function: connectionListener] 35 }, 36 _eventsCount: 2, 37 _maxListeners: undefined, 38 _connections: 0, 39 _handle: TCP { 40 reading: false, 41 onconnection: [Function: onconnection], 42 [Symbol(owner_symbol)]: [Circular *1] 43 }, 44 _usingWorkers: false, 45 _workers: [], 46 _unref: false, 47 allowHalfOpen: true, 48 pauseOnConnect: false, 49 httpAllowHalfOpen: false, 50 timeout: 0, 51 keepAliveTimeout: 5000, 52>

Arduino(ESP32)は以下を書き込みました。WiFi接続にしたことと、データとしてmillis()の値を使った以外はほぼそのままです。

Arduino

1#include <WiFi.h> 2 3// POSTする間隔 4int INTERVAL = 500; 5 6byte server[] = {192, 168, 10, 3};//node.jsを走らせているPCのIP 7 8// Port番号 9int port = 3000; 10 11// クライアント 12WiFiClient client; 13 14char SSID[] = "aaaaaaaa"; 15char PASSWORD[] = "bbbbbbbb"; 16void setup(){ 17 WiFi.begin(SSID, PASSWORD); 18 Serial.begin(115200); 19 Serial.print("WiFi Connecting:"); 20 while (WiFi.status() != WL_CONNECTED) { 21 Serial.print('.'); 22 delay(500); 23 } 24 Serial.println(); 25 Serial.println("WiFi connected."); 26 Serial.println("IP address: "); 27 Serial.println(WiFi.localIP()); 28} 29 30void loop(){ 31 unsigned long val = millis();//データとしてはmillis()にした 32 Serial.println("connecting..."); 33 if (client.connect(server, port)) 34 { //デフォルトのポート番号は3000 35 Serial.println("connected"); 36 client.println("POST /api/?val=" + String(val) + " HTTP/1.1"); 37 client.print("Host "+WiFi.localIP()+':'+port); 38 client.println("Content-Type: application/x-www-form-urlencoded"); 39 client.println("User-Agent: Arduino Post Client"); 40 client.println("Connection: close"); 41 client.print("Content-Length: "); 42 client.println(String(val).length()); 43 client.println(); 44 client.println(String(val)); 45 client.stop(); 46 Serial.println("disconnecting."); 47 Serial.println("POST /api/?val=" + String(val) + " HTTP/1.1"); 48 } 49 else 50 { 51 Serial.println("connection failed"); 52 } 53 54 delay(INTERVAL); 55}

すると、Arduinoのシリアル出力は

Text

1WiFi Connecting:.............. 2WiFi connected. 3IP address: 4192.168.10.33 5connecting... 6connected 7disconnecting. 8POST /api/?val=7120 HTTP/1.1 9connecting... 10connected 11disconnecting. 12POST /api/?val=7644 HTTP/1.1 13connecting... 14connected 15disconnecting. 16<以下延々と>

node.js側は、REPL上先程のプロンプト'>'の後に

Text

1>7120 27644 38169 48686 59207 6<以下延々と>

が表示されました。

つまり、「プログラム自体はArduino側もnode.js側も多分問題ない」と言えそうです。

Arduinoのログのほうでも、接続したり切断したりを繰り返しているように見えました。

その解釈は間違っています。「接続を試行したが、接続できなかった」です。
接続先IPアドレスの間違いとか、ファイヤウォールの設定、Ethernet接続が出来ていないことが想像されます。

また、追記依頼にも書いたように、上記作業において「ブラウザ」の出番はありませんでした。どういう結果が得られるか、という点についてもなにか間違いがあるのではないかという気がします。(node.jsはよく知らないのですが、質問のスクリプトをブラウザ上で実行してlog出力をブラウザ上で表示することができるのでしょうか?)

投稿2021/01/11 00:02

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DHCP環境下で空いてるからと言って適当なアドレスに割り当てるべきではありません
やるなら、同じサブネット内で、DHCPの提供範囲外のIPを割り当てましょう
このとき、サブネットはルータのそれと合わせておきましょう

投稿2021/01/10 09:57

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問