diff --git a/meter/dsmr_test.go b/meter/dsmr_test.go index 101f0d3c5..5ef977f95 100644 --- a/meter/dsmr_test.go +++ b/meter/dsmr_test.go @@ -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 diff --git a/meter/dsmr_ws.go b/meter/dsmr_ws.go index 1f25eb103..475f5e504 100644 --- a/meter/dsmr_ws.go +++ b/meter/dsmr_ws.go @@ -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 }