• Stars
    star
    139
  • Rank 261,497 (Top 6 %)
  • Language
    Lua
  • Created about 13 years ago
  • Updated over 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

MQTT Client library for the Lua language

Lua MQTT client library (version 0.2 2012-06-01)

This project is part of the Aiko Platform

Contents

Introduction ------------ This project provides a client-side (only) implementation of the [MQTT protocol](http://mqtt.org), plus command-line utilities for publishing and subscribing to MQTT topics. Typically, one or more MQTT servers, such as [mosquitto](http://mosquitto.org) or [rsmb](http://www.alphaworks.ibm.com/tech/rsmb) will be running on host systems, with which the Lua MQTT client can interact.

MQTT stands for "Message Queue Telemetry Transport", a protocol authored by Dr. Andy Stanford-Clark and Arlen Nipper. The protocol is a message-based, publish/subscribe transport layer, which is optimized for simple telemetry applications running on small micro-controllers, such as an Arduino, over low-bandwidth connections. MQTT libraries exist for most popular programming languages, so you can utilize MQTT on whatever server or device that you require.

The Lua MQTT client library implements the client-side subset of the MQTT protocol specification 3.1.

Lua MQTT overview

A good use-case for this library is running on constrained systems, such as OpenWRT, and acting as a gateway between non-MQTT clients and MQTT servers. The Aiko Platform uses this approach for aggregating non-TCP/IP devices and forwarding messages onto TCP/IP networks. An advantage of using Lua is that only a text editor is required for rapid development of simple MQTT client applications on platforms such as OpenWRT. In constrast, working with the C programming language would comparatively require more effort, due to requiring a cross-platform development environment.

The Lua MQTT client library also runs (unmodified) on a Sony PlayStation Portable using the Lua Player HM (which requires your PSP to be able to run unsigned executables).

PlayStation Portable

Protocol implementation and restrictions ---------------------------------------- - Always assumes MQTT connection "clean session" enabled. - Supports connection last will and testament message. - Does not support connection username and password. - Fixed message header byte 1, only implements the "message type". - Only supports QOS (Quality Of Service) level 0. - Maximum payload length is 127 bytes (easily increased). - Publish message doesn't support "message identifier". - Subscribe acknowledgement messages don't check granted QOS level. - Outstanding subscribe acknowledgement messages aren't escalated. - Works on the Sony PlayStation Portable, using [Lua Player HM](http://en.wikipedia.org/wiki/Lua_Player_HM). Download -------- The Lua MQTT client library is cross-platform and should work on any platform that supports the Lua programming language and network sockets. Feedback and issues ------------------- Tracking is managed via GitHub ... Installation ------------ You may choose to install an MQTT server either on the same or a different system from the Lua MQTT client library, depending upon your deployment scenario.

You can also install the Lua MQTT client library as part of the Aiko Platform run-time environment

Prerequisites ...

On Linux, Lua and LuaRocks can be installed via your Linux distribution package manager. On Mac OS X, Lua and LuaRocks can be installed viarDarwin ports. After that, LuaSocket and PenLight can be installed via LuaRocks.

Lua MQTT client library as a LuaRock ...

  • luarocks --from=server install mqtt

Lua MQTT client library (source code) from GitHub ...

  • TODO
Usage ----- The Lua MQTT client library comes with three command line utilites, which are useful for testing the library and acting as example code. These utilities require that Lua Penlight has been installed.

mqtt_test: Test publish and receive messages on different topics

This command periodically publishes a message on topic "test/1" and subscribes to the topic "test/2". The command exits when the message "quit" is published on topic "test/2".

  cd $(LUA_MQTT_LIB)              // where Lua MQTT library is installed
  example/mqtt_test -d localhost  // Assume MQTT server is on "localhost"

  -d,--debug                       Verbose console logging
  -i,--id     (default MQTT test)  MQTT client identifier
  -p,--port   (default 1883)       MQTT server port number
  <host>      (default localhost)  MQTT server hostname

mqtt_publish: Publish a single message to a specified topic

This command publishes a single message and then exits.

  example/mqtt_publish -d -t test/1 -m "Test message"

Only the --topic and --message parameters are required.

  -d,--debug                               Verbose console logging
  -H,--host         (default localhost)    MQTT server hostname
  -i,--id           (default MQTT client)  MQTT client identifier
  -m,--message      (string)               Message to be published
  -p,--port         (default 1883)         MQTT server port number
  -t,--topic        (string)               Topic on which to publish
  -w,--will_message                        Last will and testament message
  -w,--will_qos     (default 0)            Last will and testament QOS
  -w,--will_retain  (default 0)            Last will and testament retention
  -w,--will_topic                          Last will and testament topic

mqtt_subscribe: Subscribe to a topic

This command subscribes to a topic and listens indefinitely for messages. Use ^C (or similar) to stop execution.

  example/mqtt_subscribe -d -t test/1

Only the --topic parameter is required.

  -d,--debug                               Verbose console logging
  -H,--host         (default localhost)    MQTT server hostname
  -i,--id           (default MQTT client)  MQTT client identifier
  -k,--keepalive    (default 60)           Send MQTT PING period (seconds)
  -p,--port         (default 1883)         MQTT server port number
  -t,--topic        (string)               Subscription topic
  -w,--will_message                        Last will and testament message
  -w,--will_qos     (default 0)            Last will and testament QOS
  -w,--will_retain  (default 0)            Last will and testament retention
  -w,--will_topic                          Last will and testament topic
Example code ------------ The complete functioning code can be viewed here ... [mqtt_lua/lua/example/mqtt\_test.lua](https://github.com/geekscape/mqtt_lua/blob/master/lua/example/mqtt_test.lua)
-- Define a function which is called by mqtt_client:handler(),
-- whenever messages are received on the subscribed topics

  function callback(topic, message)
    print("Received: " .. topic .. ": " .. message)
    if (message == "quit") then running = false end
  end

-- Create an MQTT client instance, connect to the MQTT server and
-- subscribe to the topic called "test/2"

  MQTT = require("mqtt_library")
  MQTT.Utility.set_debug(true)
  mqtt_client = MQTT.client.create("localhost", nil, callback)
  mqtt_client:connect("lua mqtt client"))
  mqtt_client:subscribe({"test/2"})

-- Continously invoke mqtt_client:handler() to process the MQTT protocol and
-- handle any received messages.  Also, publish a message on topic "test/1"

  running = true

  while (running) do
    mqtt_client:handler()
    mqtt_client:publish("test/1", "test message")
    socket.sleep(1.0)  -- seconds
  end

-- Clean-up by unsubscribing from the topic and closing the MQTT connection

  mqtt_client:unsubscribe({"test/2"})
  mqtt_client:destroy()

There are also a number of Lua MQTT client examples in the example/ directory. They can be run from the lua/ parent directory, as follow ...

  cd mqtt_client/lua
  example/example_00.lua
MQTT client Library API ----------------------- Once the MQTT client library has been included (via _require_), one or more MQTT server connections can be created. Using a server connection, the client may then publish messages directly on a specified topic. Or, subscribe to one or more topics, where received messages are passed to a callback function (defined when creating an MQTT client instance). Finally, the client can unsubscribe from one or more topics and disconnect from the MQTT server.

Use the Lua require statement to load the MQTT client library ...

  MQTT = require("mqtt_library")

MQTT.Utility.set_debug(): Library debug console logging

The following statement enables debug console logging for diagnosis.

  MQTT.Utility.set_debug(true)

MQTT.client.create(): Create an MQTT client instance

Create an MQTT client that will be connected to the specified host.

  mqtt_client = MQTT.client.create(hostname, port, callback)

The hostname must be provided, but both the port and callback function parameters are optional. This function returns an MQTT client instance that must be used for all subsequent MQTT operations for that server connection.

  hostname string:   Host name or address of the MQTT broker
  port     integer:  Port number of the MQTT broker (default: 1883)
  callback function: Invoked when subscribed topic messages received

The callback function is defined as follows ...

  function callback(topic, payload)
  -- application specific code
  end

  topic   -- string: Topic for the received message
  payload -- string: Message data

MQTT.client:destroy(): Destroy an MQTT client instance

When finished with a server connection, this statement cleans-up all resources allocated by the client.

  mqtt_client:destroy()

MQTT.client:connect(): Make a connection to an MQTT server

Before messages can be transmitted, the MQTT client must connect to the server.

  mqtt_client:connect(identifier)

Each individual client connection must use a unique identifier. Only the identifier parameter is required, the remaining parameters are optional.

  mqtt_client:connect(identifier, will_topic, will_qos, will_retain, will_message)

MQTT also provides a "last will and testament" for clients, which is a message automatically sent by the server on behalf of the client, should the connection fail.

  identifier   -- string: MQTT client identifier (maximum 23 characters)
  will_topic   -- string: Last will and testament topic
  will_qos     -- byte:   Last will and testament Quality Of Service
  will_retain  -- byte:   Last will and testament retention status
  will_message -- string: Last will and testament message

MQTT.client:disconnect(): Transmit MQTT Disconnect message

Transmit an MQTT disconnect message to the server.

  mqtt_client:disconnect()

MQTT.client:publish(): Transmit MQTT publish message

Transmit a message on a specified topic.

  mqtt_client:publish(topic, payload)

  topic   -- string: Topic for the published message
  payload -- string: Message data

MQTT.client:subscribe(): Transmit MQTT Subscribe message

Subscribe to one or more topics. Whenever a message is published to one of those topics, the callback function (defined above) will be invoked.

  mqtt_client:subscribe(topics)

  topics -- table of strings, e.g. { "topic1", "topic2" }

MQTT.client:handler(): Handle received messages, maintain keep-alive messages

The handler() function must be called periodically to service incoming messages and to ensure that keep-alive messages (PING) are being sent when required.

The default KEEP_ALIVE_TIME is 60 seconds, therefore handler() must be invoked more often than once per minute.

Should any messages be received on the subscribed topics, then handler() will invoke the callback function (defined above).

  mqtt_client:handler()

MQTT.client:unsubscribe(): Transmit MQTT Unsubscribe message

Unsubscribe from one or more topics, so that messages published to those topics are no longer received.

  topics -- table of strings, e.g. { "topic1", "topic2" }
Known problems -------------- - Occasional "MQTT.client:handler(): Message length mismatch" errors, particularly when subscribed topics are transmitting many messages.
  • Not really a problem, but if you find that the MQTT socket connection is being closed for no apparent reason, particularly for subscribers ... then check that all MQTT clients are using a unique client identifier.

More Repositories

1

aiko_arduino_legacy

Simple framework for allowing Arduino applications / examples / libraries to be built in a modular, event-driven fashion. Aiko enables more events and less delay()s !
C++
156
star
2

nodemcu_esp8266

NodeMCU Lua examples for the ESP8266 Wi-Fi module
Lua
65
star
3

aiko_engine_mp

microPython event based engine supporting network messages (MQTT), times and various hardware drivers
Python
22
star
4

nodebot_ai

Jupyter Notebook
18
star
5

aiko_engine

Embedded Lisp interpreter for distributed message handling
C
10
star
6

aiko_services

Distributed service framework using asynchronous messages supporting IoT, Machine Learning and Video
Python
10
star
7

aiko_mobsendat

Rocket avionics for MobSenDat (Arduino based telemetry board)
Java
8
star
8

aiko_gateway

Simple server for routing and aggregating messages between IP networks and mesh networks for WAN, LAN and PAN.
Lua
6
star
9

Aiko

Original Aiko repository is now broken out into individual projects (see readme.markdown)
4
star
10

aiko_openlab

Educational application with graphical LCD for general purpose input / output, waveform generation and display
Java
4
star
11

Cockatoo

ARDrone Parrot (quadcopter) GUI and proxy-server
Java
4
star
12

aiko_runtime

Various scripts, configuration and other stuff to make a running Aiko environment
Shell
3
star
13

aiko_pebble_v2

Arduino sketch for Pebble v2 Arduino shield hardware
Arduino
3
star
14

aiko_mqtt_lcd

Arduino sketch for LCD shield interacting via MQTT
Arduino
3
star
15

aiko_pebble

Arduino sketch for Pebble Arduino shield hardware
Java
3
star
16

autonomous_vehicle

Self-driving (scale model) car project: Hardware build and software
Python
3
star
17

stk500boot_atmega256rfr2

Changes to the standard STK500 bootloader to support the ATMega256RFR2 (using by the MeshThing).
C
2
star
18

Meemplex

Java
2
star
19

MashQL

Conistent means for accessing open data sets, specifically for Australian GovHack
2
star
20

lifx_c

C implementation of the publicly documented LIFX protocol
C
2
star
21

aiko_thermostat

Thermostat based on Arduino with LCD, thermometer and relay (such as the Pebble V1 shield)
1
star
22

phonegap-test

1
star
23

Cloud9-Test

1
star
24

hackers_cookbook

Open Source Hackers CookBook (OSHCB)
1
star
25

rgb_led

Freetronics RGB LED example code
Arduino
1
star
26

android_service

Java
1
star
27

geekscape.github.com

Geekscape GitHub User web pages
1
star
28

android_ui

Java
1
star
29

k9_arduino

K9: Doctor Who's robotic dog
Arduino
1
star
30

geekscape.github.io

Geekscape web-site
SCSS
1
star