Packages

An Elixir library (driver) for clients communicating with MQTT brokers(via the MQTT 3.1.1 protocol).

Current section

7 Versions

Jump to

Compare versions

8 files changed
+81 additions
-16 deletions
  @@ -80,6 +80,8 @@ documentation for now. This shall be improved over time.
80 80 ## Contributing
81 81
82 82 Pull requests with appropriate tests and improvements are welcome.
83 + Mosquitto is currently used by the author to test the library. Please
84 + take a look at the Makefile to run tests.
83 85
84 86 ## Naming
  @@ -1,7 +1,7 @@
1 1 {<<"app">>,<<"hulaaki">>}.
2 2 {<<"build_tools">>,[<<"mix">>]}.
3 3 {<<"contributors">>,[<<"Suvash Thapaliya">>]}.
4 - {<<"description">>,<<"An MQTT 3.1.1 client library written in Elixir.\n">>}.
4 + {<<"description">>,<<"An MQTT 3.1.1 client library written in Elixir.">>}.
5 5 {<<"elixir">>,<<"~> 1.0">>}.
6 6 {<<"files">>,
7 7 [<<"lib/hulaaki.ex">>,<<"lib/hulaaki/client.ex">>,
  @@ -12,4 +12,4 @@
12 12 {<<"links">>,[{<<"github">>,<<"https://github.com/suvash/hulaaki">>}]}.
13 13 {<<"name">>,<<"hulaaki">>}.
14 14 {<<"requirements">>,[]}.
15 - {<<"version">>,<<"0.0.1">>}.
15 + {<<"version">>,<<"0.0.2">>}.
  @@ -80,14 +80,20 @@ defmodule Hulaaki.Client do
80 80 end
81 81
82 82 def handle_call({:publish, opts}, _from, state) do
83 - id = opts |> Keyword.fetch! :id
84 83 topic = opts |> Keyword.fetch! :topic
85 84 msg = opts |> Keyword.fetch! :message
86 85 dup = opts |> Keyword.fetch! :dup
87 86 qos = opts |> Keyword.fetch! :qos
88 87 retain = opts |> Keyword.fetch! :retain
89 88
90 - message = Message.publish(id, topic, msg, dup, qos, retain)
89 + message =
90 + case qos do
91 + 0 ->
92 + Message.publish(topic, msg, dup, qos, retain)
93 + _ ->
94 + id = opts |> Keyword.fetch! :id
95 + Message.publish(id, topic, msg, dup, qos, retain)
96 + end
91 97
92 98 :ok = state.connection |> Connection.publish message
93 99 {:reply, :ok, state}
  @@ -139,9 +145,22 @@ defmodule Hulaaki.Client do
139 145 {:noreply, state}
140 146 end
141 147
142 - def handle_info({:received, %Message.Publish{} = message}, state) do
148 + def handle_info({:received, %Message.Publish{qos: qos} = message}, state) do
143 149 on_subscribed_publish [message: message, state: state]
144 - # needs to reply with publish ack ?
150 +
151 + case qos do
152 + 1 ->
153 + message = Message.publish_ack message.id
154 + :ok = state.connection |> Connection.publish_ack message
155 + _ ->
156 + # unsure about supporting qos 2 yet
157 + end
158 +
159 + {:noreply, state}
160 + end
161 +
162 + def handle_info({:sent, %Message.PubAck{} = message}, state) do
163 + on_subscribed_publish_ack [message: message, state: state]
145 164 {:noreply, state}
146 165 end
147 166
  @@ -218,6 +237,7 @@ defmodule Hulaaki.Client do
218 237 def on_unsubscribe([message: message, state: state]), do: true
219 238 def on_unsubscribe_ack([message: message, state: state]), do: true
220 239 def on_subscribed_publish([message: message, state: state]), do: true
240 + def on_subscribed_publish_ack([message: message, state: state]), do: true
221 241 def on_ping([message: message, state: state]), do: true
222 242 def on_pong([message: message, state: state]), do: true
223 243 def on_disconnect([message: message, state: state]), do: true
  @@ -228,7 +248,7 @@ defmodule Hulaaki.Client do
228 248 on_publish_complete: 1,
229 249 on_subscribe: 1, on_subscribe_ack: 1,
230 250 on_unsubscribe: 1, on_unsubscribe_ack: 1,
231 - on_subscribed_publish: 1,
251 + on_subscribed_publish: 1, on_subscribed_publish_ack: 1,
232 252 on_ping: 1, on_pong: 1,
233 253 on_disconnect: 1]
234 254 end
  @@ -30,6 +30,13 @@ defmodule Hulaaki.Connection do
30 30 GenServer.call(pid, {:publish, message})
31 31 end
32 32
33 + @doc """
34 + Sends a Publish Ack message over the connection
35 + """
36 + def publish_ack(pid, %Message.PubAck{} = message) do
37 + GenServer.call(pid, {:publish_ack, message})
38 + end
39 +
33 40 @doc """
34 41 Sends a Publish release message over the connection
35 42 """
  @@ -97,9 +97,21 @@ defmodule Hulaaki.Decoder do
97 97 <<message_bytes::bytes-size(length), remainder::binary>> = from_third_byte
98 98
99 99 {topic, rest} = extract_topic(message_bytes)
100 - <<id::size(16), message::binary>> = rest
100 + {id, message} =
101 + case qos do
102 + 0 ->
103 + {nil, rest}
104 + _ ->
105 + <<id2::size(16), message2::binary>> = rest
106 + {id2, message2}
107 + end
101 108
102 - message = Message.publish(id, topic, message, dup, qos, retain)
109 +
110 + message =
111 + case qos do
112 + 0 -> Message.publish(topic, message, dup, qos, retain)
113 + _ -> Message.publish(id, topic, message, dup, qos, retain)
114 + end
103 115 %{message: message, remainder: remainder}
104 116 end
Loading more files…