Skip to content

Commit

Permalink
Modbus TCP: better handling of the protocol identifier.
Browse files Browse the repository at this point in the history
  • Loading branch information
alde103 committed Mar 26, 2024
1 parent 6fa5769 commit fead05e
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 6 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 0.3.13

* Modbus TCP: the protocol identifier other than Modbus (0x00, 0x00) has been relaxed and logged.

## 0.3.12

* Improve bitstring logging.
Expand Down
18 changes: 13 additions & 5 deletions lib/tcp/tcp.ex
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,17 @@ defmodule Modbux.Tcp do
end

@spec unwrap(<<_::48, _::_*8>>, char) :: nil | binary
def unwrap(<<transid::16, 0, 0, size::16, payload::binary>> = msg, transid) do
def unwrap(<<transid::16, protocol_id_h, protocol_id_l, size::16, payload::binary>> = msg, transid) do
r_size = :erlang.byte_size(payload)

check_protocol_identifier(protocol_id_h, protocol_id_l)

data =
if size == r_size do
payload
else
Logger.error(
"#{__MODULE__} size = #{size}, payload_size = #{r_size}, msg = #{inspect(msg, base: :hex)}"
"(#{__MODULE__}) size = #{size}, payload_size = #{r_size}, msg = #{inspect(msg, base: :hex)}"
)

nil
Expand All @@ -70,13 +72,19 @@ defmodule Modbux.Tcp do
end

@spec unwrap(<<_::48, _::_*8>>) :: {binary(), char()}
def unwrap(<<transid::16, 0, 0, size::16, payload::binary>>) do
def unwrap(<<transid::16, protocol_id_h, protocol_id_l, size::16, payload::binary>>) do
^size = :erlang.byte_size(payload)
check_protocol_identifier(protocol_id_h, protocol_id_l)
{payload, transid}
end

def unwrap(inv_data) do
Logger.error("#{__MODULE__} invalid data: #{inspect(inv_data, base: :hex)}")
raise("#{__MODULE__} invalid data: #{inspect(inv_data)}")
Logger.error("(#{__MODULE__}) invalid data: #{inspect(inv_data, base: :hex)}")
raise("(#{__MODULE__}) invalid data: #{inspect(inv_data)}")
end

# Protocol identifier -> MODBUS protocol = 0x00, 0x00
defp check_protocol_identifier(0, 0), do: :ok
defp check_protocol_identifier(protocol_id_h, protocol_id_l),
do: Logger.warning("(#{__MODULE__}) Protocol Identifier: #{inspect(<<protocol_id_h, protocol_id_l>>, base: :hex)}")
end
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
defmodule Modbux.Mixfile do
use Mix.Project

@version "0.3.12"
@version "0.3.13"
@source_url "https://github.com/valiot/modbux"


Expand Down

0 comments on commit fead05e

Please sign in to comment.