前提・実現したいこと
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が押されるまで,ずっと値を取得し続けるという条件を満たせるプログラムの書き方がわかりません.. どなたか詳しい方アドバイスいただけたら嬉しいです.よろしくお願いいたします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/25 05:36
2018/06/25 13:53
2018/06/26 01:18
2018/06/26 01:27