PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/README.md

https://bitbucket.org/amotzek/arduino
Markdown | 134 lines | 106 code | 28 blank | 0 comment | 0 complexity | df73aefb446057e8c0a148bd38307967 MD5 | raw file
  1. ## MQTT Client
  2. MQTT Client ist eine Bibliothek, mit der Zeichenketten an ein Topic eines MQTT
  3. Brokers publiziert werden können. Die Bibliothek verwendet die Bibliothek Cooperative
  4. Multitasking (siehe unten).
  5. Um eine Instanz der Klasse `MQTTClient` zu erzeugen, benötigt man eine Referenz auf eine
  6. Instanz der Klasse `CooperativeMultitasking`, eine Referenz auf eine Netzwerkverbindung
  7. (z.B. aus `WiFi101`), den Hostnamen des MQTT Brokers, dessen Portnummer (gewöhnlich 1883)
  8. und eine Client Id. Wenn der Broker das erwartet, dann müssen auch ein Benutzername und
  9. ein Passwort angegeben werden.
  10. Einer neuen Instanz der Klasse `MQTTTopic` müssen eine Referenz auf den `MQTTClient`
  11. und der Name des Topics übergeben werden.
  12. #include <Client.h>
  13. #include <WiFi101.h>
  14. #include <CooperativeMultitasking.h>
  15. #include <MQTTClient.h>
  16. char ssid[] = "...";
  17. char pass[] = "...";
  18. char host[] = "broker.hivemq.com";
  19. char clientid[] = "...";
  20. char username[] = "...";
  21. char password[] = "...";
  22. char topicname[] = "amotzek/hello";
  23. CooperativeMultitasking tasks;
  24. WiFiClient wificlient;
  25. MQTTClient mqttclient(&tasks, &wificlient, host, 1883, clientid, username, password);
  26. MQTTTopic topic(&mqttclient, topicname);
  27. Die Methode `connect()` von `MQTTClient` stellt eine Verbindung zum Broker her. Eine
  28. Zeichenkette kann mit der Methode `publish("...")` des `MQTTTopic` publiziert werden. Beide
  29. Methoden arbeiten asynchron. Sie erzeugen Aufgaben, die von der Instanz von
  30. `CooperativeMultitasking` verwaltet werden. Deshalb muss man deren Methode `run()` aufrufen,
  31. bis alle Aufgaben abgearbeitet sind.
  32. void setup() {
  33. Serial.begin(9600);
  34. //
  35. while (!Serial) {
  36. delay(1000);
  37. }
  38. //
  39. WiFi.begin(ssid, pass);
  40. delay(10000);
  41. }
  42. void loop() {
  43. if (mqttclient.connect()) {
  44. topic.publish("Hello");
  45. //
  46. while (tasks.available()) {
  47. tasks.run();
  48. }
  49. //
  50. mqttclient.disconnect();
  51. }
  52. //
  53. switch (WiFi.status()) {
  54. case WL_CONNECT_FAILED:
  55. case WL_CONNECTION_LOST:
  56. case WL_DISCONNECTED: WiFi.begin(ssid, pass);
  57. }
  58. //
  59. delay(30000);
  60. }
  61. ## Cooperative Multitasking
  62. Cooperative Multitasking ist eine Bibliothek, mit der mehrere Funktionen (fast)
  63. gleichzeitig oder unabhängig voneinander ausgeführt werden können.
  64. Um das zu ermöglichen, verwalten Instanzen der Klasse `CooperativeMultitasking`
  65. Listen von Aufgaben. Jeder Sketch braucht nur eine Instanz der Klasse.
  66. #include <CooperativeMultitasking.h>
  67. CooperativeMultitasking tasks;
  68. Funktionen, die im Rahmen einer Aufgabe ausgeführt werden sollen, müssen eine
  69. sogenannte Forward Declaration haben:
  70. Continuation f;
  71. void f() {
  72. // Code hier
  73. // hier können und sollen auch now, after, ifThen, ifForThen
  74. // und onlyOneOf verwendet werden, jedoch nicht delay!
  75. }
  76. Außerdem kann es noch Funktionen geben, die für das Testen von Bedingungen
  77. verwendet werden. Diese müssen eine andere Forward Declaration haben:
  78. Guard g;
  79. bool g() {
  80. // Code hier
  81. return true; // oder return false;
  82. }
  83. Aufgaben können mit `now`, `after`, `ifThen` und `ifForThen` in die Liste
  84. aufgenommen werden:
  85. * Mit `tasks.now(f);` wird der Aufruf der Funktion `f` an den Anfang der Liste
  86. gestellt. Der Aufruf von `f` findet dann sofort statt.
  87. * Mit `after(1000, f);` findet der Aufruf der Funktion `f` erst in 1000
  88. Millisekunden statt.
  89. * Mit `ifThen(g, f);` findet der Aufruf der Funktion `f` statt, sobald die
  90. Funktion `g` den Wert true liefert.
  91. * Mit `ifForThen(g, 300, f);` findet der Aufruf der Funktion `f` statt,
  92. wenn `g` mindestens 300 Millisekunden lang den Wert `true` geliefert hat.
  93. Mit der Methode `onlyOneOf` kann man deklarieren, dass nur eine von mehreren
  94. Aufgaben ausgeführt werden soll - die, die als erste aktiv wird. Ein Beispiel
  95. dafür findet sich in [BlinkWhenItsDark.ino](https://bitbucket.org/amotzek/arduino/src/0f19b22f4a793a0e066c1278d922b952261e6ed8/src/main/cpp/CooperativeMultitasking/examples/BlinkWhenItsDark/?at=master).
  96. In der Funktion `loop()` muss die Methode `run()` aufgerufen werden. So werden die
  97. Aufgaben ausgeführt, sobald sie an der Reihe sind.
  98. void loop() {
  99. tasks.run();
  100. }
  101. Damit beim Start des Sketch überhaupt eine Aufgabe zur Ausführung kommt,
  102. muss man diese im Setup in die Liste aufnehmen.
  103. void setup() {
  104. // anderer Code hier
  105. tasks.now(f);
  106. }