Current section
7 Versions
Jump to
Current section
7 Versions
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…