Skip to content

elgutierrez/go-mqtt-rpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-mqtt-rpc

Go MQTT RPC using native golang jsonrpc and eclipse MQTT packages

Examples

Server (see full example here)

package main

import (
	"log"
	"github.com/elgutierrez/go-mqtt-rpc"
	mqtt "github.com/eclipse/paho.mqtt.golang"
)

func main() {
	//Get mqtt client instance from somewhere
  mqtt := NewMqttClient()
  config := &mqttRpc.ServerConfig{
    Instance: "device1",
    Prefix: "$rpc",
    QoS: 0,
  }

  errors := make(chan error, 1)
  rpcServer := mqttRpc.NewServer(mqtt, config)
  //Register exposed methods
  rpcServer.Register(new(ServerExposed))
  rpcServer.Start(errors)
}


type PingArgs struct{
}

type PingReply struct{
	Done bool
}

//CLass that exposes the Ping method
type ServerExposed struct{
}

func (r *ServerExposed) Ping(args *PingArgs, reply *PingReply) error{
	log.Println("Received PING request; Sending PONG...")
	reply.Done = true
	return nil
}

Client (see full example here)

package main

import(
	"log"
	"github.com/elgutierrez/go-mqtt-rpc"
	mqtt "github.com/eclipse/paho.mqtt.golang"
)

func main() {
  clientInstance := "client1"
  instanceTo := "device1"
  log.Println("Starting MQTT RPC client: instance", clientInstance, " to ", instanceTo)

  err := doPing(clientInstance, instanceTo)
  if err != nil {
    log.Fatal("Ping error", err)
  }
}

type PingArgs struct{
}

type PingReply struct{
		Done bool
}

func doPing(instance string, instanceTo string) error{
	//Get a connected MQTT client instance from somewhere
  mqtt := NewMqttClient()
  config := &mqttRpc.ClientConfig{
    Instance: instance,
    Prefix: "$rpc",
    QoS: 0,
  }
  rpcClient := mqttRpc.NewClient(mqtt, config)
  
  //Connect to the server instance with a 5000ms timeout
  err := rpcClient.Connect(instanceTo, 5000)
  if err != nil {
    log.Fatal("RPC Cant connect", err)
    return err
  }

  var pingReply PingReply
  log.Println("Calling RemoteRpc.Ping to ", instanceTo)
  //Call the method ServerExposed.Ping with 3000ms timeout
  err = rpcClient.CallTimeout("ServerExposed.Ping", &PingArgs{}, &pingReply, 3000)
  if err != nil {
    log.Fatal("RPC Ping failed", err)
    return err
  }
  log.Println("Received pong ", pingReply)

  return nil
}

Releases

No releases published

Packages

No packages published

Languages