Files
meshtastic_mqtt_server/mqtt_status.go
T
2026-06-05 13:34:54 +08:00

99 lines
3.5 KiB
Go

package main
import (
mqtt "github.com/mochi-mqtt/server/v2"
)
type mqttStatusProvider interface {
Status() adminMqttStatus
}
type mqttRuntimeStatus struct {
server *mqtt.Server
address string
tls bool
stats *meshtasticMessageStats
dbQueue *dbWriteQueue
}
type adminMqttStatus struct {
Running bool `json:"running"`
Address string `json:"address"`
TLS bool `json:"tls"`
Version string `json:"version"`
Started int64 `json:"started"`
Uptime int64 `json:"uptime"`
BytesReceived int64 `json:"bytes_received"`
BytesSent int64 `json:"bytes_sent"`
ClientsConnected int64 `json:"clients_connected"`
ClientsDisconnected int64 `json:"clients_disconnected"`
ClientsMaximum int64 `json:"clients_maximum"`
ClientsTotal int64 `json:"clients_total"`
MessagesReceived int64 `json:"messages_received"`
MessagesSent int64 `json:"messages_sent"`
MessagesDropped int64 `json:"messages_dropped"`
DBWriteQueueLength int `json:"db_write_queue_length"`
Retained int64 `json:"retained"`
Inflight int64 `json:"inflight"`
InflightDropped int64 `json:"inflight_dropped"`
Subscriptions int64 `json:"subscriptions"`
PacketsReceived int64 `json:"packets_received"`
PacketsSent int64 `json:"packets_sent"`
Clients []adminMqttClient `json:"clients"`
}
type adminMqttClient struct {
ClientID string `json:"client_id"`
Username string `json:"username"`
Listener string `json:"listener"`
RemoteAddr string `json:"remote_addr"`
RemoteHost string `json:"remote_host"`
RemotePort string `json:"remote_port"`
}
func (m mqttRuntimeStatus) Status() adminMqttStatus {
if m.server == nil || m.server.Info == nil {
return adminMqttStatus{Running: false, Address: m.address, TLS: m.tls, DBWriteQueueLength: m.dbQueue.Len()}
}
info := m.server.Info.Clone()
status := adminMqttStatus{
Running: true,
Address: m.address,
TLS: m.tls,
Version: info.Version,
Started: info.Started,
Uptime: info.Uptime,
BytesReceived: info.BytesReceived,
BytesSent: info.BytesSent,
ClientsConnected: info.ClientsConnected,
ClientsDisconnected: info.ClientsDisconnected,
ClientsMaximum: info.ClientsMaximum,
ClientsTotal: info.ClientsTotal,
MessagesReceived: info.MessagesReceived,
MessagesSent: m.stats.Forwarded(),
MessagesDropped: m.stats.Dropped(),
DBWriteQueueLength: m.dbQueue.Len(),
Retained: info.Retained,
Inflight: info.Inflight,
InflightDropped: info.InflightDropped,
Subscriptions: info.Subscriptions,
PacketsReceived: info.PacketsReceived,
PacketsSent: info.PacketsSent,
}
for _, client := range m.server.Clients.GetAll() {
if client == nil || client.Closed() {
continue
}
clientInfo := mqttClientInfoFromClient(client)
status.Clients = append(status.Clients, adminMqttClient{
ClientID: clientInfo.ClientID,
Username: clientInfo.Username,
Listener: clientInfo.Listener,
RemoteAddr: clientInfo.RemoteAddr,
RemoteHost: clientInfo.RemoteHost,
RemotePort: clientInfo.RemotePort,
})
}
return status
}