2013-06-04 219 views
0

我有一个通过静态IP上的以太网连接的设备。有一个html接口与设备进行通信。该接口监视设备的io。它具有配置设置来更改诸如IP地址,子网掩码,MAC地址和默认网关等内容。这也是你如何发送命令到设备。通过winform发送数据

我想使C#Windows窗体仅代表我需要的功能。我陷入困境的地方是从表单发送命令。

html界面正在使用jQuery将命令发送回设备。

function sendCMD(indata) {$.post("setcmd.cgx", indata, function (data) {});

sendCMD({ver : "1",cmd : "abf"});

目前我正在试图通过一个WebRequest的,这是刚刚返回URI的HTML到后发回。我得出的结论是,我不应该为此使用WebRequest和/或我发送的数据不正确。

我目前有:

private void btnAimingBeamOn_Click(object sender, EventArgs e) 
    { 
     string postData = "\"setcmd.cgx\", {\n\rver : \"1\", \n\rcmd : \"abn\"\n\r}, function (data) {}"; 
     byte[] byteArray = Encoding.UTF8.GetBytes(

     Uri target = new Uri("http://192.168.3.230/index.htm"); 
     WebRequest request = WebRequest.Create(target); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = byteArray.Length; 

     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 

     WebResponse response = request.GetResponse(); 
     txtABNStatus.Text = (((HttpWebResponse)response).StatusDescription); 

     dataStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(dataStream); 
     string responseFromServer = reader.ReadToEnd(); 
     txtABNResponse.Text = (responseFromServer); 

     reader.Close(); 
     response.Close(); 
     dataStream.Close(); 
    } 

与发帖子以及如何发布数据格式将最欣赏的适当方法任何帮助。

+0

查找到['WebClient'](http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx)类,这简化/去掉了很多此样板的HTTP代码。它将能够为您发布数据。 – qJake

回答

4

你需要发布的数据'setcmd.cgx'不会将其添加到您发布的数据。

// You need to post the data as key value pairs: 
string postData = "ver=1&cmd=abf"; 
byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

// Post the data to the right place. 
Uri target = new Uri("http://192.168.3.230/setcmd.cgx"); 
WebRequest request = WebRequest.Create(target); 

request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = byteArray.Length; 

using (var dataStream = request.GetRequestStream()) 
{ 
    dataStream.Write(byteArray, 0, byteArray.Length); 
} 

using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    //Do what you need to do with the response. 
} 
+0

这正是我所需要的。感谢您注意我发布到错误的位置。 – wmayes

0

您应该在像Fiddler这样的调试器中观察请求,并在真实网站和代码发送的请求之间进行比较。上面代码片段中的一个可疑事情是,您以JSON格式发送数据,但声称它是“application/x-www-form-urlencoded”而不是“application/json”。

您可能还需要设置标头,如用户代理和/或Cookie或验证标头。

0

如果你不需要多线程webclient将完成这项工作。

string data = "\"setcmd.cgx\", {\n\rver : \"1\", \n\rcmd : \"abn\"\n\r}, function (data) {}"; 
    WebClient client = new WebClient(); 
    client.Encoding = System.Text.Encoding.UTF8; 

    string reply = client.UploadString("http://192.168.3.230/index.htm", data); 
    //reply contains the web responce 

此外,如果你正在使用的WinForms(因为它似乎你),你应该考虑与异步方法,不会阻塞主线程(UI线程)

string reply = client.UploadStringAsync("http://192.168.3.230/index.htm", data); 
如果你想

发送使用HttpWebRequest类让我知道,我会编辑我的答案;)