func (p *Publish) initConnection() error { p.lg.InfoC("开始组成员建立MQTT数据连接初始化...") ul := len(p.userData) var wgroup sync.WaitGroup wgroup.Add(ul) for i := 0; i < ul; i++ { go func(user config.User) { defer wgroup.Done() clientID := user.UserID opts := MQTT.NewClientOptions() opts.AddBroker(fmt.Sprintf("%s://%s", p.cfg.Network, p.cfg.Address)) opts.SetClientID(clientID) opts.SetStore(MQTT.NewMemoryStore()) opts.SetProtocolVersion(4) opts.SetAutoReconnect(p.cfg.AutoReconnect) if name, pwd := p.cfg.UserName, p.cfg.Password; name != "" && pwd != "" { opts.SetUsername(name) opts.SetPassword(pwd) } if v := p.cfg.KeepAlive; v > 0 { opts.SetKeepAlive(time.Duration(v) * time.Second) } if v := p.cfg.CleanSession; v { opts.SetCleanSession(v) } clientHandle := NewHandleConnect(clientID, p) opts.SetConnectionLostHandler(func(cli *MQTT.Client, err error) { clientHandle.ErrorHandle(err) }) LB_RECONNECT: cli := MQTT.NewClient(opts) connectToken := cli.Connect() if connectToken.Wait() && connectToken.Error() != nil { time.Sleep(time.Millisecond * 100) goto LB_RECONNECT } subTopics := make(map[string]byte) for j := 0; j < len(user.Groups); j++ { topic := "G/" + user.Groups[j] subTopics[topic] = p.cfg.Qos } subToken := cli.SubscribeMultiple(subTopics, func(cli *MQTT.Client, msg MQTT.Message) { clientHandle.Subscribe([]byte(msg.Topic()), msg.Payload()) }) if subToken.Wait() && subToken.Error() != nil { time.Sleep(time.Millisecond * 100) goto LB_RECONNECT } p.clients.Set(clientID, cli) }(p.userData[i]) } wgroup.Wait() p.lg.InfoC("组成员建立MQTT数据连接完成.") return nil }
func (p *Publish) initConnection() error { p.lg.Info("开始建立MQTT数据连接初始化...") var wgroup sync.WaitGroup cl := len(p.clientData) wgroup.Add(cl) for i, l := 0, cl; i < l; i++ { go func(clientInfo config.ClientInfo) { defer wgroup.Done() clientID := clientInfo.ClientID opts := MQTT.NewClientOptions() opts.AddBroker(fmt.Sprintf("%s://%s", p.cfg.Network, p.cfg.Address)) opts.SetClientID(clientID) opts.SetProtocolVersion(4) opts.SetAutoReconnect(p.cfg.AutoReconnect) opts.SetStore(MQTT.NewMemoryStore()) if name, pwd := p.cfg.UserName, p.cfg.Password; name != "" && pwd != "" { opts.SetUsername(name) opts.SetPassword(pwd) } if v := p.cfg.KeepAlive; v > 0 { opts.SetKeepAlive(time.Duration(v) * time.Second) } if v := p.cfg.CleanSession; v { opts.SetCleanSession(v) } clientHandle := NewHandleConnect(clientID, p) opts.SetConnectionLostHandler(func(cli *MQTT.Client, err error) { clientHandle.ErrorHandle(err) }) LB_RECONNECT: cli := MQTT.NewClient(opts) connectToken := cli.Connect() if connectToken.Wait() && connectToken.Error() != nil { // p.lg.Errorf("客户端[%s]建立连接发生异常:%s", clientID, connectToken.Error().Error()) goto LB_RECONNECT } topic := "C/" + clientID subToken := cli.Subscribe(topic, p.cfg.Qos, func(cli *MQTT.Client, msg MQTT.Message) { clientHandle.Subscribe([]byte(msg.Topic()), msg.Payload()) }) if subToken.Wait() && subToken.Error() != nil { // p.lg.Errorf("客户端[%s]订阅主题发生异常:%s", clientID, subToken.Error().Error()) // return goto LB_RECONNECT } p.clients.Set(clientID, cli) }(p.clientData[i]) } wgroup.Wait() p.lg.Info("MQTT数据连接初始化完成.") return nil }