Frage

Diese triviale Anpassung des Pachube-Beispiels für Netduino funktioniert nicht.Es barf nicht, es versagt nur lautlos.Ich habe festgestellt, dass der Socket, wenn Sie kurz nach dem Schreiben warten, 315 Bytes in seiner Available-Eigenschaft meldet, aber der Versuch, die Daten zu lesen, einfach nicht funktioniert - cb enthält Null und der unveränderte Puffer stimmt überein.

Warum kann ich diese Daten nicht lesen?Ich vermute, es ist eine Serverantwort, die mir helfen könnte, herauszufinden, was mit dem Rest der Anwendung nicht stimmt.

Hier ist der Code:

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);
    }
}

In Bezug auf die Gültigkeit des Pachube-Schlüssels habe ich cURL sowie die Schlüssel- und Feed-Details überprüftsind richtig.

War es hilfreich?

Lösung

Betrachten von http://msdn.microsoft.com/en-us / library / w3xtz6a5.aspx # Y0 sollten Sie nicht schlafen müssen, um auf eine Antwort auf dem Socket zu warten, da Empfangen eine Blockierungsoperation ist, wenn der Puffer leer ist.

Was wäre, wenn Sie versuchen würden, Ihren Empfangscode auf Folgendes zu vereinfachen:

// 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));

Alternativ können Sie explizit versuchen, anstelle der verfügbaren Nummer etwa 256 Byte aus dem Socket zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top