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,33 +257,43 @@ func TestDsmrTCP(t *testing.T) {
}
func TestDsmrWebSocket(t *testing.T) {
payload := dsmrFrame(dsmrTelegram50)
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) {
conn, err := websocket.Accept(w, r, nil)
if err != nil {
return
}
defer conn.CloseNow()
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
conn, err := websocket.Accept(w, r, nil)
if err != nil {
return
}
defer conn.CloseNow()
for {
if err := conn.Write(r.Context(), websocket.MessageText, payload); err != nil {
return
}
time.Sleep(50 * time.Millisecond)
}
}))
defer srv.Close()
for {
if err := conn.Write(r.Context(), tc.message, payload); err != nil {
return
}
time.Sleep(50 * time.Millisecond)
}
}))
defer srv.Close()
uri := "ws" + strings.TrimPrefix(srv.URL, "http")
uri := "ws" + strings.TrimPrefix(srv.URL, "http")
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
m, err := NewDsmr(ctx, uri, time.Second)
require.NoError(t, err)
m, err := NewDsmr(ctx, uri, time.Second)
require.NoError(t, err)
assertReadings(t, m)
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
}