From 015c1a5d8b803dbd867f31426dd1391cd51b0ee3 Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期二, 08 三月 2022 14:25:26 +0800
Subject: [PATCH] NewClient add Remote call options

---
 client.go        |   10 +++-
 clientFactory.go |   62 ++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 4 deletions(-)

diff --git a/client.go b/client.go
index ecda831..d7824d5 100644
--- a/client.go
+++ b/client.go
@@ -48,10 +48,14 @@
 	return nil
 }
 
+var n_getNetNode = func(topic string) []*bhome_msg.MsgQueryTopicReply_BHNodeAddress{
+	return nil
+}
+
 func InitGetNetNode(fn func(name string)[]*bhome_msg.MsgQueryTopicReply_BHNodeAddress) {
-	//if fn != nil {
-	//	getNetNode = fn
-	//}
+	if fn != nil {
+		n_getNetNode = fn
+	}
 }
 
 var busReq = func(req *bhome_msg.MsgRequestTopic,dest []*bhome_msg.MsgQueryTopicReply_BHNodeAddress) ([]byte, error) {
diff --git a/clientFactory.go b/clientFactory.go
index 8e190b6..5120fba 100644
--- a/clientFactory.go
+++ b/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
 }
\ No newline at end of file

--
Gitblit v1.8.0