73 lines
2.2 KiB
Go
73 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
mqtt "github.com/eclipse/paho.mqtt.golang"
|
|
"time"
|
|
"os/exec"
|
|
"os"
|
|
"flag"
|
|
)
|
|
|
|
//mqtt Event listener
|
|
var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
|
|
fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())
|
|
RecievedPayload := string(msg.Payload())
|
|
cmd := exec.Command("ir-ctl","-S" + RecievedPayload)
|
|
out, err := cmd.Output()
|
|
if err != nil {
|
|
fmt.Println("could not run command: ", err)
|
|
}
|
|
fmt.Println("Output: ", string(out))
|
|
}
|
|
|
|
var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
|
|
fmt.Println("Connected")
|
|
}
|
|
|
|
var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
|
|
fmt.Printf("Connect lost: %v", err)
|
|
}
|
|
|
|
func main() {
|
|
//Set variables
|
|
var DeviceName string
|
|
var broker = "192.168.1.4"
|
|
var port = 1883
|
|
var CoreTopic = "KodiIR"
|
|
//Get the hostname as sane default for mqtt topic/device id
|
|
hostname, err := os.Hostname()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
//innput flag -DeviceName
|
|
flag.StringVar(&DeviceName, "DeviceName", hostname, "The name that will be used as the topic an mqtt DeviceID")
|
|
flag.Parse()
|
|
//Set Mqtt Client options
|
|
opts := mqtt.NewClientOptions()
|
|
opts.AddBroker(fmt.Sprintf("tcp://%s:%d", broker, port))
|
|
opts.SetClientID(DeviceName)
|
|
opts.SetDefaultPublishHandler(messagePubHandler)
|
|
opts.SetWill(CoreTopic + "/" + DeviceName + "/status", "Offline", 0, true)
|
|
opts.OnConnect = connectHandler
|
|
opts.OnConnectionLost = connectLostHandler
|
|
|
|
client := mqtt.NewClient(opts)
|
|
if token := client.Connect(); token.Wait() && token.Error() != nil {
|
|
panic(token.Error())
|
|
}
|
|
//Subscribe to command toptic
|
|
client.Subscribe(CoreTopic + "/" + DeviceName + "/cmd", 1, nil).Wait()
|
|
//Publish connect msg
|
|
client.Publish(CoreTopic + "/" + DeviceName + "/status", 0, true, "Online")
|
|
//Print status
|
|
fmt.Printf("Mqtt subscribed")
|
|
//Loop so the program keeps running
|
|
for {
|
|
time.Sleep(time.Hour)
|
|
}
|
|
|
|
//Publish disconnect msg
|
|
client.Publish(CoreTopic + "/" + DeviceName + "/status", 0, true, "Offline")
|
|
client.Disconnect(250)
|
|
} |