Fix intercom for new firmware
This commit is contained in:
+11
-8
@@ -743,12 +743,9 @@ func (c *Conn) handleNewProtoPacket(data []byte) {
|
|||||||
// We need to strip the auth bytes at the end
|
// We need to strip the auth bytes at the end
|
||||||
dtlsPayload := data[NewProtoHeaderSize : len(data)-NewProtoAuthSize]
|
dtlsPayload := data[NewProtoHeaderSize : len(data)-NewProtoAuthSize]
|
||||||
|
|
||||||
// Channel is in the 4-byte field at offset 24 (value 1=main, 2=back)
|
// Channel is encoded in the high byte of the sequence field:
|
||||||
channelFlag := binary.LittleEndian.Uint32(data[24:])
|
// seq=0x0010 -> channel 0 (main), seq=0x0110 -> channel 1 (back)
|
||||||
var channel byte
|
channel := byte(seq >> 8)
|
||||||
if channelFlag >= 1 {
|
|
||||||
channel = byte(channelFlag - 1) // Convert back to 0=main, 1=back
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.verbose && len(dtlsPayload) >= 1 {
|
if c.verbose && len(dtlsPayload) >= 1 {
|
||||||
fmt.Printf("[NEW] DTLS RX ch=%d contentType=%d len=%d (stripped 20 auth bytes)\n%s", channel, dtlsPayload[0], len(dtlsPayload), hexDump(dtlsPayload))
|
fmt.Printf("[NEW] DTLS RX ch=%d contentType=%d len=%d (stripped 20 auth bytes)\n%s", channel, dtlsPayload[0], len(dtlsPayload), hexDump(dtlsPayload))
|
||||||
@@ -894,6 +891,10 @@ func (c *Conn) route(data []byte) {
|
|||||||
|
|
||||||
func (c *Conn) handleSpeakerAVLogin() error {
|
func (c *Conn) handleSpeakerAVLogin() error {
|
||||||
// Read AV Login request from camera (SDK receives 570 bytes)
|
// Read AV Login request from camera (SDK receives 570 bytes)
|
||||||
|
if c.verbose {
|
||||||
|
fmt.Printf("[SPEAK] Waiting for AV Login request from camera...\n")
|
||||||
|
}
|
||||||
|
|
||||||
buf := make([]byte, 1024)
|
buf := make([]byte, 1024)
|
||||||
c.speakerConn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
c.speakerConn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
||||||
n, err := c.speakerConn.Read(buf)
|
n, err := c.speakerConn.Read(buf)
|
||||||
@@ -1351,10 +1352,12 @@ func (c *Conn) buildNewProtoDTLS(payload []byte, channel byte) []byte {
|
|||||||
binary.LittleEndian.PutUint16(pkt[6:], payloadSize)
|
binary.LittleEndian.PutUint16(pkt[6:], payloadSize)
|
||||||
binary.LittleEndian.PutUint16(pkt[8:], 0x0000) // Direction (request)
|
binary.LittleEndian.PutUint16(pkt[8:], 0x0000) // Direction (request)
|
||||||
binary.LittleEndian.PutUint16(pkt[10:], 0x0000) // Reserved
|
binary.LittleEndian.PutUint16(pkt[10:], 0x0000) // Reserved
|
||||||
binary.LittleEndian.PutUint16(pkt[12:], 0x0010) // DTLS uses fixed seq=16 (0x10)
|
// Channel is encoded in high byte of sequence: 0x0010=main, 0x0110=back
|
||||||
|
seq := uint16(0x0010) | (uint16(channel) << 8)
|
||||||
|
binary.LittleEndian.PutUint16(pkt[12:], seq)
|
||||||
binary.LittleEndian.PutUint16(pkt[14:], c.newProtoTicket)
|
binary.LittleEndian.PutUint16(pkt[14:], c.newProtoTicket)
|
||||||
copy(pkt[16:24], c.sessionID)
|
copy(pkt[16:24], c.sessionID)
|
||||||
binary.LittleEndian.PutUint32(pkt[24:], uint32(channel)+1) // Channel flag (main=1, back=2)
|
binary.LittleEndian.PutUint32(pkt[24:], 1) // Always 1 for DTLS wrapper
|
||||||
copy(pkt[NewProtoHeaderSize:], payload)
|
copy(pkt[NewProtoHeaderSize:], payload)
|
||||||
|
|
||||||
// Add Auth bytes at the end: HMAC-SHA1(UID+AuthKey, packet_header)
|
// Add Auth bytes at the end: HMAC-SHA1(UID+AuthKey, packet_header)
|
||||||
|
|||||||
Reference in New Issue
Block a user