Meter (DSMR): accept binary WebSocket frames (#31324)

This commit is contained in:
RDMN 2026-06-29 14:35:16 +02:00 • committed by GitHub
parent 1005f075a2
commit 6fb096f61f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 34 additions and 24 deletions

View file

@ -257,6 +257,14 @@ func TestDsmrTCP(t *testing.T) {
}
func TestDsmrWebSocket(t *testing.T) {
for _, tc := range []struct {
name string
message websocket.MessageType
}{
{"text", websocket.MessageText},
{"binary", websocket.MessageBinary},
} {
t.Run(tc.name, func(t *testing.T) {
payload := dsmrFrame(dsmrTelegram50)
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@ -267,7 +275,7 @@ func TestDsmrWebSocket(t *testing.T) {
defer conn.CloseNow()
for {
if err := conn.Write(r.Context(), websocket.MessageText, payload); err != nil {
if err := conn.Write(r.Context(), tc.message, payload); err != nil {
return
}
time.Sleep(50 * time.Millisecond)
@ -284,6 +292,8 @@ func TestDsmrWebSocket(t *testing.T) {
require.NoError(t, err)
assertReadings(t, m)
})
}
}
// TestDsmrIgnoresGarbage verifies that leading garbage and a CRC-mismatched

View file

@ -48,9 +48,9 @@ func (r *wsReader) Read(p []byte) (int, error) {
return 0, err
}
// The P1 telegram is streamed as text frames; skip any other frame
// type so metadata or binary frames are not fed to the DSMR parser.
if msgType != websocket.MessageText {
// The P1 telegram may be streamed as text or binary frames, depending on
// the dongle firmware. Skip control or metadata frames.
if msgType != websocket.MessageText && msgType != websocket.MessageBinary {
continue
}