feat(sacn): Ergebnis des Multicast-Beitritts sichtbar machen
Bei der Abnahme kam Multicast nicht an, waehrend Unicast lief. Der Rueckgabewert von IP_ADD_MEMBERSHIP wurde bis jetzt verworfen - absichtlich, weil ein gescheiterter Beitritt den Unicast-Empfang nicht verhindern soll. Die Folge war aber, dass sich die entscheidende Frage nicht beantworten liess: tritt die Lampe nicht bei, oder reicht das WLAN die Gruppe nicht weiter? system/info traegt deshalb jetzt "sacn.multicast", und der Beitritt schreibt beim Socket-Aufbau eine Zeile auf die Konsole. Am Verhalten aendert sich nichts: ein Fehlschlag bleibt folgenlos fuer Unicast.
This commit is contained in:
+14
-2
@@ -30,6 +30,8 @@ volatile uint32_t nl_sacn_beat;
|
||||
* wuerde die Lampe im 20-s-Takt endlos zuruecksetzen - ein Zusatzdienst darf sie nicht
|
||||
* unbrauchbar machen. */
|
||||
static volatile bool s_running = true;
|
||||
/* Ergebnis des letzten Multicast-Beitritts; ueber system/info sichtbar. */
|
||||
static volatile bool s_joined;
|
||||
|
||||
void nl_sacn_apply_settings(const nl_settings_t *s)
|
||||
{
|
||||
@@ -79,12 +81,20 @@ static int open_socket(uint16_t universe, char ip_seen[16])
|
||||
ip_seen[15] = '\0';
|
||||
|
||||
/* 239.255.<hi>.<lo> gemaess E1.31 Anhang A. Ein fehlgeschlagener Beitritt ist kein
|
||||
* Abbruchgrund: Unicast an die Lampen-IP kommt auf demselben Socket weiterhin an. */
|
||||
* Abbruchgrund: Unicast an die Lampen-IP kommt auf demselben Socket weiterhin an.
|
||||
*
|
||||
* Das Ergebnis wird aber festgehalten und ueber system/info sichtbar gemacht. Bei der
|
||||
* Abnahme am 2026-09-20 kam Multicast nicht an, waehrend Unicast lief - und weil der
|
||||
* Rueckgabewert damals verworfen wurde, liess sich nicht unterscheiden, ob die Lampe
|
||||
* nicht beitritt oder das WLAN die Gruppe nicht weiterreicht. Genau diese Frage
|
||||
* beantwortet das Feld. */
|
||||
memset(&mreq, 0, sizeof mreq);
|
||||
mreq.imr_multiaddr.s_addr =
|
||||
htonl(0xefff0000u | ((uint32_t)(universe >> 8) << 8) | (universe & 0xffu));
|
||||
mreq.imr_interface.s_addr = ip_seen[0] ? inet_addr(ip_seen) : htonl(INADDR_ANY);
|
||||
setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof mreq);
|
||||
s_joined = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof mreq) == 0;
|
||||
printf("sacn: universe %u, multicast join %s\r\n", (unsigned)universe,
|
||||
s_joined ? "ok" : "FEHLGESCHLAGEN");
|
||||
return fd;
|
||||
}
|
||||
|
||||
@@ -171,3 +181,5 @@ bool nl_sacn_running(void)
|
||||
{
|
||||
return s_running;
|
||||
}
|
||||
|
||||
bool nl_sacn_joined(void) { return s_joined; }
|
||||
|
||||
Reference in New Issue
Block a user