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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Q&A

解決済

1回答

516閲覧

VSでボタン2つを使ってssh接続の開始,終了を指示したいです.

inupisu

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

0グッド

0クリップ

投稿2018/06/25 02:02

前提・実現したいこと

VS2017(C#)のフォームアプリの中でボタンを2つ配置し,1つ目でssh接続の開始,値の取得を行い,2爪のボタンで取得の終了,ssh接続の終了を行えるプログラムをかきたいです.

ここに質問の内容を詳しく書いてください
VS(C#)でフォームアプリを作成しました.内容としては,ボタンを押すとraspberry piにssh接続をし,GPIOの値を取,labelに表示するというものです.その中で,もう1つボタンを配置し,ssh接続終了の処理を加えたいです.今は,ボタン1で接続の開始,値の取得,接続の終了を行っています.2つめのボタンの中に接続を終了させる処理を書き込んだのですが,エラーが発生してしまい,できません..そこで詳しい方にアドバイスをいただきたく質問させていただきました.

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

構文的なエラーはないのですが,ボタン1を押すと,ssh接続が開始され値を取得します.しかし,ボタン1を終了させていないためか,ボタン2を押しても反応しません. ボタン2の中で,ssh.Disconnectを行うと,現在のコンテキストに"ssh"という名前は存在しませんというエラーメッセージが表示されてしまいます.

該当のソースコード

C#

1sing System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using Renci.SshNet; 11using System.Diagnostics; 12 13 14namespace sw20180626App 15{ 16 public partial class Form1 : Form 17 { 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 23 // コネクション情報 24 int i = 0; 25 26 private void button1_Click(object sender, EventArgs e) 27 { 28 try 29 { 30 31 while (i == 0) 32 { 33 // 接続先のホスト名またはIPアドレス 34 var hostNameOrIpAddr = "raspberrypi.local"; 35 36 // 接続先のポート番号 37 var portNo = 22; 38 39 // ログインユーザー名 40 var userName = "pi"; 41 42 // ログインパスワード 43 var passWord = "raspberry"; 44 45 // コネクション情報 46 ConnectionInfo info = new ConnectionInfo(hostNameOrIpAddr, portNo, userName, 47 new AuthenticationMethod[] { 48 new PasswordAuthenticationMethod(userName, passWord) 49 /* PrivateKeyAuthenticationMethod("キーの場所")を指定することでssh-key認証にも対応 */ 50 } 51 ); 52 53 // クライアント作成 54 SshClient ssh = new SshClient(info); 55 56 // 接続開始 57 ssh.Connect(); 58 59 if (ssh.IsConnected) 60 { 61 // 接続に成功した(接続状態である) 62 Debug.WriteLine("[OK] SSH Connection succeeded!!"); 63 } 64 else 65 { 66 // 接続に失敗した(未接続状態である) 67 Debug.WriteLine("[NG] SSH Connection failed!!"); 68 return; 69 } 70 // 送信したいコマンドを変数に入れる 71 var commandString = "gpio -g read 4 "; 72 var commandString2 = "gpio -g read 9"; 73 var commandString3 = "gpio -g read 27"; 74 75 76 // コマンドを作成する 77 SshCommand cmd = ssh.CreateCommand(commandString); 78 SshCommand cmd2 = ssh.CreateCommand(commandString2); 79 SshCommand cmd3 = ssh.CreateCommand(commandString3); 80 81 // コマンドを実行する 82 83 Console.WriteLine("[CMD] {0}", commandString); 84 Console.WriteLine("[CMD] {0}", commandString2); 85 Console.WriteLine("[CMD] {0}", commandString3); 86 cmd.Execute(); 87 cmd2.Execute(); 88 cmd3.Execute(); 89 // 結果を変数に入れる 90 var stdOut = cmd.Result; 91 var stdErr = cmd.Error; 92 var stdOut2 = cmd2.Result; 93 var stdErr2 = cmd2.Error; 94 var stdOut3 = cmd3.Result; 95 var stdErr3 = cmd3.Error; 96 97 // 終了コードを表示する 98 Console.WriteLine("終了コード:{0}", cmd.ExitStatus); 99 Console.WriteLine("終了コード:{0}", cmd2.ExitStatus); 100 Console.WriteLine("終了コード:{0}", cmd3.ExitStatus); 101 102 103 // 標準出力を表示する 104 if (stdOut != string.Empty) 105 { 106 Console.WriteLine("標準出力:"); 107 Debug.WriteLine(stdOut); 108 label3.Text = "OK"; 109 Console.WriteLine("---------"); 110 } 111 if (stdOut2 != string.Empty) 112 { 113 Console.WriteLine("標準出力:"); 114 Debug.WriteLine(stdOut2); 115 label4.Text = "OK"; 116 Console.WriteLine("---------"); 117 } 118 if (stdOut3 != string.Empty) 119 { 120 Console.WriteLine("標準出力:"); 121 Debug.WriteLine(stdOut3); 122 label5.Text = "OK"; 123 Console.WriteLine("---------"); 124 } 125 126 127 // エラー出力を表示する 128 if (cmd.ExitStatus != 0 && stdErr != string.Empty) 129 { 130 Console.WriteLine("標準エラー出力:"); 131 Debug.WriteLine(stdErr); 132 Console.WriteLine("----------------"); 133 } 134 if (cmd2.ExitStatus != 0 && stdErr != string.Empty) 135 { 136 Console.WriteLine("標準エラー出力:"); 137 Debug.WriteLine(stdErr2); 138 Console.WriteLine("----------------"); 139 } 140 if (cmd3.ExitStatus != 0 && stdErr != string.Empty) 141 { 142 Console.WriteLine("標準エラー出力:"); 143 Debug.WriteLine(stdErr3); 144 Console.WriteLine("----------------"); 145 } 146 ssh.Disconnect(); 147 } 148 149 catch (Exception ex) 150 { 151 // エラー発生時 152 Console.WriteLine(ex); 153 throw ex; 154 } 155 } 156 157 private void button2_Click(object sender, EventArgs e) 158 { 159 i = 1; 160 label3.Text = "------"; 161 label4.Text = "------"; 162 label5.Text = "------"; 163 164 } 165 } 166 167} 168

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

VSは2017,言語はC#,raspberry piは3のModel Bを使用しております.初心者でプログラム自体がすごく汚いと思います.3つの値を取得することと,ボタン1でssh接続を開始したらボタン2が押されるまで,ずっと値を取得し続けるという条件を満たせるプログラムの書き方がわかりません.. どなたか詳しい方アドバイスいただけたら嬉しいです.よろしくお願いいたします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. まず、タイマコンポーネントを追加し、インターバルをデータ取得間隔、例えば500(ms)とかに設定
  2. 開始ボタンを押したら、SSH接続を開始し、タイマを起動させます

このとき、繰り返し開始ボタンを押されるとワケワカメになるので、ボタンをディセーブルにするなどします
0. タイマイベントではデータ取得、表示処理を行います
0. で、もう一つのボタンで、そのタイマを止め、SSH接続を切る処理を行います
当然ながら、このボタンを繰り返し押されるとワケワカメになるのでそれなりの処理を。

投稿2018/06/25 02:17

y_waiwai

総合スコア87749

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

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

inupisu

2018/06/25 05:36

回答ありがとうございます! タイマを使うという考えは浮かびませんでした... ありがとうございます!! このボタンを2つ使って,開始と終了を分ける処理を行いたいと思い,プログラムを作成しているときからわからなかったことが1つあります. button1でtry~catchの部分のssh接続部分 + this.timer1.Start();でタイマーイベントの発生を書きました. そしてタイマイベントの中では,先ほどのプログラムのコマンド作成や実行,値の取得,表示を書きました.最後にbutton2にthis.timer1.Stop(); + ssh.Disconnect();と書き込みました. コマンド作成や,接続終了の部分で,SshCommand cmd = ssh.CreateCommand(commandString);やssh.Disconnect();の行のsshと部分にエラーが表示されてしまいます. エラー内容は,現在のコンテキストにsshという名前は存在しませんです. この部分以外はエラーが出ていないのですが,この部分の改善ができません. もしよろしければアドバイスいただきたいです. よろしくお願いいたします.
y_waiwai

2018/06/25 13:53

> SshClient ssh = new SshClient(info); これは、そのブロックの中だけしか有効ではありません。 > public partial class Form1 : Form > { の直下に書いてください
inupisu

2018/06/26 01:18

回答ありがとうございます! public partial class Form1 : Form { SshClient ssh = new SshClient(info); と記述したのですが,infoの部分がエラーになってしまいます. ConnectionInfo info のコネクション情報も直下においてみたのですが,今度はコネクション情報の中の(userName,password)などがエラーになってしまうという状態です... 置く場所が間違っていますでしょうか?
y_waiwai

2018/06/26 01:27

SshClient ssh; だけを関数の外に出して、インスタンスの生成を関数の中ですればいいですが、 その他のところもいろいろ問題がありそうなソースとなってます C#の基本的な知識がおぼつかないようなんで、入門サイトなどで学び直されてはどうでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問