代码拉取完成,页面将自动刷新
同步操作将从 赵建辉/rttys 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package main
import (
"context"
"io/ioutil"
"net/http"
"strconv"
"strings"
"sync"
"time"
"github.com/gin-gonic/gin"
"github.com/zhaojh329/rttys/client"
"github.com/zhaojh329/rttys/utils"
jsoniter "github.com/json-iterator/go"
)
const commandTimeout = 30 // second
const (
rttyCmdErrInvalid = 1001
rttyCmdErrOffline = 1002
rttyCmdErrTimeout = 1003
)
var cmdErrMsg = map[int]string{
rttyCmdErrInvalid: "invalid format",
rttyCmdErrOffline: "device offline",
rttyCmdErrTimeout: "timeout",
}
type commandInfo struct {
Cmd string `json:"cmd"`
Username string `json:"username"`
Password string `json:"password"`
}
type commandReq struct {
cancel context.CancelFunc
dev client.Client
c *gin.Context
data []byte
}
var commands sync.Map
func handleCmdResp(br *broker, data []byte) {
token := jsoniter.Get(data, "token").ToString()
if req, ok := commands.Load(token); ok {
req := req.(*commandReq)
req.c.String(http.StatusOK, jsoniter.Get(data, "attrs").ToString())
req.cancel()
}
}
func cmdErrReply(err int, req *commandReq) {
req.c.JSON(http.StatusOK, gin.H{
"err": err,
"msg": cmdErrMsg[err],
})
req.cancel()
}
func handleCmdReq(br *broker, c *gin.Context) {
devid := c.Param("devid")
ctx, cancel := context.WithCancel(context.Background())
req := &commandReq{
cancel: cancel,
c: c,
}
dev, ok := br.devices[devid]
if !ok {
cmdErrReply(rttyCmdErrOffline, req)
return
}
req.dev = dev
content, err := ioutil.ReadAll(c.Request.Body)
if err != nil {
c.Status(http.StatusBadRequest)
return
}
cmdInfo := commandInfo{}
err = jsoniter.Unmarshal(content, &cmdInfo)
if err != nil || cmdInfo.Cmd == "" {
cmdErrReply(rttyCmdErrInvalid, req)
return
}
token := utils.GenUniqueID("cmd")
params := jsoniter.Get(content, "params")
data := make([]string, 5)
data[0] = jsoniter.Get(content, "username").ToString()
data[1] = jsoniter.Get(content, "password").ToString()
data[2] = jsoniter.Get(content, "cmd").ToString()
data[3] = token
data[4] = string(byte(params.Size()))
req.data = []byte(strings.Join(data, string(byte(0))))
for i := 0; i < params.Size(); i++ {
req.data = append(req.data, params.Get(i).ToString()...)
req.data = append(req.data, 0)
}
br.cmdReq <- req
waitTime := commandTimeout
wait := c.Query("wait")
if wait != "" {
waitTime, _ = strconv.Atoi(wait)
}
if waitTime == 0 {
c.Status(http.StatusOK)
return
}
commands.Store(token, req)
if waitTime < 0 || waitTime > commandTimeout {
waitTime = commandTimeout
}
tmr := time.NewTimer(time.Second * time.Duration(waitTime))
select {
case <-tmr.C:
cmdErrReply(rttyCmdErrTimeout, req)
commands.Delete(token)
case <-ctx.Done():
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。