install go2rtc on bob

This commit is contained in:
2026-04-04 19:36:14 +02:00
parent f0b56e63d1
commit ccf88187b8
537 changed files with 69213 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
package mqtt
import (
"bytes"
"encoding/binary"
"errors"
"io"
"net"
"time"
)
const Timeout = time.Second * 5
type Client struct {
conn net.Conn
mid uint16
}
func NewClient(conn net.Conn) *Client {
return &Client{conn: conn, mid: 2}
}
func (c *Client) Connect(clientID, username, password string) (err error) {
if err = c.conn.SetDeadline(time.Now().Add(Timeout)); err != nil {
return
}
msg := NewConnect(clientID, username, password)
if _, err = c.conn.Write(msg.b); err != nil {
return
}
b := make([]byte, 4)
if _, err = io.ReadFull(c.conn, b); err != nil {
return
}
if !bytes.Equal(b, []byte{CONNACK, 2, 0, 0}) {
return errors.New("wrong login")
}
return
}
func (c *Client) Subscribe(topic string) (err error) {
if err = c.conn.SetDeadline(time.Now().Add(Timeout)); err != nil {
return
}
c.mid++
msg := NewSubscribe(c.mid, topic, 1)
_, err = c.conn.Write(msg.b)
return
}
func (c *Client) Publish(topic string, payload []byte) (err error) {
if err = c.conn.SetDeadline(time.Now().Add(Timeout)); err != nil {
return
}
c.mid++
msg := NewPublishQOS1(c.mid, topic, payload)
_, err = c.conn.Write(msg.b)
return
}
func (c *Client) Read() (string, []byte, error) {
if err := c.conn.SetDeadline(time.Now().Add(Timeout)); err != nil {
return "", nil, err
}
b := make([]byte, 1)
if _, err := io.ReadFull(c.conn, b); err != nil {
return "", nil, err
}
size, err := ReadLen(c.conn)
if err != nil {
return "", nil, err
}
b0 := b[0]
b = make([]byte, size)
if _, err = io.ReadFull(c.conn, b); err != nil {
return "", nil, err
}
if b0&0xF0 != PUBLISH {
return "", nil, nil
}
i := binary.BigEndian.Uint16(b)
if uint32(i) > size {
return "", nil, errors.New("wrong topic size")
}
b = b[2:]
if qos := (b0 >> 1) & 0b11; qos == 0 {
return string(b[:i]), b[i:], nil
}
// response with packet ID
_, _ = c.conn.Write([]byte{PUBACK, 2, b[i], b[i+1]})
return string(b[2:i]), b[i+2:], nil
}
func (c *Client) Close() error {
// TODO: Teardown
return c.conn.Close()
}
+122
View File
@@ -0,0 +1,122 @@
package mqtt
import (
"io"
)
type Message struct {
b []byte
}
// https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
const (
CONNECT = 0x10
CONNACK = 0x20
PUBLISH = 0x30
PUBACK = 0x40
SUBSCRIBE = 0x82
SUBACK = 0x90
QOS1 = 0x02
)
func (m *Message) WriteByte(b byte) {
m.b = append(m.b, b)
}
func (m *Message) WriteBytes(b []byte) {
m.b = append(m.b, b...)
}
func (m *Message) WriteUint16(i uint16) {
m.b = append(m.b, byte(i>>8), byte(i))
}
func (m *Message) WriteLen(i int) {
for i > 0 {
b := byte(i % 128)
if i /= 128; i > 0 {
b |= 0x80
}
m.WriteByte(b)
}
}
func (m *Message) WriteString(s string) {
m.WriteUint16(uint16(len(s)))
m.b = append(m.b, s...)
}
func (m *Message) Bytes() []byte {
return m.b
}
const (
flagCleanStart = 0x02
flagUsername = 0x80
flagPassword = 0x40
)
func NewConnect(clientID, username, password string) *Message {
m := &Message{}
m.WriteByte(CONNECT)
m.WriteLen(16 + len(clientID) + len(username) + len(password))
m.WriteString("MQTT")
m.WriteByte(4) // MQTT version
m.WriteByte(flagCleanStart | flagUsername | flagPassword)
m.WriteUint16(30) // keepalive
m.WriteString(clientID)
m.WriteString(username)
m.WriteString(password)
return m
}
func NewSubscribe(mid uint16, topic string, qos byte) *Message {
m := &Message{}
m.WriteByte(SUBSCRIBE)
m.WriteLen(5 + len(topic))
m.WriteUint16(mid)
m.WriteString(topic)
m.WriteByte(qos)
return m
}
func NewPublish(topic string, payload []byte) *Message {
m := &Message{}
m.WriteByte(PUBLISH)
m.WriteLen(2 + len(topic) + len(payload))
m.WriteString(topic)
m.WriteBytes(payload)
return m
}
func NewPublishQOS1(mid uint16, topic string, payload []byte) *Message {
m := &Message{}
m.WriteByte(PUBLISH | QOS1)
m.WriteLen(4 + len(topic) + len(payload))
m.WriteString(topic)
m.WriteUint16(mid)
m.WriteBytes(payload)
return m
}
func ReadLen(r io.Reader) (uint32, error) {
var i uint32
var shift byte
b := []byte{0x80}
for b[0]&0x80 != 0 {
if _, err := r.Read(b); err != nil {
return 0, err
}
i += uint32(b[0]&0x7F) << shift
shift += 7
}
return i, nil
}