Editing Zeromq package

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 5: Line 5:
== package requirements ==
== package requirements ==


The {{Forge|zeromq}} package requires the [http://zeromq.org/ ZeroMQ] libraries and include files to be installed in order to compile.
The {{Forge|zeromq}} package requires the zeromq libraries and include files to be installed in order to compile.


for fedora: yum install zeromq-devel
for fedora: yum install zeromq-devel
for ubuntu: apt install libzmq-dev
for ubuntu: apt install libzmq-dev


== octave installation ==
== octave installation ==


With the [http://zeromq.org/ ZeroMQ] library installed, from octave commmand line:
With the ZeroMQ library installed, from octave commmand line:


  >> pkg install -forge zeromq
  >> pkg install -forge zeromq
= Using it =


Load it before any usage:
Load it before any usage:
Line 23: Line 20:
  >> pkg load zeromq
  >> pkg load zeromq


Look at the quick reference for the package:
  >> help zeromq
== Differences between C and Octave bindings ==
The Octave binding is a subset of the C binding of the ZeroMQ library.
Major differences are:
1. The octave binding creates a single zeromq context that is used for all zeromq sockets. In the C bindings, the programmer must create a context and use it during socket creation.
2. only limited zmq_getsockopt and zmq_setsockopt is currently implemented.
3. functions mostly return true or false for whether they succeeded or failed. In the C binding, 0 signified success.
== The functions ==
iszmq
          Determine whether H is a zeromq socket object.
zmq_bind
          Bind a zeromq socket to a endpoint.
zmq_close
          Close a zeromq socket.
zmq_connect
          Connect a zeromq socket to a endpoint
zmq_curve_keypair
          Generate a random private/public keypair
zmq_curve_public
          Derive the public key from a private key
zmq_disconnect
          Disconnect a zeromq socket from an endpoint.
zmq_errno
          Get system errno value.
zmq_getsockopt
          Get current value of a zeromq socket option.
zmq_has
          Check if the zmq library supports a given feature.
zmq_poll
          Poll a socket or sockets for a timeout or incoming data
          available.
zmq_recv
          Attempt to read data from a zeromq socket.
zmq_send
          Attempt to send data from a zeromq socket.
zmq_setsockopt
          Set a zeromq socket option.
zmq_socket
          Create a zeromq socket.
zmq_strerror
          Get the last zmq error string.
zmq_unbind
          Unbind a previously bound zeromq socket.
zmq_version
          Get the zeromq library version numbers.
zmq_z85_decode
          Decode a z85 encoded string to a binary key.
zmq_z85_encode
          Encode a binary key as Z85 printable text.
= Examples =
The zeromq package comes with a number of examples included in it. They can be opened in octave using:
  >> edit examples/zmq_example1.m
== basic request/reply pattern ==
Example based on client/server example from [http://zguide.zeromq.org/page:all#Ask-and-Ye-Shall-Receive http://zguide.zeromq.org/page:all#Ask-and-Ye-Shall-Receive]
The client sends a "Hello" to the server which responds back "World". No error checking or data validation is done in the example.
{{Code|Server code|<syntaxhighlight lang="octave" style="font-size:13px">
% zeromq package must be installed and loaded to work
pkg load zeromq
% dont buffer output
more off
printf ("Creating hello world server...\n");
% create reply socket, and bind it to port 5555
sock = zmq_socket (ZMQ_REP);
zmq_bind (sock, "tcp://*:5555");
 
printf ("Waiting for clients ...\n");
 
% loop forever, waiting for client requests and responding back 
while (true)
  recievedata = zmq_recv (sock, 10, 0);
  printf ("Received Hello\n");
  zmq_send (sock, "World", 5, 0);
endwhile
</syntaxhighlight>}}
{{Code|Client code|<syntaxhighlight lang="octave" style="font-size:13px">
% zeromq package must be installed and loaded to work
pkg load zeromq
% dont buffer output
more off
printf ("Connecting to hello world server...\n");
% Create socket and connect to server
sock = zmq_socket (ZMQ_REQ);
zmq_connect (sock, "tcp://localhost:5555");
for request_nbr = [1:10]
  printf ("Sending Hello %d...\n", request_nbr);
  zmq_send (sock, uint8("Hello"), 5, 0);
 
  % try to read up to 10 bytes of reply data.
  printf ("Waiting for server response %d... (Ctrl-C to exit)\n", request_nbr);
  recieved = zmq_recv (sock, 10, 0);
  printf ("Received World %d\n", request_nbr);
endfor
   
zmq_close (sock);
</syntaxhighlight>}}
== basic publish/subscribe pattern ==
Example based on client/server example from [http://zguide.zeromq.org/page:all#Getting-the-Message-Out http://zguide.zeromq.org/page:all#Getting-the-Message-Out]
The server pushes 'weather updates' for random zipcodes. The client subscribes to the server just for zipcode 10001.
{{Code|Server code|<syntaxhighlight lang="octave" style="font-size:13px">
% zeromq package must be installed and loaded to work
pkg load zeromq
% dont buffer output
more off
publisher = zmq_socket (ZMQ_PUB);
rc = zmq_bind (publisher, "tcp://*:5556");
assert (rc);
while (true)
  %  Get values that will fool the boss
  zipcode    = 10000 + randi (20);
  temperature = randi (215) - 80;
  relhumidity = randi (50) + 10;
  %  Send message to all subscribers
  update = sprintf ("%05d %d %d", zipcode, temperature, relhumidity);
 
  zmq_send (publisher, update);
endwhile
zmq_close (publisher);
</syntaxhighlight>}}
{{Code|Client code|<syntaxhighlight lang="octave" style="font-size:13px">
% zeromq package must be installed and loaded to work
pkg load zeromq
% dont buffer output
more off
subscriber = zmq_socket (ZMQ_SUB);
rc = zmq_connect (subscriber, "tcp://localhost:5556");
assert (rc);
%  Subscribe to zipcode, default is NYC, 10001
zipfilter = "10001 ";
rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, zipfilter);
assert (rc);
%  Process 100 updates
update_nbr = 0;
total_temp = 0;
for update_nbr = 1:100
  string = char( zmq_recv(subscriber, 128) );
  [zipcode, temperature, relhumidity, count, errmsg] = sscanf (string, "%d %d %d", "C");
 
  fprintf ("recieved a temp for zipcode '%s' of %dF\n", ...
    zipfilter, temperature);
  total_temp += temperature;
endfor
fprintf ("Average temperature for zipcode '%s' was %dF\n", ...
  zipfilter, (total_temp / update_nbr));
zmq_close (subscriber);
</syntaxhighlight>}}




[[Category:Octave Forge]][[Category:Packages]]
[[Category:Octave-Forge]]
Please note that all contributions to Octave may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Octave:Copyrights for details). Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)

Templates used on this page: