質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Arduino

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

Q&A

2回答

2591閲覧

javascript内の文字列をクライアントからサーバー(arduino)へ送信する方法を知りたい

beansan

総合スコア13

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Arduino

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

0グッド

0クリップ

投稿2017/07/29 15:15

編集2017/08/05 15:58

javascriptを用いてクライアントからサーバー文字列を送りたいと考えております。
http://www.hiramine.com/physicalcomputing/arduino/httppostmethod.html
以上のサイトに大体の記載があるのですが、こちらはjavascriptではなくフォームです。
javascriptでのコードの記載方をご教授いただけると幸いです。(下のコードで試しましたが失敗しています。)

ちなみに。
このコードだとうまく動いてくれません。
javascriptのコードが対応していないとみていますが・・・。
解決策が分かりましたらご教授いただけると幸いです。

エラー内容(webブラウザ)

index.htm:28 XMLHttpRequest cannot load file:///E:/%E9%80%A3%E5%8B%95%E8%A3%85%E7%BD%AE%E5%88%B6%E4%BD%9C%EF%BC%81%…83%A0%E7%AB%AF%E6%9C%AB(%E7%B0%A1%E7%95%A5%EF%BC%89/Default.aspx?key=M10R*. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. sendmoji @ index.htm:28

↓javascript(抜粋)↓

function dosa_10M(pix){ if(pix.clientX>=400){ if(pix.clientX<=450){ if(pix.clientY>=400){ if(pix.clientY<=450){ if(sinro_setting[0]==1){ confirm( "進路鎖錠中"); return 0; } if(sinro_setting[1]==1){ confirm( "進路鎖錠中"); return 0; } if(M10=='N')var M_name='定位→反位'; if(M10=='R')var M_name='反位→定位'; var result = confirm( "10号を転換します。" + M_name); if(result){ confirm( "転換完了。" ); if(M10=='N'){ var M10flug='R'; sendmoji("M10R*");//この引数を送信 } if(M10=='R'){ var M10flug='N'; sendmoji("M10N*");//この引数を送信 } M10=M10flug; canvas_clear();//canvasを消去 rendo_gamen(sinro_setting);//再描画 }else{ confirm( "転換はキャンセルされました。" ); } } } } } } function sendmoji(pos){//pos内の文字列をサーバーへ送信 //javascriptオブジェクトを取得 try { var http = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { var http = new XMLHttpRequest(); } //受信時のコールバック関数を登録 // http.onreadystatechange = function() { // if (http.readyState == 4 && http.status == 200) { // var data = http.responseText; // document.getElementById("TextBox1").value=data; // } // } //文字コード変換 pos=encodeURIComponent(pos); //呼び出すアドレスにパラメータ key=値 を追加し送信 複数のパラメータは&でつなげる http.open("GET","Default.aspx?key="+pos); console.log(pos); http.send(null); }

↓html5↓

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta name="GENERATOR" content="HomuPage Writer Ver1.20"> <title>西城駅 連動画面</title> </head> <body> <h2></h2> <canvas id="terminal"width="1900" height="900"></canvas> <br/> <script> var M10='N'; var M11='N'; var sinro_setting=[0,0,0,0]; var TR=[0,0,0,0,0,0,0,0]; rendo_gamen(sinro_setting); document.addEventListener('click', dosa); function dosa(pix){ dosa_10M(pix); dosa_11M(pix); dosa_1RA(pix); } TR=[0,0,0,0,0,0,0,0]; rendo_gamen(sinro_setting); </script></body></html>

一応arduinoコードも載せておきます。

#include <SPI.h> #include <Ethernet2.h> #include <SD.h> char *FILENAME="index.htm"; byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0xBF, 0x98 }; IPAddress ip(192, 168, 100, 222); EthernetServer server(80); void setup() { Serial.begin(9600); while (!Serial) { ; } Ethernet.begin(mac, ip); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); if (!SD.begin(4)) { Serial.println("ErrorSD!!"); return; } if (!SD.exists(FILENAME)) { Serial.println("ErrorFILE!!"); return; } Serial.println("Ready"); pinMode(31,OUTPUT);//10Mの出力1 pinMode(33,OUTPUT);//10Mの出力2 pinMode(24,OUTPUT); pinMode(22,INPUT);//起動回路の入力 } void Mhani(int Mname){ if(Mname==10)Mname+=21; if(Mname==11)Mname+=24; digitalWrite(Mname,HIGH); digitalWrite(Mname+2,LOW); delay(100); digitalWrite(Mname,LOW); digitalWrite(Mname+2,LOW); } void Mteii(int Mname){ if(Mname==10)Mname+=21; if(Mname==11)Mname+=24; digitalWrite(Mname,LOW); digitalWrite(Mname+2,HIGH); delay(100); digitalWrite(Mname,LOW); digitalWrite(Mname+2,LOW); } int T10=0; int flug=0; int flugdelay=0; char buff[]="0000"; int counter=0; int Mnam=0; void loop() { // listen for incoming clients if(digitalRead(22)==HIGH){ digitalWrite(24,HIGH); flug=1; T10=1; }else{ digitalWrite(24,LOW); T10=0; flug=0; } EthernetClient client = server.available(); if (client) { Serial.println("new client"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n' && currentLineIsBlank) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); File file; file = SD.open(FILENAME,FILE_READ); if(file){ while(file.available()){ Serial.print(file.position()); char buff=file.read(); Serial.print(buff); client.write(buff); } if(T10==0)client.println("<script>TR=[0,0,0,0,0,0,0,0];"); if(T10==1)client.println("<script>TR=[0,0,1,0,0,0,0,0];"); client.println("rendo_gamen(sinro_setting);"); client.println("</script></body></html>"); flugdelay=1; }else{ Serial.println("ErrorFILEREAD!!"); } file.close(); } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } int chackflug=0; while(1){//クライアントへhtmデータ送信後、無限ループにて制御要求待ち。 chackflug++; if(chackflug<=10)Serial.println("delaynow..."); if(flugdelay==0)break; int flug1=flug; if(digitalRead(22)==HIGH){//列車検知したら処理 digitalWrite(24,HIGH); flug=1; T10=1; }else{//列車検知しなかったら処理 digitalWrite(24,LOW); flug=0; T10=0; } if(flug1!=flug){//軌道回路在線表示更新(列車検知をブラウザに反映) if(T10==0)client.println("<script>TR=[0,0,0,0,0,0,0,0];"); if(T10==1)client.println("<script>TR=[0,0,1,0,0,0,0,0];"); client.println("rendo_gamen(sinro_setting);"); client.println("</script></body></html>"); } Serial.println("4"); if(client.available()>=1){//クライアントから制御要求を確認 Serial.println("5"); char data=client.read();//1バイトずつ受信 buff[counter]=data; Serial.print(buff[counter]); if(data=='*'){//データ末尾「*」を受けたらリセットして受信状態から抜ける counter=0; Mnam=buff[0]-'0'; Mnam*=10; Mnam+=buff[1]-'0'; if(buff[2]=='R')Mhani(Mnam);//転てつ機反位転換 if(buff[2]=='N')Mteii(Mnam);//転てつ機定位転換 Serial.println(""); }else{ counter++; } } delay(1); } } } delay(1); client.stop(); Serial.println("client disconnected"); } }

arduino上のシリアルモニタでは、出力が4で無限ループするため、クライアントからデータが送信されていないものと思います。

以上よろしくお願いいたします。

〇原因追求
サーバーからデータを受け取った状態でクライアントからhtmファイルを起動しました。
結果下記エラーがクライアントに発生しました。

Failed to load resource: net::ERR_CONNECTION_REFUSED Default.aspx?key=M10N*

自分なりに改良してみましたがうまくいきません。
こちらに書き換えたプログラムの状況を記載しております。
https://teratail.com/questions/87158

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

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

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

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

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

guest

回答2

0

要件

要件が判然としませんが、実現したいのは下記ですか。

  • クライアントPCに存在するファイルをJavaScriptを使ってサーバに送信したい

要件が違うようでしたら、もう少し詳しく書いて下さい。

javascriptを用いてクライアントからサーバーへデータを送りたいと考えております。

「クライアント」が「クライアントサイドスクリプト(JavaScript)」を指しているのか、「ローカルファイル」を指しているのか。

JavaScriptを読み込んでいるHTML文書はローカルファイルですか、サーバ上のファイルですか。

File API

JavaScriptからローカルファイル(クライアントPC内のファイル)を扱うなら、File API を使う方法があります。
https://www.html5rocks.com/ja/tutorials/file/dndfiles/

なお、ローカルファイルはユーザの同意なしに送信する事は出来ませんので、指定したパスに存在するローカルファイルを自動的にアップロードする事は出来ません。

Re: beansan さん

投稿2017/07/30 03:34

think49

総合スコア18164

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

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

beansan

2017/07/30 05:07

ご回答ありがとうございます。 また、わかりにくく申し訳ありません。 実現したいのは、javascript内の文字列をサーバー側へ送信することです。 javascript内の sendmoji("M10R*");の引数「M10R*」をarduino(webサーバー)側へ送信したいと考えております。 そのため、sendmoji()関数を書いてみましたが、うまく動かなく、どのように修正すればよいのか・また他によい書き方がないのかを確認したい次第です。
beansan

2017/07/30 05:22

追記します。 JavaScriptを読み込んでいるHTML文書はローカルファイルですか、サーバ上のファイルですか。 →サーバー上のファイルです。 「クライアント」が「クライアントサイドスクリプト(JavaScript)」を指しているのか、「ローカルファイル」を指しているのか。 →クライアントサイドスクリプト(JavaScript)です。
think49

2017/08/01 08:14

その要件でしたら、kei344 さんのアドバイス「無かったら動かない」が適切だと思います。
guest

0

Default.aspxはサーバとして動いていますか?
そしてそのHTMLはサーバ上で動いていますか?
URLがfile:///E:/からはじまっていませんか?

投稿2017/07/29 15:29

kei344

総合スコア69407

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

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

beansan

2017/07/30 02:40

回答ありがとうございます。 Default.aspxはつくっておらず、サーバー上にはindex.htmがあるのみとなっております。 index.htmは動いています。 URLがfile:///E:/からはじまっていませんか? →ローカルでうごかしていたものを張り付けていました。 サーバーにて動かしましたが、クライアント側(webブラウザ側)では下記エラーが発生しております。 Failed to load resource: net::ERR_CONNECTION_REFUSED Default.aspx?key=M10N* 以上よろしくお願いいたします。
kei344

2017/07/30 02:45

> Default.aspxはつくっておらず 無かったら動かないのは当然では?「Failed to load resource」は「このリソースをロードせよって言われたけど読み込めない」というエラーです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問