go语言写的简单的http server以及mqtt client

2020-07-15 17:18:11

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)
}


文章作者:沃航科技

联系我们
地址:武汉市东湖高新开发区光谷总部国际1栋2412室
QQ: 932773931
电话:027-59761089-806
手机:13397158231
邮箱:jevian_ma@worldflying.cn

沃航(武汉)科技股份有限公司版权所有

备案号:鄂ICP备16014230号-1

932773931
13397158231