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 +
"ContentType: text/csv\r\n" +
"ContentLength: " + 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でチェックし、キーと飼料詳細が正しいです。
私は間違いではない場合、C#/ .Netを使用してください。C#ホストプログラムを最初に実行するか、Arduino + Ethernet ShieldでC++を試すかのどちらかですか?あなたはC#のタグ付けを再度行う必要があると思います;) – errordeveloper
HTTPクラスを使うか、Pachubeが提供するプレーンなTCPソケットを使うかを試してみてください。 – errordeveloper
それはC#/ .netであるという事実は、netduinoタグで暗黙のものです。私はまだ* this *コードが動作しない理由を理解していませんが、*私は*働いているより高度なコードをいくつか取得しています。それが私に起きるとき、問題はここにあります(誰も最初に答えないなら、私はそれを書きます)。 –