diff --git a/main.go b/main.go index 5877100..d826d0c 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,8 @@ import ( "syscall" "time" + "meshtastic_mqtt_server/mqtpp" + mqtt "github.com/eclipse/paho.mqtt.golang" ) @@ -90,7 +92,7 @@ func parseArgs() (*config, error) { if cfg.qos < 0 || cfg.qos > 2 { return nil, fmt.Errorf("invalid qos %d: must be 0, 1, or 2", cfg.qos) } - key, err := expandPSK(cfg.psk) + key, err := mqtpp.ExpandPSK(cfg.psk) if err != nil { return nil, err } @@ -139,7 +141,7 @@ func run(cfg *config) error { // handleMessage 返回 MQTT 消息回调,把原始 payload 交给 MQTTPP 处理后按类型输出。 func handleMessage(key []byte) mqtt.MessageHandler { return func(_ mqtt.Client, msg mqtt.Message) { - valid, _, decodedJSON := MQTTPP(msg.Topic(), msg.Payload(), key) + valid, _, decodedJSON := mqtpp.MQTTPP(msg.Topic(), msg.Payload(), key) if !valid || len(decodedJSON) == 0 { return } @@ -158,7 +160,7 @@ func handleMessage(key []byte) mqtt.MessageHandler { // printJSON 将记录编码为 JSON 后按数据包类型着色输出。 func printJSON(record map[string]any) { - printJSONBytes(record, mustJSON(record)) + printJSONBytes(record, mqtpp.MustJSON(record)) } // printJSONBytes 使用已编码好的 JSON 文本,并根据记录 type 选择控制台颜色。 diff --git a/mqtpp.go b/mqtpp/mqtpp.go similarity index 98% rename from mqtpp.go rename to mqtpp/mqtpp.go index 5b65245..6273154 100644 --- a/mqtpp.go +++ b/mqtpp/mqtpp.go @@ -1,4 +1,4 @@ -package main +package mqtpp import ( "crypto/aes" @@ -89,17 +89,17 @@ func MQTTPP(topic string, raw []byte, key []byte) (bool, []byte, []byte) { env, err := parseServiceEnvelope(raw) if err != nil { - return true, raw, mustJSON(map[string]any{"topic": topic, "error": "protobuf decode failed: " + err.Error(), "payload_len": len(raw)}) + return true, raw, MustJSON(map[string]any{"topic": topic, "error": "protobuf decode failed: " + err.Error(), "payload_len": len(raw)}) } record, err := describePacket(topic, env, key) if err != nil { - return true, raw, mustJSON(map[string]any{"topic": topic, "error": err.Error(), "payload_len": len(raw)}) + return true, raw, MustJSON(map[string]any{"topic": topic, "error": err.Error(), "payload_len": len(raw)}) } - return true, raw, mustJSON(record) + return true, raw, MustJSON(record) } -// expandPSK 展开 Base64 PSK,兼容 Meshtastic 默认索引 PSK 和短 key 补零规则。 -func expandPSK(pskBase64 string) ([]byte, error) { +// ExpandPSK 展开 Base64 PSK,兼容 Meshtastic 默认索引 PSK 和短 key 补零规则。 +func ExpandPSK(pskBase64 string) ([]byte, error) { psk, err := base64.StdEncoding.DecodeString(pskBase64) if err != nil { return nil, fmt.Errorf("invalid psk: %w", err) @@ -131,8 +131,8 @@ func isCompliantMQTTPacket(_ []byte) bool { return true } -// mustJSON 将记录编码成 JSON;编码失败时返回包含错误信息的 JSON。 -func mustJSON(record map[string]any) []byte { +// MustJSON 将记录编码成 JSON;编码失败时返回包含错误信息的 JSON。 +func MustJSON(record map[string]any) []byte { text, err := json.Marshal(record) if err != nil { text, _ = json.Marshal(map[string]any{"error": err.Error()})