public interface IMqttClient
This interface allows applications to utilize all features of the MQTT version 3.1 specification including:
There are two styles of MQTT client, this one and IMqttAsyncClient
.
The non-blocking client can also be used in a blocking form by turning a non-blocking
method into a blocking invocation using the following pattern:
Using the non-blocking client allows an application to use a mixture of blocking and
non-blocking styles. Using the blocking client only allows an application to use one
style. The blocking client provides compatibility with earlier versions
of the MQTT client.
IMqttToken token;
token = asyncClient.method(parms).waitForCompletion();
Modifier and Type | Method and Description |
---|---|
void |
close()
Close the client
Releases all resource associated with the client.
|
void |
connect()
Connects to an MQTT server using the default options.
|
void |
connect(MqttConnectOptions options)
Connects to an MQTT server using the specified options.
|
IMqttToken |
connectWithResult(MqttConnectOptions options)
Connects to an MQTT server using the specified options.
|
void |
disconnect()
Disconnects from the server.
|
void |
disconnect(long quiesceTimeout)
Disconnects from the server.
|
void |
disconnectForcibly()
Disconnects from the server forcibly to reset all the states.
|
void |
disconnectForcibly(long disconnectTimeout)
Disconnects from the server forcibly to reset all the states.
|
void |
disconnectForcibly(long quiesceTimeout,
long disconnectTimeout)
Disconnects from the server forcibly to reset all the states.
|
java.lang.String |
getClientId()
Returns the client ID used by this client.
|
IMqttDeliveryToken[] |
getPendingDeliveryTokens()
Returns the delivery tokens for any outstanding publish operations.
|
java.lang.String |
getServerURI()
Returns the address of the server used by this client, as a URI.
|
MqttTopic |
getTopic(java.lang.String topic)
Get a topic object which can be used to publish messages.
|
boolean |
isConnected()
Determines if this client is currently connected to the server.
|
void |
messageArrivedComplete(int messageId,
int qos)
Indicate that the application has completed processing the message with id messageId.
|
void |
publish(java.lang.String topic,
byte[] payload,
int qos,
boolean retained)
Publishes a message to a topic on the server and return once it is delivered.
|
void |
publish(java.lang.String topic,
MqttMessage message)
Publishes a message to a topic on the server.
|
void |
setCallback(MqttCallback callback)
Sets the callback listener to use for events that happen asynchronously.
|
void |
setManualAcks(boolean manualAcks)
If manualAcks is set to true, then on completion of the messageArrived callback
the MQTT acknowledgements are not sent.
|
void |
subscribe(java.lang.String topicFilter)
Subscribe to a topic, which may include wildcards using a QoS of 1.
|
void |
subscribe(java.lang.String[] topicFilters)
Subscribes to a one or more topics, which may include wildcards using a QoS of 1.
|
void |
subscribe(java.lang.String[] topicFilters,
IMqttMessageListener[] messageListeners)
Subscribes to a one or more topics, which may include wildcards using a QoS of 1.
|
void |
subscribe(java.lang.String[] topicFilters,
int[] qos)
Subscribes to multiple topics, each of which may include wildcards.
|
void |
subscribe(java.lang.String[] topicFilters,
int[] qos,
IMqttMessageListener[] messageListeners)
Subscribes to multiple topics, each of which may include wildcards.
|
void |
subscribe(java.lang.String topicFilter,
IMqttMessageListener messageListener)
Subscribe to a topic, which may include wildcards using a QoS of 1.
|
void |
subscribe(java.lang.String topicFilter,
int qos)
Subscribe to a topic, which may include wildcards.
|
void |
subscribe(java.lang.String topicFilter,
int qos,
IMqttMessageListener messageListener)
Subscribe to a topic, which may include wildcards.
|
void |
unsubscribe(java.lang.String topicFilter)
Requests the server unsubscribe the client from a topic.
|
void |
unsubscribe(java.lang.String[] topicFilters)
Requests the server unsubscribe the client from one or more topics.
|
void connect() throws MqttSecurityException, MqttException
The default options are specified in MqttConnectOptions
class.
MqttSecurityException
- when the server rejects the connect for security
reasonsMqttException
- for non security related problemsconnect(MqttConnectOptions)
void connect(MqttConnectOptions options) throws MqttSecurityException, MqttException
The server to connect to is specified on the constructor.
It is recommended to call setCallback(MqttCallback)
prior to
connecting in order that messages destined for the client can be accepted
as soon as the client is connected.
This is a blocking method that returns once connect completes
options
- a set of connection parameters that override the defaults.MqttSecurityException
- when the server rejects the connect for security
reasonsMqttException
- for non security related problems including communication errorsIMqttToken connectWithResult(MqttConnectOptions options) throws MqttSecurityException, MqttException
The server to connect to is specified on the constructor.
It is recommended to call setCallback(MqttCallback)
prior to
connecting in order that messages destined for the client can be accepted
as soon as the client is connected.
This is a blocking method that returns once connect completes
options
- a set of connection parameters that override the defaults.MqttSecurityException
- when the server rejects the connect for security
reasonsMqttException
- for non security related problems including communication errorsvoid disconnect() throws MqttException
An attempt is made to quiesce the client allowing outstanding
work to complete before disconnecting. It will wait
for a maximum of 30 seconds for work to quiesce before disconnecting.
This method must not be called from inside MqttCallback
methods.
MqttException
disconnect(long)
void disconnect(long quiesceTimeout) throws MqttException
The client will wait for all MqttCallback
methods to
complete. It will then wait for up to the quiesce timeout to allow for
work which has already been initiated to complete - for example, it will
wait for the QoS 2 flows from earlier publications to complete. When work has
completed or after the quiesce timeout, the client will disconnect from
the server. If the cleanSession flag was set to false and is set to false the
next time a connection is made QoS 1 and 2 messages that
were not previously delivered will be delivered.
This is a blocking method that returns once disconnect completes
quiesceTimeout
- the amount of time in milliseconds to allow for
existing work to finish before disconnecting. A value of zero or less
means the client will not quiesce.MqttException
- if a problem is encountered while disconnectingvoid disconnectForcibly() throws MqttException
Because the client is able to establish the TCP/IP connection to a none MQTT server and it will certainly fail to send the disconnect packet. It will wait for a maximum of 30 seconds for work to quiesce before disconnecting and wait for a maximum of 10 seconds for sending the disconnect packet to server.
MqttException
- if any unexpected errorvoid disconnectForcibly(long disconnectTimeout) throws MqttException
Because the client is able to establish the TCP/IP connection to a none MQTT server and it will certainly fail to send the disconnect packet. It will wait for a maximum of 30 seconds for work to quiesce before disconnecting.
disconnectTimeout
- the amount of time in milliseconds to allow send disconnect packet to server.MqttException
- if any unexpected errorvoid disconnectForcibly(long quiesceTimeout, long disconnectTimeout) throws MqttException
Because the client is able to establish the TCP/IP connection to a none MQTT server and it will certainly fail to send the disconnect packet.
quiesceTimeout
- the amount of time in milliseconds to allow for existing work to finish before
disconnecting. A value of zero or less means the client will not quiesce.disconnectTimeout
- the amount of time in milliseconds to allow send disconnect packet to server.MqttException
- if any unexpected errorvoid subscribe(java.lang.String topicFilter) throws MqttException, MqttSecurityException
topicFilter
- the topic to subscribe to, which can include wildcards.MqttException
- if there was an error registering the subscription.MqttSecurityException
subscribe(String[], int[])
void subscribe(java.lang.String[] topicFilters) throws MqttException
topicFilters
- the topic to subscribe to, which can include wildcards.MqttException
- if there was an error registering the subscription.subscribe(String[], int[])
void subscribe(java.lang.String topicFilter, int qos) throws MqttException
topicFilter
- the topic to subscribe to, which can include wildcards.qos
- the maximum quality of service at which to subscribe. Messages
published at a lower quality of service will be received at the published
QoS. Messages published at a higher quality of service will be received using
the QoS specified on the subscribe.MqttException
- if there was an error registering the subscription.subscribe(String[], int[])
void subscribe(java.lang.String[] topicFilters, int[] qos) throws MqttException
The setCallback(MqttCallback)
method
should be called before this method, otherwise any received messages
will be discarded.
If (@link MqttConnectOptions#setCleanSession(boolean)} was set to true when when connecting to the server then the subscription remains in place until either:
If (@link MqttConnectOptions#setCleanSession(boolean)} was set to false when when connecting to the server then the subscription remains in place until either:
The "topic filter" string used when subscribing may contain special characters, which allow you to subscribe to multiple topics at once.
The topic level separator is used to introduce structure into the topic, and can therefore be specified within the topic for that purpose. The multi-level wildcard and single-level wildcard can be used for subscriptions, but they cannot be used within a topic by the publisher of a message.
The number sign (#) is a wildcard character that matches any number of levels within a topic. For example, if you subscribe to finance/stock/ibm/#, you receive messages on these topics:
finance/stock/ibm
finance/stock/ibm/closingprice
finance/stock/ibm/currentprice
The multi-level wildcard can represent zero or more levels. Therefore, finance/# can also match the singular finance, where # represents zero levels. The topic level separator is meaningless in this context, because there are no levels to separate.
The multi-level wildcard can be specified only on its own or next to the topic level separator character. Therefore, # and finance/# are both valid, but finance# is not valid. The multi-level wildcard must be the last character used within the topic tree. For example, finance/# is valid but finance/#/closingprice is not valid.
The plus sign (+) is a wildcard character that matches only one topic level. For example, finance/stock/+ matches finance/stock/ibm and finance/stock/xyz, but not finance/stock/ibm/closingprice. Also, because the single-level wildcard matches only a single level, finance/+ does not match finance.
Use the single-level wildcard at any level in the topic tree, and in conjunction with the multilevel wildcard. Specify the single-level wildcard next to the topic level separator, except when it is specified on its own. Therefore, + and finance/+ are both valid, but finance+ is not valid. The single-level wildcard can be used at the end of the topic tree or within the topic tree. For example, finance/+ and finance/+/ibm are both valid.
This is a blocking method that returns once subscribe completes
topicFilters
- one or more topics to subscribe to, which can include wildcards.qos
- the maximum quality of service to subscribe each topic at.Messages
published at a lower quality of service will be received at the published
QoS. Messages published at a higher quality of service will be received using
the QoS specified on the subscribe.MqttException
- if there was an error registering the subscription.java.lang.IllegalArgumentException
- if the two supplied arrays are not the same size.void subscribe(java.lang.String topicFilter, IMqttMessageListener messageListener) throws MqttException, MqttSecurityException
topicFilter
- the topic to subscribe to, which can include wildcards.messageListener
- a callback to handle incoming messagesMqttException
- if there was an error registering the subscription.MqttSecurityException
subscribe(String[], int[])
void subscribe(java.lang.String[] topicFilters, IMqttMessageListener[] messageListeners) throws MqttException
topicFilters
- the topic to subscribe to, which can include wildcards.messageListeners
- one or more callbacks to handle incoming messagesMqttException
- if there was an error registering the subscription.subscribe(String[], int[])
void subscribe(java.lang.String topicFilter, int qos, IMqttMessageListener messageListener) throws MqttException
topicFilter
- the topic to subscribe to, which can include wildcards.qos
- the maximum quality of service at which to subscribe. Messages
published at a lower quality of service will be received at the published
QoS. Messages published at a higher quality of service will be received using
the QoS specified on the subscribe.messageListener
- a callback to handle incoming messagesMqttException
- if there was an error registering the subscription.subscribe(String[], int[])
void subscribe(java.lang.String[] topicFilters, int[] qos, IMqttMessageListener[] messageListeners) throws MqttException
The setCallback(MqttCallback)
method
should be called before this method, otherwise any received messages
will be discarded.
If (@link MqttConnectOptions#setCleanSession(boolean)} was set to true when when connecting to the server then the subscription remains in place until either:
If (@link MqttConnectOptions#setCleanSession(boolean)} was set to false when when connecting to the server then the subscription remains in place until either:
The "topic filter" string used when subscribing may contain special characters, which allow you to subscribe to multiple topics at once.
The topic level separator is used to introduce structure into the topic, and can therefore be specified within the topic for that purpose. The multi-level wildcard and single-level wildcard can be used for subscriptions, but they cannot be used within a topic by the publisher of a message.
The number sign (#) is a wildcard character that matches any number of levels within a topic. For example, if you subscribe to finance/stock/ibm/#, you receive messages on these topics:
finance/stock/ibm
finance/stock/ibm/closingprice
finance/stock/ibm/currentprice
The multi-level wildcard can represent zero or more levels. Therefore, finance/# can also match the singular finance, where # represents zero levels. The topic level separator is meaningless in this context, because there are no levels to separate.
The multi-level wildcard can be specified only on its own or next to the topic level separator character. Therefore, # and finance/# are both valid, but finance# is not valid. The multi-level wildcard must be the last character used within the topic tree. For example, finance/# is valid but finance/#/closingprice is not valid.
The plus sign (+) is a wildcard character that matches only one topic level. For example, finance/stock/+ matches finance/stock/ibm and finance/stock/xyz, but not finance/stock/ibm/closingprice. Also, because the single-level wildcard matches only a single level, finance/+ does not match finance.
Use the single-level wildcard at any level in the topic tree, and in conjunction with the multilevel wildcard. Specify the single-level wildcard next to the topic level separator, except when it is specified on its own. Therefore, + and finance/+ are both valid, but finance+ is not valid. The single-level wildcard can be used at the end of the topic tree or within the topic tree. For example, finance/+ and finance/+/ibm are both valid.
This is a blocking method that returns once subscribe completes
topicFilters
- one or more topics to subscribe to, which can include wildcards.qos
- the maximum quality of service to subscribe each topic at.Messages
published at a lower quality of service will be received at the published
QoS. Messages published at a higher quality of service will be received using
the QoS specified on the subscribe.messageListeners
- one or more callbacks to handle incoming messagesMqttException
- if there was an error registering the subscription.java.lang.IllegalArgumentException
- if the two supplied arrays are not the same size.void unsubscribe(java.lang.String topicFilter) throws MqttException
topicFilter
- the topic to unsubscribe from. It must match a topicFilter
specified on the subscribe.MqttException
- if there was an error unregistering the subscription.unsubscribe(String[])
void unsubscribe(java.lang.String[] topicFilters) throws MqttException
Unsubcribing is the opposite of subscribing. When the server receives the unsubscribe request it looks to see if it can find a subscription for the client and then removes it. After this point the server will send no more messages to the client for this subscription.
The topic(s) specified on the unsubscribe must match the topic(s) specified in the original subscribe request for the subscribe to succeed
This is a blocking method that returns once unsubscribe completes
topicFilters
- one or more topics to unsubscribe from. Each topicFilter
must match one specified on a subscribeMqttException
- if there was an error unregistering the subscription.void publish(java.lang.String topic, byte[] payload, int qos, boolean retained) throws MqttException, MqttPersistenceException
This is a convenience method, which will
create a new MqttMessage
object with a byte array payload and the
specified QoS, and then publish it. All other values in the
message will be set to the defaults.
topic
- to deliver the message to, for example "finance/stock/ibm".payload
- the byte array to use as the payloadqos
- the Quality of Service to deliver the message at. Valid values are 0, 1 or 2.retained
- whether or not this message should be retained by the server.MqttPersistenceException
- when a problem with storing the messagejava.lang.IllegalArgumentException
- if value of QoS is not 0, 1 or 2.MqttException
- for other errors encountered while publishing the message.
For instance client not connected.publish(String, MqttMessage)
,
MqttMessage.setQos(int)
,
MqttMessage.setRetained(boolean)
void publish(java.lang.String topic, MqttMessage message) throws MqttException, MqttPersistenceException
Delivers a message to the server at the requested quality of service and returns control once the message has been delivered. In the event the connection fails or the client stops, any messages that are in the process of being delivered will be delivered once a connection is re-established to the server on condition that:
In the event that the connection breaks or the client stops it is still possible to determine when the delivery of the message completes. Prior to re-establishing the connection to the server:
setCallback(MqttCallback)
callback on the client and the delivery complete
callback will be notified once a delivery of a message completes
getPendingDeliveryTokens()
which will return a token for each message that
is in-flight. The token can be used to wait for delivery to complete.
When building an application, the design of the topic tree should take into account the following principles of topic name syntax and semantics:
The following principles apply to the construction and content of a topic tree:
This is a blocking method that returns once publish completes
*topic
- to deliver the message to, for example "finance/stock/ibm".message
- to delivery to the serverMqttPersistenceException
- when a problem with storing the messagejava.lang.IllegalArgumentException
- if value of QoS is not 0, 1 or 2.MqttException
- for other errors encountered while publishing the message.
For instance client not connected.void setCallback(MqttCallback callback)
There are a number of events that listener will be notified about. These include
Other events that track the progress of an individual operation such
as connect and subscribe can be tracked using the MqttToken
passed to the
operation
callback
- the class to callback when for events related to the clientMqttCallback
MqttTopic getTopic(java.lang.String topic)
An alternative method that should be used in preference to this one when publishing a message is:
MqttClient.publish(String, MqttMessage)
to publish a message in a blocking manner
IMqttAsyncClient.publish(String, MqttMessage, Object, IMqttActionListener)
When building an application, the design of the topic tree should take into account the following principles of topic name syntax and semantics:
The following principles apply to the construction and content of a topic tree:
topic
- the topic to use, for example "finance/stock/ibm".java.lang.IllegalArgumentException
- if the topic contains a '+' or '#'
wildcard character.boolean isConnected()
true
if connected, false
otherwise.java.lang.String getClientId()
All clients connected to the same server or server farm must have a unique ID.
java.lang.String getServerURI()
The format is the same as specified on the constructor.
MqttAsyncClient.MqttAsyncClient(String, String)
IMqttDeliveryToken[] getPendingDeliveryTokens()
If a client has been restarted and there are messages that were in the
process of being delivered when the client stopped this method will
return a token for each message enabling the delivery to be tracked
Alternately the MqttCallback.deliveryComplete(IMqttDeliveryToken)
callback can be used to track the delivery of outstanding messages.
If a client connects with cleanSession true then there will be no delivery tokens as the cleanSession option deletes all earlier state. For state to be remembered the client must connect with cleanSession set to false
void setManualAcks(boolean manualAcks)
manualAcks
- void messageArrivedComplete(int messageId, int qos) throws MqttException
messageId
- the MQTT message id to be acknowledgedqos
- the MQTT QoS of the message to be acknowledgedMqttException
void close() throws MqttException
MqttException
- if the client is not disconnected.