Jump to content

Recommended Posts

Geschrieben

Hallo Leute,

 

ich bin noch blutiger Tinkerforge Anfänger und versuche eine WebAPI zu schreiben, die mir die Werte aller Sensoren zurückgibt, die an einem Raspberry PI angeschlossen sind. Dazu habe ich mir die API Bindings für C# angeguckt.

 

Dafür habe ich folgenden Code geschrieben:

 

public class TinkerforgeController : Controller
{
    [HttpGet("GetValues")]
    public JsonResult GetValues([FromQuery]string ip, [FromQuery]int port)
    {
        var service = new TinkerforgeClientService(ip, port);
        var values = service.GetValues();            
        return Json(values);
    }
}

public class TinkerforgeClientService
{
    private IPConnection _conn;
    private List<SensorValue> _values = new List<SensorValue>();
    private string _ip = string.Empty;
    private int _port = 0;

    public TinkerforgeClientService(string ip, int port)
    {
        _ip = ip;
        _port = port;
        _conn = new IPConnection();
        _conn.EnumerateCallback += EnumerateCallBack;
        _conn.Connect(ip, port);
    }

    private void EnumerateCallBack(IPConnection sender,
                        string uid, string connectedUid, char position,
                        short[] hardwareVersion, short[] firmwareVersion,
                        int deviceIdentifier, short enumerationType)
    {
        var sensor = SensorFactory.GetSensor(deviceIdentifier, _ip, _port, uid);
        _values.Add(sensor.GetValue());

    }

    public SensorValue[] GetValues()
    {
        _conn.Enumerate();                
        return _values.ToArray();
    }
}

 

Mein Problem ist den Code so zu schreiben, dass

EnumerateCallBack 

komplett für alle Sensoren durchläuft, bevor

return _values.ToArray();

aufgerufen wird. In der API gibt es die Methoden

Wait()

und

Unwait()

allerdings keine Beispiele wie man diese benutzt. Kann mir da jemand weiterhelfen?

 

  • 2 weeks later...
Geschrieben

Wait/Unwait der IPConnection sind alte Hilfsfunktionen, die nur zu Rückwärtskompatibilität noch da sind.

 

Da du nicht weißt, welcher Enumerate Callback der letzte ist, ist die einfachste Lösung mit einem System.Threading.Thread.Sleep(1) zwischen "_conn.Enumerate()" und "return _values.ToArray()" für eine Sekunde zu warten.

 

In der einen Sekunde kommen dann unter normalen Umständen alle Enumerate Callbacks an.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...