go语言实现的简单的http server以及基于phao的mqtt client。记录一下,方便以后直接使用。
package main import ( "log" "net/http" "encoding/json" "io/ioutil" "os/exec" MQTT "github.com/eclipse/paho.mqtt.golang" ) func main() { log.SetFlags(log.LstdFlags|log.Lshortfile) opts := MQTT.NewClientOptions().AddBroker("tcp://192.168.86.247:1883") opts.SetClientID("go-simple") opts.SetUsername("admin") opts.SetPassword("worldflying2016") opts.SetWill("devicewill", "device disconnect", 0, false) opts.SetDefaultPublishHandler(func (client MQTT.Client, msg MQTT.Message) { log.Printf("TOPIC: %s\n", msg.Topic()) var obj map[string]string err := json.Unmarshal(msg.Payload(), &obj) if err != nil { log.Printf("json parse fail", err) return } if obj["act"] == "/api/runcmd" { log.Printf("cmd: " + obj["cmd"]) cmd := exec.Command("sh", "-c", obj["cmd"]) err = cmd.Start() if err != nil { log.Printf("cmd Start fail", err) return } go cmd.Wait() } else { log.Printf("unknown api\n") } }) c := MQTT.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() != nil { // 连接并等待连接成功 panic(token.Error()) } if token := c.Subscribe("presence", 0, nil); token.Wait() && token.Error() != nil { // 订阅并等待订阅成功 panic(token.Error()) } http.HandleFunc("/api/runcmd", func (w http.ResponseWriter, r *http.Request) { body, _ := ioutil.ReadAll(r.Body) cmd := exec.Command("sh", "-c", string(body)) err := cmd.Start() if err != nil { log.Printf("cmd Start fail", err) } else { go cmd.Wait() } go cmd.Wait() w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "text/plain") w.Write([]byte("{\"errcode\":0}")) }) http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "text/plain") w.Write([]byte("{\"errcode\":-99,\"errmsg\":\"unknown api\"}")) }) http.ListenAndServe(":80", nil) }
文章作者:沃航科技