| | |
| | | package bhomedbapi |
| | | |
| | | import ( |
| | | "basic.com/valib/bhomebus.git" |
| | | "encoding/json" |
| | | "basic.com/valib/c_bhomebus.git/api/bhsgo" |
| | | "basic.com/valib/c_bhomebus.git/proto/source/bhome_msg" |
| | | json "github.com/json-iterator/go" |
| | | "errors" |
| | | "fmt" |
| | | "strconv" |
| | | ) |
| | | |
| | | type SBusClient struct { |
| | | nodes []bhomebus.NetNode |
| | | nodes []*bhome_msg.MsgQueryTopicReply_BHNodeAddress |
| | | } |
| | | |
| | | type ProcInfo struct { |
| | |
| | | Info string `json:"info"` // 进程的描述信息,用于区分同一进程名称下多个进程 |
| | | } |
| | | |
| | | type MsgInfo struct { |
| | | SrcProc ProcInfo `json:"srcProc"` // 源进程基本信息 |
| | | MsgType string `json:"msgType"` // 数据类型,可为请求、发布、订阅、应答等 |
| | | Topic string `json:"topic"` //请求主题 |
| | | Body []byte `json:"body"` //请求内容或者反馈结果 |
| | | } |
| | | |
| | | type request struct { |
| | | type Request struct { |
| | | Path string `json:"path"` |
| | | Method string `json:"method"` |
| | | ContentType string `json:"contentType"` |
| | |
| | | Body []byte `json:"body"` |
| | | } |
| | | |
| | | func (sc SBusClient) DoGetRequest(url string, params map[string]string, headers map[string]string) ([]byte, error) { |
| | | if sc.nodes == nil || len(sc.nodes) == 0 { |
| | | return nil, errors.New("invalid netNodes") |
| | | } |
| | | type reply struct { |
| | | Success bool `json:"success"` |
| | | Msg string `json:"msg"` |
| | | Data interface{} `json:"data"` |
| | | } |
| | | |
| | | req := request { |
| | | func (sc SBusClient) DoGetRequest(url string, params map[string]string, headers map[string]string) ([]byte, error) { |
| | | |
| | | req := Request{ |
| | | Path: url, |
| | | Method: "GET", |
| | | ContentType: CONTENT_TYPE_JSON, |
| | | } |
| | | fillParam(&req, headers, params, nil) |
| | | |
| | | return doReq(req, sc.nodes) |
| | | rb, err := json.Marshal(req) |
| | | if err !=nil { |
| | | return nil,err |
| | | } |
| | | rMsg := bhome_msg.MsgRequestTopic{ |
| | | Topic: []byte(req.Path), |
| | | Data: rb, |
| | | } |
| | | |
| | | return busReq(&rMsg, sc.nodes) |
| | | //return doReq(req, sc.nodes) |
| | | } |
| | | |
| | | func (sc SBusClient) DoPostRequest(url string, contentType string, body map[string]interface{}, params map[string]string, headers map[string]string) ([]byte, error) { |
| | | if sc.nodes == nil || len(sc.nodes) == 0 { |
| | | return nil, errors.New("invalid port") |
| | | } |
| | | req := request { |
| | | |
| | | req := Request{ |
| | | Path: url, |
| | | Method: "POST", |
| | | ContentType: contentType, |
| | |
| | | if contentType == CONTENT_TYPE_FORM || contentType == CONTENT_TYPE_MULFORM { |
| | | if body != nil { |
| | | req.PostFormMap = make(map[string][]string) |
| | | req.FormMap = map[string][]string{} |
| | | for k,v := range body { |
| | | switch v.(type) { |
| | | case string: |
| | |
| | | } |
| | | } |
| | | |
| | | return doReq(req, sc.nodes) |
| | | rb, err := json.Marshal(req) |
| | | if err !=nil { |
| | | return nil,err |
| | | } |
| | | rMsg := bhome_msg.MsgRequestTopic{ |
| | | Topic: []byte(req.Path), |
| | | Data: rb, |
| | | } |
| | | |
| | | return busReq(&rMsg, sc.nodes) |
| | | } |
| | | |
| | | func (sc SBusClient) DoPutRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error) { |
| | | if sc.nodes == nil || len(sc.nodes) == 0 { |
| | | return nil, errors.New("invalid port") |
| | | } |
| | | req := request { |
| | | |
| | | req := Request{ |
| | | Path: url, |
| | | Method: "PUT", |
| | | ContentType: contentType, |
| | | } |
| | | fillParam(&req, headers, nil, body) |
| | | |
| | | return doReq(req, sc.nodes) |
| | | rb, err := json.Marshal(req) |
| | | if err !=nil { |
| | | return nil,err |
| | | } |
| | | rMsg := bhome_msg.MsgRequestTopic{ |
| | | Topic: []byte(req.Path), |
| | | Data: rb, |
| | | } |
| | | |
| | | return busReq(&rMsg, sc.nodes) |
| | | } |
| | | |
| | | func (sc SBusClient) DoDeleteRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error) { |
| | | if sc.nodes == nil || len(sc.nodes) == 0 { |
| | | return nil, errors.New("invalid port") |
| | | } |
| | | req := request { |
| | | |
| | | req := Request{ |
| | | Path: url, |
| | | Method: "DELETE", |
| | | ContentType: contentType, |
| | | } |
| | | fillParam(&req, headers, nil, body) |
| | | |
| | | return doReq(req, sc.nodes) |
| | | rb, err := json.Marshal(req) |
| | | if err !=nil { |
| | | return nil,err |
| | | } |
| | | rMsg := bhome_msg.MsgRequestTopic{ |
| | | Topic: []byte(req.Path), |
| | | Data: rb, |
| | | } |
| | | |
| | | return busReq(&rMsg, sc.nodes) |
| | | } |
| | | |
| | | func fillParam(req *request,headers map[string]string, params map[string]string, body map[string]interface{}) { |
| | | func fillParam(req *Request,headers map[string]string, params map[string]string, body map[string]interface{}) { |
| | | headerMap := make(map[string][]string) |
| | | queryMap := make(map[string][]string) |
| | | if headers != nil { |
| | |
| | | } else { |
| | | req.Body = b |
| | | } |
| | | |
| | | } |
| | | |
| | | func doReq(req request, nodes []bhomebus.NetNode) ([]byte,error) { |
| | | rb, err := json.Marshal(req) |
| | | if err !=nil { |
| | | return nil,err |
| | | /** |
| | | * 新版bhs直接发起请求,不会产生共享内存泄漏的问题? |
| | | */ |
| | | func doReq(req *bhome_msg.MsgRequestTopic, destArr []bhome_msg.BHAddress) ([]byte, error) { |
| | | dest := bhome_msg.BHAddress{} |
| | | if destArr != nil && len(destArr) > 0 { |
| | | dest = destArr[0] |
| | | } |
| | | rMsg := MsgInfo{ |
| | | Topic: req.Path, |
| | | Body: rb, |
| | | } |
| | | data, err := json.Marshal(rMsg) |
| | | if err != nil { |
| | | return nil, err |
| | | } |
| | | s := bhomebus.OpenSocket() |
| | | defer s.Close() |
| | | var ret []bhomebus.Mesg |
| | | if n := s.SendandrecvTimeout(nodes, data, &ret, 5000);n == 0 { //n==0表示没有请求成功 |
| | | return nil, fmt.Errorf("doReq s.SendandrecvTimeout result n:%d", n) |
| | | pid := "" |
| | | r := bhome_msg.MsgRequestTopicReply{} |
| | | if bhsgo.Request(&dest, req, &pid, &r, 5000) { |
| | | return r.Data, nil |
| | | } else { |
| | | if len(ret) > 0 { |
| | | var retMsg MsgInfo |
| | | err = json.Unmarshal(ret[0].Data, &retMsg) |
| | | if err != nil { |
| | | logPrint("doReq unmarshal to MsgInfo err:", err) |
| | | return nil, err |
| | | } |
| | | return retMsg.Body, nil |
| | | } |
| | | return nil, fmt.Errorf("no any response") |
| | | logPrint("bhsgo.Request request err:", r.Errmsg) |
| | | return nil, errors.New("bhsgo.Request return false") |
| | | } |
| | | } |