سؤال

هذا التعديل البسيط لعينة Pachube لـ Netduino لا يعمل.إنها لا تعترض، إنها تفشل بصمت.لقد لاحظت أنه إذا انتظرت قليلاً بعد الكتابة، فسيبلغ المقبس عن 315 بايت في ملفه Available الملكية، ولكن محاولة قراءة البيانات ببساطة لا تعمل - cb يحتوي على صفر ويوافق المخزن المؤقت دون تغيير.

لماذا لا أستطيع قراءة هذه البيانات؟أظن أنها استجابة الخادم التي قد تساعدني في معرفة الخطأ في بقية التطبيق.

إليك الكود:

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، فقد قمت بالتحقق منه لفة وتفاصيل المفتاح والخلاصة صحيحة.

هل كانت مفيدة؟

المحلول

انظر الى 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 بايت من المقبس، بدلاً من الرقم المتاح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top