func SendCommandToDevice(device *models.Device, config *productconfig.ProductConfig, urlparams martini.Params, req *http.Request, r render.Render) { timeout := req.URL.Query().Get("timeout") server.Log.Printf("ACTION SendCommandToDevice, identifier:: %v, request: %v, timeout: %v", device.DeviceIdentifier, req.Body, timeout) var args interface{} decoder := json.NewDecoder(req.Body) err := decoder.Decode(&args) if err != nil { r.JSON(http.StatusOK, renderError(ErrWrongRequestFormat, err)) return } m, ok := args.(map[string]interface{}) if !ok { r.JSON(http.StatusOK, renderError(ErrWrongRequestFormat, err)) return } command, err := config.MapToCommand(m) if err != nil { r.JSON(http.StatusOK, renderError(ErrWrongRequestFormat, err)) return } cmdargs := rpcs.ArgsSendCommand{ DeviceId: uint64(device.ID), SubDevice: uint16(command.Head.SubDeviceid), No: uint16(command.Head.No), WaitTime: uint32(defaultTimeOut), Params: command.Params, } cmdreply := rpcs.ReplySendCommand{} err = server.RPCCallByName("controller", "Controller.SendCommand", cmdargs, &cmdreply) if err != nil { server.Log.Errorf("send devie command error: %v", err) r.JSON(http.StatusOK, renderError(ErrSystemFault, err)) return } r.JSON(http.StatusOK, Common{}) return }