liuxiaolong
2022-03-08 015c1a5d8b803dbd867f31426dd1391cd51b0ee3
clientFactory.go
@@ -5,18 +5,35 @@
)
//Factory new client
/*
   跨机请求时,topic devId ip必须非空
*/
func NewClient(opts ...IOption) Client {
   opt := defaultOption()
   for _,o := range opts {
      o.apply(&opt)
   }
   if opt.ip != "" { //跨机请求
      if opt.topic == "" {
         return nil
      }
      opt.nodes = n_getNetNode(opt.topic)
      if !checkRemoteNetNode(opt.ip, &opt.nodes) {
         return nil
      }
   }
   return &SBusClient{
      nodes: opt.nodes,
   }
}
type Option struct {
   nodes []*bhome_msg.MsgQueryTopicReply_BHNodeAddress
   nodes       []*bhome_msg.MsgQueryTopicReply_BHNodeAddress
   topic       string
   devId       string
   ip            string
   port       int32
}
type IOption interface {
@@ -43,8 +60,51 @@
   })
}
func WithTopic(topic string) IOption {
   return newFuncOption(func(o *Option){
      o.topic = topic
   })
}
func WithIp(ip string) IOption {
   return newFuncOption(func(o *Option) {
      o.ip = ip
   })
}
func WithDevId(devId string) IOption {
   return newFuncOption(func(o *Option) {
      o.devId = devId
   })
}
func WithPort(port int32) IOption {
   return newFuncOption(func(o *Option) {
      o.port = port
   })
}
func defaultOption() Option {
   return Option{
   }
}
func checkRemoteNetNode(rip string, netNode *[]*bhome_msg.MsgQueryTopicReply_BHNodeAddress) bool {
   if netNode == nil || len(*netNode) == 0 {
      return false
   }
   for _,n := range *netNode {
      if n.Addr != nil && string(n.Addr.Ip) == rip && n.Addr.Port >0 {
         *netNode = append([]*bhome_msg.MsgQueryTopicReply_BHNodeAddress{}, &bhome_msg.MsgQueryTopicReply_BHNodeAddress{
            Addr: &bhome_msg.BHAddress{
               Ip: []byte(rip),
               Port: n.Addr.Port,
            },
         })
         return true
      }
   }
   return false
}