commit 51150666a1b0dcc78e7035b418afba848f666246 Author: Shirou WAKAYAMA Date: Tue Jul 15 12:20:59 2014 +0900 first commit diff --git a/main.go b/main.go new file mode 100644 index 0000000..84d3e59 --- /dev/null +++ b/main.go @@ -0,0 +1,102 @@ +package main + +import ( + "fmt" + "os" + + "github.com/Sirupsen/logrus" + "github.com/codegangsta/cli" +) + +var log = logrus.New() +var usage = ` +Usage here +` + +func initFunc() { + log.Formatter = new(logrus.TextFormatter) + log.Level = logrus.Debug +} + +// connects MQTT broker +func connect(c *cli.Context) (*MQTTClient, error){ + host := c.String("host") + port := c.Int("p") + clientId := c.String("i") + + cafile := c.String("cafile") + scheme := "tcp" + if cafile != "" { + scheme = "ssl" + } + + user := c.String("u") + password := c.String("P") + + brokerUri := fmt.Sprintf("%s://%s:%d", scheme, host, port) + log.Info("Broker URI: %s", brokerUri) + + client := NewMQTTClient() + + log.Debug("Connecting...") + _, err := client.Connect(brokerUri, clientId, user, password) + if err != nil{ + return nil, err + } + log.Debug("Connected") + + return client, nil +} + + +func publish(c *cli.Context) { + client, err := connect(c) + if err != nil{ + log.Error(err) + os.Exit(1) + } + + qos := c.Int("q") + topic := c.String("t") + if topic == "" { + log.Errorf("Please specify topic") + os.Exit(1) + } + log.Infof("Topic: %s", topic) + + payload := c.String("m") + retain := c.Bool("r") + log.Infof("Retain: %t", retain) + + client.Publish(topic, []byte(payload), qos, retain) + + log.Debug("Published") +} + +func main() { + initFunc() + + app := cli.NewApp() + app.Name = "mqttcli" + app.Usage = usage + app.Commands = []cli.Command{ + { + Name: "publish", + Usage: "publish", + Flags: []cli.Flag{ + cli.StringFlag{"host", "test.mosquitto.org", "Broker IP address"}, + cli.IntFlag{"p", 1883, "Broker Port"}, + cli.StringFlag{"t", "", "Topic"}, + cli.IntFlag{"q", 0, "QoS"}, + cli.StringFlag{"cafile", "", "CA file"}, + cli.StringFlag{"u", "", "username"}, + cli.StringFlag{"P", "", "password"}, + cli.StringFlag{"i", "client0", "ClientiId"}, + cli.StringFlag{"m", "test message", "Message body"}, + cli.BoolFlag{"r", "Retain flag"}, + }, + Action: publish, + }, + } + app.Run(os.Args) +} diff --git a/mqtt.go b/mqtt.go new file mode 100644 index 0000000..6bf2961 --- /dev/null +++ b/mqtt.go @@ -0,0 +1,58 @@ +package main + +import ( + MQTT "git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.golang.git" + "crypto/tls" +) + +type MQTTClient struct { + Opts *MQTT.ClientOptions + Client *MQTT.MqttClient +} + +func NewMQTTClient() *MQTTClient { + return &MQTTClient{} +} + +// connect to MQTT broker +func (m *MQTTClient) Connect(brokerUri string, clientId string, + user string, password string) (*MQTT.MqttClient, error) { + + m.Opts = MQTT.NewClientOptions() + + m.Opts.SetBroker(brokerUri) + m.Opts.SetClientId(clientId) + m.Opts.SetTraceLevel(MQTT.Critical) +// m.Opts.SetTraceLevel(MQTT.Verbose) + if user != "" { + m.Opts.SetUsername(user) + } + if password != "" { + m.Opts.SetPassword(password) + } + + insecure := true + if insecure { + tlsConfig := &tls.Config{InsecureSkipVerify: true,} + m.Opts.SetTlsConfig(tlsConfig) + } + + m.Client = MQTT.NewClient(m.Opts) + _, err := m.Client.Start() + if err != nil { + return nil, err + } + return m.Client, nil +} +func (m *MQTTClient) Publish(topic string, payload []byte, qos int, retain bool) error { + mqttmsg := MQTT.NewMessage(payload) + // FIXME: validate qos number + mqttmsg.SetQoS(MQTT.QoS(qos)) + mqttmsg.SetRetainedFlag(retain) + + // receipt := m.Client.PublishMessage(msg.Destination, mqttmsg) + receipt := m.Client.PublishMessage(topic, mqttmsg) + <-receipt + + return nil +}