func controlDevice(w rest.ResponseWriter, r *rest.Request) { type ControlParam struct { Token string `json:"token"` Service string `json:"service"` Cmd string `json:"cmd"` } devId := r.PathParam("devid") body := r.Env["body"] if body == nil { rest.Error(w, "Empty body", http.StatusBadRequest) return } b := body.([]byte) param := ControlParam{} if err := json.Unmarshal(b, ¶m); err != nil { log.Warnf("Error decode body: %s", err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } if !checkAuthz(param.Token, devId) { log.Warnf("Auth failed. token: %s, device_id: %s", param.Token, devId) rest.Error(w, "Authorization failed", http.StatusForbidden) return } stats.Cmd(param.Service) resp := cloud.ApiResponse{} result, err := rpcClient.Control(devId, param.Service, param.Cmd) if err != nil { if _, ok := err.(*mq.NoDeviceError); ok { stats.CmdOffline(param.Service) rest.NotFound(w, r) return } else if _, ok := err.(*mq.TimeoutError); ok { stats.CmdTimeout(param.Service) resp.ErrNo = cloud.ERR_CMD_TIMEOUT resp.ErrMsg = fmt.Sprintf("recv response timeout [%s]", devId) } else if _, ok := err.(*mq.InvalidServiceError); ok { stats.CmdInvalidService(param.Service) resp.ErrNo = cloud.ERR_CMD_INVALID_SERVICE resp.ErrMsg = fmt.Sprintf("Device [%s] has no service [%s]", devId, param.Service) } else if _, ok := err.(*mq.SdkError); ok { stats.CmdOtherError(param.Service) resp.ErrNo = cloud.ERR_CMD_SDK_ERROR resp.ErrMsg = fmt.Sprintf("Error when calling service [%s] on [%s]", param.Service, devId) } else { stats.CmdOtherError(param.Service) resp.ErrNo = cloud.ERR_CMD_OTHER resp.ErrMsg = err.Error() } } else { stats.CmdSuccess(param.Service) resp.ErrNo = cloud.ERR_NOERROR resp.Data = result } w.WriteJson(resp) }