Replies: 4 comments
-
Ich hätte eine Alternative 😊
Die Anzahl der Peer Messages (Byte 3: 40 bis 70) sind ja recht überschaubar und in deren Behandlung wird das Peer geprüft um die entsprechende Liste zu finden.
Folglich müssten wir doch nur vor dem Aufruf der restlichen Behandlungen (Byte 3: 00 bis 3F) die MasterID oder Broadcast als Absender prüfen?
Oder übersehe ich da was?
Viele Grüße
Horst
Byte 03 | Byte 10 | Byte 11 | Description
-- | -- | -- | --
00 | | | DEVICE_INFO
01 | | 01 | CONFIG_PEER_ADD
01 | | 02 | CONFIG_PEER_REMOVE
01 | | 03 | CONFIG_PEER_LIST_REQ
01 | | 04 | CONFIG_PARAM_REQ
01 | | 05 | CONFIG_START
01 | | 06 | CONFIG_END
01 | | 08 | CONFIG_WRITE_INDEX
01 | | 09 | CONFIG_SERIAL_REQ
01 | | 0A | PAIR_SERIAL
01 | | 0E | CONFIG_STATUS_REQUEST
02 | 00 | | ACK
02 | 01 | | ACK_STATUS
02 | 02 | | ACK2
02 | 04 | | ACK-PROC
02 | 80 | | NACK
02 | 84 | | NACK_TARGET_INVALID
02 | | | ACK_NACK_UNKNOWN
02 | | | REQUEST_AES
03 | | | AES_REPLY
04 | 00 | | TO-HMLAN_SEND_AES_CODE
04 | | | TO-ACTOR_SEND_AES_CODE
10 | 00 | | INFO_SERIAL
10 | 01 | | INFO_PEER_LIST
10 | 02 | | INFO_PARAM_RESPONSE_PAIRS
10 | 03 | | INFO_PARAM_RESPONSE_SEQ
10 | 04 | | INFO_PARAMETER_CHANGE
10 | 06 | | INFO_ACTUATOR_STATUS
11 | 02 | | SET
11 | 03 | | STOP_CHANGE
11 | 04 | 00 | RESET
11 | 80 | | LED
11 | 81 | 00 | LEDALL
11 | 81 | | LEVEL
11 | 82 | | SLEEPMODE
12 | | | HAVE_DATA
3E | | | SWITCH
3F | | | TIMESTAMP
40 | | | REMOTE
41 | | | SENSOR_EVENT
53 | | | SENSOR_DATA
58 | | | CLIMATE_EVENT
70 | | | WEATHER_EVENT
`
Von: Jérôme ***@***.***>
Gesendet: Mittwoch, 17. Januar 2024 10:56
An: pa-pa/AskSinPP ***@***.***>
Cc: trilu2000 ***@***.***>; Mention ***@***.***>
Betreff: [pa-pa/AskSinPP] Prüfung auf gültigen Absender (Discussion #318)
Ich würde gern das besprochene Thema der Absenderprüfung in Code gießen.
Momentan wird ja nicht geprüft, ob ein eingehendes Telegramm vom Master oder einem Peer stammt. Die Verarbeitung findet immer statt.
Die Prüfung müsste wohl unmittelbar nach
https://github.com/pa-pa/AskSinPP/blob/c9e7eeb0522a166573ccf881b3d183e467a04547/MultiChannelDevice.h#L241-L243
erfolgen.
Zu prüfen, ob msg.from() == getMasterID() entspricht, ist einfach.
Wie aber mit den Peers verfahren?
* beim Start ein Array mit der Liste aller gültigen Absender anlegen und dann darin suchen? Kostet wieder Speicher.
* Jedes Mal durch die Liste aller Peers iterieren? Kostet das evtl. zu viel CPU-Zeit?
Mein aktueller Ansatz sieht so aus:
//Nachricht ist nicht vom Master/CCU, also Peers checken
if (msg.from() != this->getMasterID()) {
//solange kein Master angelernt ist (Factory Reset), ist die Nachricht grundsätzlich erstmal für uns bestimmt,
//um alle CONFIG_xxx Messages von einer (noch fremden) Zentrale zu verarbeiten.
bool validFrom = (this->getMasterID() == HMID::broadcast);
if (validFrom == false) {
//also erstmal über alle Channel
uint8_t numChannels = this->channels();
for (uint8_t j = 0; j< numChannels; j++) {
ch = &channel(j+1);
//und alle Peers je Channel
for( uint8_t i=0; i< ch->peers(); ++i ) {
if( msg.from() == ch->peerat(i) ) {
validFrom = true;
DPRINT("valid peer found at idx ");DDECLN(i);
break;
}
}
}
}
//Nachricht ist wirklich nicht von einem gültigen Absender, also Abbruch der Verarbeitung
if (validFrom == false) {
DPRINT(F("msg not for us."));
return false;
}
}
Aber das Durchforsten der Peers finde ich noch recht unglücklich gelöst.
Ich bin mir sicher, dass da noch ein besserer Vorschlag von @pa-pa <https://github.com/pa-pa> / @trilu2000 <https://github.com/trilu2000> kommt ;-)
—
Reply to this email directly, view it on GitHub <#318> , or unsubscribe <https://github.com/notifications/unsubscribe-auth/ABO3WH7DFKG7IQCFMPHZMJLYO6N4ZAVCNFSM6AAAAABB6HSHOKVHI2DSMVQWIX3LMV43ERDJONRXK43TNFXW4OZWGA4DKNJYG4> .
You are receiving this because you were mentioned. <https://github.com/notifications/beacon/ABO3WH7RDBVNFXMJCNLNBM3YO6N4ZA5CNFSM6AAAAABB6HSHOKWGG33NNVSW45C7OR4XAZNKIRUXGY3VONZWS33OVJRW63LNMVXHIX3JMTHAAXG32M.gif> Message ID: ***@***.*** ***@***.***> >
|
Beta Was this translation helpful? Give feedback.
0 replies
-
Verstehe, ja das macht es wesentlich einfacher! |
Beta Was this translation helpful? Give feedback.
0 replies
-
Oder so
|
Beta Was this translation helpful? Give feedback.
0 replies
-
Hab mal PR #319 eingestellt zum Drüberschauen. |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Ich würde gern das besprochene Thema der Absenderprüfung in Code gießen.
Momentan wird ja nicht geprüft, ob ein eingehendes Telegramm vom Master oder einem Peer stammt. Die Verarbeitung findet immer statt.
Die Prüfung müsste wohl unmittelbar nach
AskSinPP/MultiChannelDevice.h
Lines 241 to 243 in c9e7eeb
erfolgen.
Zu prüfen, ob
msg.from() == getMasterID()
entspricht, ist einfach.Wie aber mit den Peers verfahren?
Mein aktueller Ansatz sieht so aus:
Aber das Durchforsten der Peers finde ich noch recht unglücklich gelöst.
Ich bin mir sicher, dass da noch ein besserer Vorschlag von @pa-pa / @trilu2000 kommt ;-)
Beta Was this translation helpful? Give feedback.
All reactions