In my previous post I talked about changing my home automation messaging infrastructure over to MQTT. One of my goals was to also be able to remotely control devices in my house from my phone while I am not in my home. The good news is that this is easily done by setting up a bridge between two brokers. My on-premise broker is configured to connect to the off-premise broker as a bridge. This allows me to publish and subscribe to topics on the off-premise broker which in turn get relayed to the on-premise broker. Well we need to host the off-premise broker somewhere and that somewhere can be an Azure worker role.
Really Small Message Broker (RSMB) for windows is simply a console application that can be launched in a Worker Role. In this blog post I will be showing you how to do just that. One thing to note here is make sure you read the License agreement of RSMB before you use this application for your purposes.
Of course to actually publish this to Azure you will need to have an Azure account but this will also run under the emulator. If you don’t have the tools to build windows azure applications head on over to the Windows Azure Developer portal and check out the .Net section to get the SDK bits. Also the following instructions assume you have downloaded RSMB and installed it onto your windows machine.
Create a new Cloud Windows Azure Project
Once you press the Ok button you will be asked what types of roles you want in the new project. Just select a Worker Role and add it to the solution.
To make things easier rename the role as I have done below.
After selecting the Ok button you need to set up an endpoint for the worker role that will be exposed through the load balancer for clients to connect to. Select the worker role and view the properties of the role. Select the Endpoints tab and add a new endpoint with the following settings:
- Name: WorkerIn
- Protocol: tcp
- Public Port: 1883
Add a new folder under the RSMBWorkerRole project called rsmb
Copy the following RSMB files to the new folder and add them to the RSMBWorkerRole project with Copy to Output Directory set to Copy Always
Add a class level declaration as follows:
Process _program = new Process();
Make sure you have a using statement for system.io at the top of the class.
Add code to the OnStart Method as follows:
public override bool OnStart()
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
string rsbroot = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot") + @"\\", @"approot\\rsmb");
int port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["WorkerIn"].IPEndpoint.Port;
ProcessStartInfo pInfo = new ProcessStartInfo(Path.Combine(rsbroot, @"broker.exe"))
UseShellExecute = false,
WorkingDirectory = rsbroot,
ErrorDialog = false,
CreateNoWindow = true,
_program.StartInfo = pInfo;
You should be able to launch the project under the Azure emulator and then use an MQTT client to connect to a topic like $SYS/# and the client should connect without error and start receiving notifications for the published messages. If you need to setup some additional broker configurations such as the broker.cfg then just add it to the project under the rsmb folder and make sure it is set to copy to the output directory always. You might want to enhance the code in the OnStart method to redirect output of the RSMB console to the azure diagnostics to make troubleshooting issues easier. You also need to setup the on-premise broker to connect to the remote broker as a bridge. The instructions to set up the local broker as a bridge can be found in the README.htm where you installed RSMB.