Phidget Dictionary: Difference between revisions

From Phidgets Support
No edit summary
 
(11 intermediate revisions by 3 users not shown)
Line 2: Line 2:
==General Overview==
==General Overview==


The Phidget Dictionary is a central key-value pair database for networked programs. It is a server provided by the [[Phidget Network Server]].  It allows you to store program data centrally - in the form of key-value pairs - on the same server as your Phidgets.
[[Image:Dictionary-networkserver.jpg|600px|link=|alt=]]


A Dictionary is like any other Phidget software object: You create and open it (though you don't have to wait for attachment or attach it in any way)You can subscribe to data change events, and get updates on these events from multiple devicesAnd when you're done, you simply close and delete it.  Just like any other Phidget software object over the network, you run the functional code on your client, and the server simply runs the Phidget Network Server, which includes the Phidget Dictionary.
The Dictionary is a Phidget channel class that exports a key-value pair databaseDictionaries are created and made accessible by the [[Phidget Network Server]]A Dictionary channel is created and opened like any other Phidget channel.  Matching is done using either the serial number or the label assigned to the dictionary.


Since the Dictionary is a popular feature on our Phidget Single Board Computer (SBC), we will use that as an example. Here's a diagram of what it might look like:
The backing pseudo-device that exports the Dictionary device channel is maintained by the [[Phidget Network Server]], and is created when the server starts. When the server exits, the pseudo-device is deleted, and any changes made to a dictionary are lost.


The basic functionality of a Dictionary is to maintain configuration information in a central location.  Multiple clients can attach to the same dictionary, and set handlers for ''add'', ''update'' and ''delete'' events, making the dictionary useful for monitoring and communicating state.


==Creating a Dictionary==
Dictionaries are managed by the [[Phidget Network Server]].  To create a dictionary, go to the [[Phidget Control Panel]] and click on the '''Network Server''' tab.  There are options to create and manage dictionaries.  The server must be enabled for clients to access dictionaries.


[[Image:Dictionary-networkserver.jpg|800px|link=|alt=]]
On Linux, refer to the README for information on how to enable the dictionary feature in the [[Phidget Network Server]], and for the syntax of dictionary configuration files.
 
 
 
In this example, the Phidget SBC is hosting a Phidget Server and a Dictionary Server. The Phidget Server allows other computers on the network to access and control the ports on the Phidget SBC. You can learn more about using Phidgets over the network on the [[Phidget Network Server]] page. The dictionary contains key-value pairs which can be added, removed and updated by the Phidget SBC hosting the dictionary or any other computer on the network.
 
Of course, you can handle data storage and sharing internally within your program, but the Phidget Dictionary is simple to use and setting up event handlers to notify your programs of changes in the dictionary can also be useful. For a complete list of dictionary functions, see the {{Phidget22API}} and select '''Phidget Dictionary''' from the drop-down menu.
 
The dictionary becomes more valuable the more clients you have interacting with your Phidgets system. The intended use for the dictionary is as a central repository for communication and persistent storage of data between several client applications. For example, it can be used as a higher level interface exposed by one application that controls the Phidgets for others to access, rather than every client talking directly to the Phidgets themselves.


==Using The Dictionary==
==Using The Dictionary==


To use the Dictionary, you would create a Dictionary object within your code, just like you would any other Phidget software object. To "listen" to changes of the value associated with a key, the Dictionary has a {{Code|onAdd()}}, {{Code|onRemove()}}, and {{Code|onUpdate()}} event functions (exact name dependant on programming language used). You can write code in these event handlers to react differently depending on which pair is being changed.
To access a dictionary, create a channel, set the serial number or the label, and open the channel.
 
To "listen" for changes to the Dictionary, {{Code|onAdd()}}, {{Code|onRemove()}}, and {{Code|onUpdate()}} event handlers can be set. Refer to the {{Phidget22API}} to see the methods supported by Dictionary.  
Go into the [[Phidget Control Panel]] and click on the '''Network Server'' tab and ensure the server is started.  


Here's an example of how you might use the dictionary in a C program:
Here's an example of how you might use the dictionary in a C program:


<div class="source">
<div class="source">
<syntaxhighlight lang=c>
<syntaxhighlight lang=c>


// Declare the dictionary handle
PhidgetDictionaryHandle dict;
PhidgetDictionaryHandle dict;
char val[32];


// Create the new dictionary object using the handle
PhidgetDictionary_create(&dict);
PhidgetDictionary_create(&dict);
PhidgetDictionary_addDictionary(5000,"myDictionary"); //set a serial number and label for the dictionary


// Open connection to the dictionary using the serial number
// Open connection to the dictionary using the serial number
Line 44: Line 34:
Phidget_open(dict);
Phidget_open(dict);


// Add a key-value pair to the dictionary
PhidgetDictionary_add(dict, "my_key", "my_value"); // add a key that does not already exist
char *key1 = "001";
PhidgetDictionary_get(dict, "my_key", val, sizeof (val)); // get the value back
char *val1 = "first";
printf("Value: %s\n",newValue);
PhidgetDictionary_add(dict,key1,val1);  


// Access and print a value from the dictionary based on a given key
PhidgetDictionary_remove(dict, "my_key"); // remove the key
char newValue[20];
PhidgetDictionary_get(dict, key1, &newValue,20); // '20' refers to the length of the buffer used to store the result
printf("Value: %s",newValue);


// Remove a pair from the dictionary based on a given key
PhidgetDictionary_remove(dict, key1);
// Close and clean up the dictionary object
Phidget_close(dict);
Phidget_close(dict);
PhidgetDictionary_delete(&dict);
PhidgetDictionary_delete(&dict);
Line 64: Line 46:
</div>
</div>


==Notes==
A common mistake is to assume an event will be delivered to the channel that triggered the event.  This is not the case.  For example, when a channel adds a key, that channel's add event handler is not called.


Have a look at the {{Phidget22API}} documentation to learn how to use these methods in the language of your choice. Select your preferred language from the first drop-down box, and select '''Dictionary API''' from the second box.
It is an error to {{Code|Add()}} a key that already exists in the dictionary.  {{Code|Set()}} should be used to update existing keys, creating the key if it does not already exist.


Interestingly, you don't even need a Phidget to use the Dictionary! You can use our libraries and the [[Phidget Network Server]] without any Phidgets. Usually, there's not much to broadcast on the Network Server without a Phidget, but the Dictionary is the exception. With it, you'll have access to centralized key-value pair database management, pre-written, that can work across many computers on a local network.
There is no way to directly list all of the keys in a dictionary. The {{Code|Scan()}} method allows code to access the existing keys, but only returns the number of keys that can be held in a limited sized buffer.  This interface was chosen as the dictionary could contain more keys than could reasonably be returned in a single network request.

Latest revision as of 17:53, 6 March 2019

General Overview

The Dictionary is a Phidget channel class that exports a key-value pair database. Dictionaries are created and made accessible by the Phidget Network Server. A Dictionary channel is created and opened like any other Phidget channel. Matching is done using either the serial number or the label assigned to the dictionary.

The backing pseudo-device that exports the Dictionary device channel is maintained by the Phidget Network Server, and is created when the server starts. When the server exits, the pseudo-device is deleted, and any changes made to a dictionary are lost.

The basic functionality of a Dictionary is to maintain configuration information in a central location. Multiple clients can attach to the same dictionary, and set handlers for add, update and delete events, making the dictionary useful for monitoring and communicating state.

Creating a Dictionary

Dictionaries are managed by the Phidget Network Server. To create a dictionary, go to the Phidget Control Panel and click on the Network Server tab. There are options to create and manage dictionaries. The server must be enabled for clients to access dictionaries.

On Linux, refer to the README for information on how to enable the dictionary feature in the Phidget Network Server, and for the syntax of dictionary configuration files.

Using The Dictionary

To access a dictionary, create a channel, set the serial number or the label, and open the channel. To "listen" for changes to the Dictionary, onAdd(), onRemove(), and onUpdate() event handlers can be set. Refer to the Phidget22 API to see the methods supported by Dictionary.

Here's an example of how you might use the dictionary in a C program:

PhidgetDictionaryHandle dict;
char val[32];

PhidgetDictionary_create(&dict);

// Open connection to the dictionary using the serial number
Phidget_setDeviceSerialNumber(dict, 5000);
Phidget_open(dict);

PhidgetDictionary_add(dict, "my_key", "my_value"); // add a key that does not already exist 
PhidgetDictionary_get(dict, "my_key", val, sizeof (val)); // get the value back
printf("Value: %s\n",newValue);

PhidgetDictionary_remove(dict, "my_key"); // remove the key

Phidget_close(dict);
PhidgetDictionary_delete(&dict);

Notes

A common mistake is to assume an event will be delivered to the channel that triggered the event. This is not the case. For example, when a channel adds a key, that channel's add event handler is not called.

It is an error to Add() a key that already exists in the dictionary. Set() should be used to update existing keys, creating the key if it does not already exist.

There is no way to directly list all of the keys in a dictionary. The Scan() method allows code to access the existing keys, but only returns the number of keys that can be held in a limited sized buffer. This interface was chosen as the dictionary could contain more keys than could reasonably be returned in a single network request.