-
Notifications
You must be signed in to change notification settings - Fork 54
/
client_options.go
108 lines (95 loc) · 3.56 KB
/
client_options.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/********************************************************************************
* Copyright 2020 Dell Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*******************************************************************************/
package mqtt
import (
"fmt"
"math/rand"
"net/url"
"strconv"
"time"
"github.com/edgexfoundry/go-mod-messaging/v2/internal/pkg"
"github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
)
// MQTTClientConfig contains all the configurations for the MQTT client.
type MQTTClientConfig struct {
BrokerURL string
MQTTClientOptions
}
// ConnectionOptions contains the connection configurations for the MQTT client.
//
// NOTE: The connection properties resides in its own struct in order to avoid the property being loaded in via
// reflection during the load process.
type ConnectionOptions struct {
BrokerURL string
}
// MQTTClientOptions contains the client options which are loaded via reflection
type MQTTClientOptions struct {
// Client Identifiers
Username string
Password string
ClientId string
// Connection information
Qos int
KeepAlive int // Seconds
Retained bool
AutoReconnect bool
ConnectTimeout int // Seconds
pkg.TlsConfigurationOptions
}
// CreateMQTTClientConfiguration constructs a MQTTClientConfig based on the provided MessageBusConfig.
func CreateMQTTClientConfiguration(messageBusConfig types.MessageBusConfig) (MQTTClientConfig, error) {
var brokerUrl string
if !messageBusConfig.PublishHost.IsHostInfoEmpty() {
brokerUrl = messageBusConfig.PublishHost.GetHostURL()
} else if !messageBusConfig.SubscribeHost.IsHostInfoEmpty() {
brokerUrl = messageBusConfig.SubscribeHost.GetHostURL()
} else {
return MQTTClientConfig{}, fmt.Errorf("Specified empty broker info.")
}
_, err := url.Parse(brokerUrl)
if err != nil {
return MQTTClientConfig{}, pkg.NewBrokerURLErr(fmt.Sprintf("Failed to parse broker: %v", err))
}
mqttClientOptions := CreateMQTTClientOptionsWithDefaults()
err = pkg.Load(messageBusConfig.Optional, &mqttClientOptions)
if err != nil {
return MQTTClientConfig{}, err
}
tlsConfig := pkg.TlsConfigurationOptions{}
err = pkg.Load(messageBusConfig.Optional, &tlsConfig)
if err != nil {
return MQTTClientConfig{}, err
}
mqttClientOptions.TlsConfigurationOptions = tlsConfig
return MQTTClientConfig{
BrokerURL: brokerUrl,
MQTTClientOptions: mqttClientOptions,
}, nil
}
// CreateMQTTClientOptionsWithDefaults constructs MQTTClientOptions instance with defaults.
func CreateMQTTClientOptionsWithDefaults() MQTTClientOptions {
randomClientId := strconv.Itoa(rand.New(rand.NewSource(time.Now().UnixNano())).Intn(100000))
return MQTTClientOptions{
Username: "",
Password: "",
// Client ID is required or else can cause unexpected errors. This was observed with Eclipse's Mosquito MQTT server.
ClientId: randomClientId,
Qos: 0,
KeepAlive: 0,
Retained: false,
ConnectTimeout: 5, // 5 seconds
AutoReconnect: false,
TlsConfigurationOptions: pkg.CreateDefaultTlsConfigurationOptions(),
}
}