Copyright (c) 2014 Benoît Chesneau.
Version: 0.3.0
The rbeacon module implements a peer-to-peer discovery service for local networks. A beacon can broadcast and/or capture service announcements using UDP messages on the local area network. This implementation uses IPv4 UDP broadcasts. You can define the format of your outgoing beacons, and set a filter that validates incoming beacons. Beacons are sent and received asynchronously in the background.
Note: the current implementation is heavily inspired on zbeacon from zeromq.
Look at the rbeacon
module for the API usage.
Note: You can set the interface on which you broadcast using the application environment setting
broadast_if
or the the OS environment variableRBEACON_INTERFACE
.
From the rbeacon_test function:
{ok, Service} = rbeacon:new(9999),
?assert(is_pid(Service)),
ok = rbeacon:set_interval(Service, 100),
ok = rbeacon:publish(Service, <<"announcement">>),
{ok, Client} = rbeacon:new(9999),
ok = rbeacon:subscribe(Client, <<>>),
{ok, Msg, _Addr} = rbeacon:recv(Client),
?assertEqual(Msg, <<"announcement">>),
ok = rbeacon:close(Service),
ok = rbeacon:close(Client),
{ok, Node1} = rbeacon:new(5670),
{ok, Node2} = rbeacon:new(5670),
{ok, Node3} = rbeacon:new(5670),
ok = rbeacon:noecho(Node1),
rbeacon:publish(Node1, <<"Node/1">>),
rbeacon:publish(Node2, <<"Node/2">>),
rbeacon:publish(Node3, <<"GARBAGE">>),
rbeacon:subscribe(Node1, <<"Node">>),
{ok, Msg2, _Addr} = rbeacon:recv(Node1),
?assertEqual(Msg2, <<"Node/2">>),
rbeacon:close(Node1),
rbeacon:close(Node2),
rbeacon:close(Node3).
You can also receive from the beacon as message (from the rbeacon_active_test):
{ok, Service} = rbeacon:new(9999, [active, noecho]),
?assert(is_pid(Service)),
ok = rbeacon:set_interval(Service, 100),
ok = rbeacon:publish(Service, <<"announcement">>),
{ok, Client} = rbeacon:new(9999, [active]),
ok = rbeacon:subscribe(Client, <<>>),
receive
{rbeacon, Client, <<"announcement">>, _Addr} ->
ok
end,
ok = rbeacon:close(Service),
receive
{rbeacon, Service, closed} -> ok
end,
ok = rbeacon:close(Client),
receive
{rbeacon, Client, closed} -> ok
end,
{ok, Node1} = rbeacon:new(5670, [active, noecho]),
{ok, Node2} = rbeacon:new(5670, [active, noecho]),
{ok, Node3} = rbeacon:new(5670, [active, noecho]),
rbeacon:publish(Node1, <<"Node/1">>),
rbeacon:publish(Node2, <<"Node/2">>),
rbeacon:publish(Node3, <<"GARBAGE">>),
rbeacon:subscribe(Node1, <<"Node">>),
Result = loop_sub(Node1, [], 1),
?assert(lists:member(<<"Node/2">>, Result)),
rbeacon:close(Node1),
rbeacon:close(Node2),
rbeacon:close(Node3),
ok.
The contributors are listed in AUTHORS. This project uses the MPL v2 license, see LICENSE.
rbeacon uses the C4.1 (Collective Code Construction Contract) process for contributions.
Under C4.1 process, you are more than welcome to help us by:
To run the test suite: $ rebar eunit
rbeacon |