2012-01-12 27 views
1

NetduinoのPachubeサンプルのこの簡単な適合は機能しません。それはバーフではなく、ただ静かに失敗します。書き込み後少し待つと、ソケットはAvailableプロパティの315バイトを報告しますが、データを読み取ろうとすると機能しません。つまり、cbにはゼロが入っていて、変更されていないバッファが同意します。NETMFソケットから読み取ることができません

このデータを読み取ることができないのはなぜですか?私はそれがアプリケーションの残りの部分に何が間違っているかを理解するのに役立つサーバーの応答だと思う。

は、ここでは、コードです:

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 
using Microsoft.SPOT; 
using Microsoft.SPOT.Hardware; 
using SecretLabs.NETMF.Hardware.NetduinoPlus; 
using SecretLabs.NETMF.Hardware; 

public class HelloPachubeSockets 
{ 
    static string apiKey = "wggHejZTKTvE6ZplSc5feSs1rQLeD4cYmi7WPYiG0VLIx_TC-isp8CI9vkKq3nQxadhydl3gUiSK8vS5SBd9JCCoXQG-g0N8FXYlYcNjEfJVMQJA-usgijpE1LRT-xw5"; 
    static string feedId = "43974"; 
    static double maxVoltage = 3.3; 
    static int maxAdcValue = 1023; 
    static int interval = 20000; 
    static Socket connection = null; 
    static Timer timer; 
    static AnalogInput voltagePort; 
    static OutputPort lowPort, highPort; 
    static IPEndPoint remoteEndPoint; 
    static double V = 0; 

    static void LogSensor(object state) 
    { 
     Debug.Print("time: " + DateTime.Now); 
     Debug.Print("memory available: " + Debug.GC(true)); 
     try 
     { 
      connection = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      connection.SendTimeout = interval/2; 
      connection.Connect(remoteEndPoint); 
      int rawValue = voltagePort.Read(); 
      double value = (rawValue * maxVoltage)/maxAdcValue; 
      string sample = "voltage," + V.ToString("f"); 
      V += 0.1; 
      Debug.Print("new message: " + sample); 
      byte[] contentBuffer = Encoding.UTF8.GetBytes(sample); 
      const string CRLF = "\r\n"; 
      var requestLine = "PUT /v2/feeds/" + feedId + ".csv HTTP/1.1\r\n"; 
      byte[] requestLineBuffer = Encoding.UTF8.GetBytes(requestLine); 
      var headers = 
       "Host: api.pachube.com\r\n" + 
       "X-PachubeApiKey: " + apiKey + CRLF + 
       "Content­Type: text/csv\r\n" + 
       "Content­Length: " + contentBuffer.Length + CRLF + 
       CRLF; 
      byte[] headersBuffer = Encoding.UTF8.GetBytes(headers); 
      connection.Send(requestLineBuffer); 
      connection.Send(headersBuffer); 
      connection.Send(contentBuffer); 
      Thread.Sleep(400); 
      int a = connection.Available; 
      byte[] r = new byte[a]; 
      int cb = connection.Receive(r, 0, a, SocketFlags.None); 
      connection.Close(); 
     } 
     catch 
     { 
      Debug.Print("connection failed"); 
     } 
    } 

    public static void Main() 
    { 
     voltagePort = new AnalogInput(Pins.GPIO_PIN_A1); 
     lowPort = new OutputPort(Pins.GPIO_PIN_A0, false); 
     highPort = new OutputPort(Pins.GPIO_PIN_A2, true); 
     remoteEndPoint = new IPEndPoint(Dns.GetHostEntry("api.pachube.com").AddressList[0], 80); 
     timer = new Timer(LogSensor, null, 0, interval); 
     Thread.Sleep(Timeout.Infinite); 
    } 
} 

Pachubeキーのについての妥当性として、私はcURLでチェックし、キーと飼料詳細が正しいです。

+0

私は間違いではない場合、C#/ .Netを使用してください。C#ホストプログラムを最初に実行するか、Arduino + Ethernet ShieldでC++を試すかのどちらかですか?あなたはC#のタグ付けを再度行う必要があると思います;) – errordeveloper

+0

HTTPクラスを使うか、Pachubeが提供するプレーンなTCPソケットを使うかを試してみてください。 – errordeveloper

+0

それはC#/ .netであるという事実は、netduinoタグで暗黙のものです。私はまだ* this *コードが動作しない理由を理解していませんが、*私は*働いているより高度なコードをいくつか取得しています。それが私に起きるとき、問題はここにあります(誰も最初に答えないなら、私はそれを書きます)。 –

答えて

0

http://msdn.microsoft.com/en-us/library/w3xtz6a5.aspx#Y0を見ると、バッファが空の場合は受信がブロック動作であるため、ソケットで応答を待つためにスリープする必要はありません。あなたのような何かにあなたの受信コードを簡素化しようとした場合

何:また

// Blocks until send returns. 
connection.Send(...) 

// Get reply from the server. 
int byteCount = server.Receive(bytes, 0, connection.Available, 
           SocketFlags.None); 

if (byteCount > 0) 
    Console.WriteLine(Encoding.UTF8.GetString(bytes)); 

は、明示的に代わりに使用可能な番号を、ソケットのオフに256バイトのような何かを読み取ろうとする可能性があります。

+0

あなたは正しいですが、あなたが考える理由ではありません。それはクロススレッドのもので、あなたのやりかたを書き換えることで問題が解決されます。私はそのひどいコードを書いたときに思っていたものを知りません。 –

関連する問題