Meter (DSMR): accept binary WebSocket frames (#31324)
This commit is contained in:
parent
1005f075a2
commit
6fb096f61f
2 changed files with 34 additions and 24 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue