package service import ( "encoding/json" "strings" "vamicro/config" "basic.com/valib/bhomeclient.git" "basic.com/valib/bhomedbapi.git" "basic.com/valib/go-aiot.git/aiotProto/aiot" "basic.com/valib/logger.git" "gitee.com/LearingIt/goTypeTrans/trans" ) const ( Token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ3NDUwMjU5MjMsInVzZXIiOiJ7XCJpZFwiOlwiZTZjY2QzNmQtNGYxNi00NmZjLTg4ZDUtMDczNjU4NjZkMjA1XCIsXCJwZXJtaXNzaW9uc1wiOltcInByb2R1Y3RNYW5nZTpwdWJsaXNoXCIsXCJjb2RlTWFuZ2U6dmlld1wiLFwiZGV2aWNlTWFuYWdlOmFkZFwiLFwiYWRtaW5NYW5hZ2VcIixcIm9yZGVyTWFuZ2VcIixcImRldmljZU1hbmFnZTp2aWV3XCIsXCJwcm9kdWN0TWFuZ2U6YWRkXCIsXCJhZG1pbk1hbmFnZTp2aWV3XCIsXCJjb2RlTWFuZ2U6YWRkXCIsXCJwcm9kdWN0TWFuZ2U6b2ZmU2FsZVwiLFwib3JkZXJNYW5nZTpjYW5jZWxcIixcInByb2R1Y3RDZW50ZXI6ZG93bmxvYWRcIixcInByb2R1Y3RDZW50ZXI6YnV5XCIsXCJwcm9kdWN0TWFuZ2U6dmlld1wiLFwiYXBpXCIsXCJob21lXCIsXCJvcmRlck1hbmdlOnBheVwiLFwiYWRtaW5NYW5hZ2U6YWRkXCIsXCJvcmRlck1hbmdlOmRvd25sb2FkXCIsXCJwcm9kdWN0Q2VudGVyXCIsXCJkZXZpY2VNYW5hZ2U6dW5iaW5kXCIsXCJvcmRlck1hbmdlOnZpZXdcIixcImFkbWluTWFuYWdlOmVkaXRcIixcImRldmljZU1hbmFnZVwiLFwidmlwTWFuYWdlOmFkZFwiLFwidmlwTWFuYWdlOnZpZXdcIixcInByb2R1Y3RDZW50ZXI6dmlld1wiLFwidmlwTWFuYWdlOmVkaXRcIixcInZpcE1hbmFnZVwiLFwicHJvZHVjdE1hbmdlOmVkaXRcIixcImNvZGVNYW5nZVwiLFwicHJvZHVjdE1hbmdlXCJdLFwidXNlcm5hbWVcIjpcImJhc2ljXCJ9In0.vwjAFkWuEyadRLvIOGK8LFE3MjpY3SQ7j6AlTXnQDG8" ) // string转interface func stringParams2paramsBody(params map[string]string) map[string]interface{} { paramsBody := make(map[string]interface{}) for k, v := range params { paramsBody[k] = v } return paramsBody } // interface转string func interfaceParams2paramsBody(params map[string]interface{}) map[string]string { paramsBody := make(map[string]string) for k, v := range params { paramsBody[k] = trans.Any2String(v) } return paramsBody } // 封装统一请求方法 func DoBusReq(topic string, nodeId string, method aiot.RequestMethod, contentType aiot.RequestContentType, params map[string]interface{}) ([]byte, error) { var err error var data []byte logger.Debug("DoBusReq...", topic, nodeId, method, contentType, GetContentTypeString(contentType), params) switch method { case aiot.RequestMethod_Get: // 发送get请求 return DoGetToBus(nodeId, topic, interfaceParams2paramsBody(params)) case aiot.RequestMethod_Post: // post请求 return DoPostToBus(nodeId, topic, GetContentTypeString(contentType), params) case aiot.RequestMethod_Put: // put return DoPutToBus(nodeId, topic, GetContentTypeString(contentType), params) case aiot.RequestMethod_Delete: // delete return DoDeleteToBus(nodeId, topic, GetContentTypeString(contentType), params) } return data, err } // 获取节点IP func GetNodeIp(nodeId string) (string, error) { client := bhomedbapi.NewClient(bhomedbapi.WithNodes(nil)) params := map[string]interface{}{ "node_id": nodeId, } node, err := client.DoPostRequest("/data/api-v/cluster/findIpByNode", bhomedbapi.CONTENT_TYPE_JSON, params, nil, nil) if err != nil { logger.Error("Fail to execute GetNodeIp", err) return "", err } var ret bhomeclient.Reply err = json.Unmarshal(node, &ret) if err != nil { return "", err } ip := trans.Any2String(ret.Data) if ip != "" && strings.Index(ip, ":") > 0 { return ip[0:strings.Index(ip, ":")], nil } return ip, nil } // bus-get请求 func DoGetToBus(nodeId string, url string, params map[string]string) ([]byte, error) { ip, _ := GetNodeIp(nodeId) header := map[string]string{ "Authorization": Token, } client := bhomedbapi.NewClient(bhomedbapi.WithIp(ip), bhomedbapi.WithDevId(nodeId), bhomedbapi.WithTopic(url)) if client == nil || nodeId != config.Server.AnalyServerId { logger.Warn("client is nil. return from bus to http") client = bhomedbapi.HttpClient{} url = "http://" + ip + ":8888/" + strings.Trim(url, "/") } return client.DoGetRequest(url, params, header) } // bus-post请求 func DoPostToBus(nodeId string, url string, contentType string, params map[string]interface{}) ([]byte, error) { ip, _ := GetNodeIp(nodeId) header := map[string]string{ "Authorization": Token, } client := bhomedbapi.NewClient(bhomedbapi.WithIp(ip), bhomedbapi.WithDevId(nodeId), bhomedbapi.WithTopic(url)) if client == nil || nodeId != config.Server.AnalyServerId { logger.Warn("client is nil. return from bus to http") client = bhomedbapi.HttpClient{} url = "http://" + ip + ":8888/" + strings.Trim(url, "/") } return client.DoPostRequest(url, contentType, params, nil, header) } // bus-put请求 func DoPutToBus(nodeId string, url string, contentType string, params map[string]interface{}) ([]byte, error) { ip, _ := GetNodeIp(nodeId) header := map[string]string{ "Authorization": Token, } client := bhomedbapi.NewClient(bhomedbapi.WithIp(ip), bhomedbapi.WithDevId(nodeId), bhomedbapi.WithTopic(url)) if client == nil || nodeId != config.Server.AnalyServerId { logger.Warn("client is nil. return from bus to http") client = bhomedbapi.HttpClient{} url = "http://" + ip + ":8888/" + strings.Trim(url, "/") } return client.DoPutRequest(url, contentType, params, header) } // bus-delete请求 func DoDeleteToBus(nodeId string, url string, contentType string, params map[string]interface{}) ([]byte, error) { ip, _ := GetNodeIp(nodeId) header := map[string]string{ "Authorization": Token, } client := bhomedbapi.NewClient(bhomedbapi.WithIp(ip), bhomedbapi.WithDevId(nodeId), bhomedbapi.WithTopic(url)) if client == nil || nodeId != config.Server.AnalyServerId { logger.Warn("client is nil. return from bus to http") client = bhomedbapi.HttpClient{} url = "http://" + ip + ":8888/" + strings.Trim(url, "/") } return client.DoDeleteRequest(url, contentType, params, header) }