{"record":{"id":"d55be6862ee95d42","repo":"AlexxIT/go2rtc","slug":"miss-read-media-w","errorCode":null,"errorMessage":"miss: read media: %w","messagePattern":"miss: read media: %w","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/xiaomi/miss/client.go","lineNumber":227,"sourceCode":"}\n\n// SpeakerCodec if the camera model has a non-standard two-way codec.\nfunc (c *Client) SpeakerCodec() uint32 {\n\tswitch c.model {\n\tcase ModelDafang, ModelXiaofang, \"isa.camera.hlc6\":\n\t\treturn codecPCM\n\tcase \"chuangmi.camera.72ac1\":\n\t\treturn codecOPUS\n\t}\n\treturn 0\n}\n\nconst hdrSize = 32\n\nfunc (c *Client) ReadPacket() (*Packet, error) {\n\thdr, payload, err := c.Conn.ReadPacket()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"miss: read media: %w\", err)\n\t}\n\n\tif len(hdr) < hdrSize {\n\t\treturn nil, fmt.Errorf(\"miss: packet header too small\")\n\t}\n\n\tpayload, err = crypto.Decode(payload, c.key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpkt := &Packet{\n\t\tCodecID:  binary.LittleEndian.Uint32(hdr[4:]),\n\t\tSequence: binary.LittleEndian.Uint32(hdr[8:]),\n\t\tFlags:    binary.LittleEndian.Uint32(hdr[12:]),\n\t\tPayload:  payload,\n\t}\n","sourceCodeStart":209,"sourceCodeEnd":245,"githubUrl":"https://github.com/AlexxIT/go2rtc/blob/c245815e75e2a5fd60b4290f12bfc04e55a984d3/pkg/xiaomi/miss/client.go#L209-L245","documentation":"ReadPacket reads a media packet from the camera connection; any transport-level read failure is wrapped as 'miss: read media: %w'. The wrapped cause tells you whether it was a network drop, timeout, or protocol error.","triggerScenarios":"Calling Client.ReadPacket while the underlying conn.ReadPacket fails — camera disconnected, network timeout, TUTK/CS2 session dropped.","commonSituations":"Camera losing Wi-Fi during streaming; camera rebooting mid-stream; NAT/firewall dropping the long-lived media connection; TUTK P2P session expiry.","solutions":["Check the wrapped cause (errors.Unwrap / %w chain) to identify the transport failure","Reconnect and create a new Client, then resume ReadPacket","Add retry logic around ReadPacket with backoff for transient network drops","Verify camera network stability (signal strength, firewall keepalives)"],"exampleFix":"// before\npkt, err := client.ReadPacket() // panics user on transient drop\nif err != nil { return err }\n// after\npkt, err := client.ReadPacket()\nif err != nil {\n    client = reconnectWithBackoff()\n    pkt, err = client.ReadPacket()\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"pkt, err := client.ReadPacket()\nif err != nil {\n    var netErr net.Error\n    if errors.As(err, &netErr) && netErr.Timeout() {\n        client = reconnect(ctx)\n        pkt, err = client.ReadPacket()\n    }\n}","preventionTips":["Wrap streaming loops in reconnect logic","Send keepalive traffic to avoid NAT/firewall drops","Monitor camera network health before long streams"],"tags":["miss","network","streaming"],"backgroundTag":"network-request-failed","analyzedSha":"c245815e75e2a5fd60b4290f12bfc04e55a984d3","analyzedAt":"2026-09-07T11:47:02.965Z","contentChangedAt":"2026-09-07T11:47:02.965Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}