60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
package ipcamera
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
"github.com/icza/bitio"
|
|
)
|
|
|
|
// Header is an ipcamera protocol message header
|
|
type Header struct {
|
|
Magic uint16
|
|
Length uint16
|
|
MessageType uint32
|
|
}
|
|
|
|
// StreamHeader is a live preview message header
|
|
type StreamHeader struct {
|
|
Magic uint16
|
|
Length uint16
|
|
SequenceNumber uint16
|
|
MessageType uint16
|
|
}
|
|
|
|
// CreatePacket creates a packet ready to be sent to the camera
|
|
func CreatePacket(header Header, payload []byte) []byte {
|
|
header.Length = (uint16)(len(payload))
|
|
|
|
buf := &bytes.Buffer{}
|
|
w := bitio.NewWriter(buf)
|
|
w.WriteBits((uint64)(header.Magic), 16)
|
|
w.WriteBits((uint64)(header.Length), 16)
|
|
w.WriteBits((uint64)(header.MessageType), 32)
|
|
w.Write(payload)
|
|
return buf.Bytes()
|
|
}
|
|
|
|
// CreateCommandHeader prepares a packet header for command packets
|
|
func CreateCommandHeader(command uint32) Header {
|
|
return Header{
|
|
Magic: 0xABCD,
|
|
Length: 0,
|
|
MessageType: command,
|
|
}
|
|
}
|
|
|
|
// CreateLoginPacket creates a Login packet to be sent to the camera
|
|
func CreateLoginPacket(username, password string) []byte {
|
|
header := CreateCommandHeader(0x00000110) // Login
|
|
payload := make([]byte, 128)
|
|
copy(payload, []byte(username))
|
|
copy(payload[64:], []byte(password))
|
|
|
|
return CreatePacket(header, payload)
|
|
}
|
|
|
|
// CreateCommandPacket prepares a command packet to be sent to the camera
|
|
func CreateCommandPacket(command uint32) []byte {
|
|
header := CreateCommandHeader(command)
|
|
return CreatePacket(header, []byte{})
|
|
}
|