package bhomedbapi
|
|
import (
|
"basic.com/valib/c_bhomebus.git/proto/source/bhome_msg"
|
)
|
|
//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)
|
logPrint("NewClient ip:", opt.ip, " topic:", opt.topic, " nodes:", opt.nodes)
|
if !checkRemoteNetNode(opt.ip, &opt.nodes) {
|
return nil
|
}
|
}
|
return &SBusClient{
|
nodes: opt.nodes,
|
}
|
}
|
|
|
type Option struct {
|
nodes []*bhome_msg.MsgQueryTopicReply_BHNodeAddress
|
topic string
|
devId string
|
ip string
|
port int32
|
}
|
|
type IOption interface {
|
apply(*Option)
|
}
|
|
type funcOption struct {
|
f func(*Option)
|
}
|
|
func (fo *funcOption) apply(o *Option) {
|
fo.f(o)
|
}
|
|
func newFuncOption(f func(*Option)) *funcOption {
|
return &funcOption{
|
f:f,
|
}
|
}
|
|
func WithNodes(nodeArr []*bhome_msg.MsgQueryTopicReply_BHNodeAddress) IOption {
|
return newFuncOption(func(o *Option) {
|
o.nodes = nodeArr
|
})
|
}
|
|
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
|
}
|