Help and support for using the Stacks Digital Signage platform.
Stacks is an advanced digital signage platform for building dynamic sequences of multimedia.
Multiple display candidates are stacked vertically and dynamically chosen by evaluating user defined conditions. Conditions can incorporate date and time, geographic location and custom data.
Administration of large numbers of sequences is simplified by creating shared base sequences. This allows a user to be granted the ability to only modify a subset of items displayed on a screen. By using the stacking concept and powerful multi-user access controls, complicated dynamic sequences can be constructed for showing worldwide, national, regional and local advertising on an unlimited number of screens.
Control when items display using custom conditions and dynamic data. It is now possible to write conditions to specifically target an audience. For example, show an advert for a womens coat when more women than men are looking at the screen, the temperature is below 15 degrees and its a Saturday.
Sequence stacking allows collaborative control of a common base sequence. Control which slots in a base sequence can be overridden by another user. Build complex stacked sequences merging international, national, regional, local and screen specific content. Each layer controlled by different users.
Slots can contain inner sequences controlled by another user. Grant a user access to a specific slot in a sequence. Ideal for advertisers.
Multiple images and videos can be positioned and displayed at the same time.
Grant one or more users or groups access to specific screens, sequences, library items or other users and groups.
DS Loader maintains an open UDP port which means changes can be sent to devices instantly.
New player software and custom player implementations can be sent instantly to DS Loader. (A rooted device is no longer required).
Multiple screens on the local network can be synchronised to play slots at the same time. Video walls can be configured using shared base sequences for timing.
Players download images and videos from players on the local network when available (peer 2 peer).
All data is digitally signed and verified to prevent corruption and man in the middle attacks.
1080p HD video and ultra high definition 4K video capability (on supported devices).
All conditional logic is evaluated locally on the device. This means schedules and geolocation data evaluation does not require an Internet connection. Multimedia is also stored locally for perfect playback with no buffering delays.
A record can be created for every item that is displayed on a screen. Each device automatically synchronises records with the server when a connection is available.
As well as supporting HTML5 interactive content, custom events can be defined to trigger actions such as playing another sequence or collecting an email address.
HTML5 widgets can be added to display rich, dynamic content to screens.
Integration to various technologies to refer customers to more information.
Control HDMI switches and other devices using USB to RS-232 adapters.
Media can be e-mailed directly to a sequence.
Servers in Europe, America and Asia use asynchronous replication with eventual consistency to provide low latency connections, scalability and resilience worldwide.
Secure connections using the latest encryption standards.
The admin interface is used to manage multimedia, sequences, screens, users, groups and cloud configurations. The functionality available to a user is configurable.
Click the sign in with password button to sign in to the administration interface.
An email address and password is required to sign in to the admin interface.
Click the new sequence button to create a new sequence.
The general tab allows a label, type and defaults to be specified for the sequence.
The populated by media RSS feed option periodically synchronises items from a media RSS source. This is typically used to pull live news items from sources such as BlueFox or ScreenFeed.
The populated by e-mail option enables the platform to receive media e-mailed to a special address and adds the media to the sequence.
Default values are applied when adding new items to the sequence.
The advanced tab is used to configure advanced sequence settings. A base sequence can provide default items and restrictions for the sequence. An administrator may require a specific base to be used to control how your digital signage device operates.
Transition animations can be configured to provide visually pleasing movement between items in a sequence.
Multiple devices playing the same sequence can be synchronised. See Playback Synchronisation for more information.
The frame tab allows the items in the sequence to be framed. A frame may position or scale the main content and provide additional information to the sides. A frame can also be used to overlay branding above the main content.
The events tab allows triggers to be defined that perform actions and interrupt regular playback.
The access tab is used to grant additional users and user groups to access the sequence.
The data tab is used to add custom data to the sequence. The data may be used in condition evaluation or to store any additional information required.
(It is common for a sequence to be automatically created and to have a specific base sequence configured by an Administrator when you first sign in. Click edit to modify this sequence)
Click the stack heading to view options for configuring how the stack operates.
When the sequence is used as a base, stacking above can be disabled. This prevents the upper sequence from overriding items in this sequence stack or lower. Effectively, this guarantees items are displayed and can not be replaced by the upper sequence.
The maximum duration limits the duration of items in the stack. If an item exceeds the duration, it will not be displayed. If the item refers to another sequence, the sequence will only show enough items to consume the duration. It will auto-progress next time the sequence displays.
Click the add button in a slot to add a new item to a sequence. The item editor will be displayed.
The general tab allows a Label to be specified for the item. The label is useful for reporting and indexing purposes. The Duration option controls how long an image or web page displays before progressing to the next item. If a video is uploaded and this field is not modified, it will be populated by the length of the video.
The display tab is where the multimedia to be displayed is defined. There are 3 display types:
The Library button allows an item from the library to be selected to display in the sequence. The library functionality is not enabled for all users.
The Upload button allows a local file to be selected for upload. A new item will be added to the list below and will read "Pending". When the "Save" button is pressed the file will be uploaded and associated with the item. Multiple images and videos can be added with different resolutions. The player will select the best batch for the screen.
The Internet button shows a text field that can be used to specify the address of a Web page, Image or video. There are 4 types supported.
Make sure you press Add to add the new address to the list of resources.
The Build button presents a list of tools for building content. Examples include Weather and Text RSS feeds. This list is dynamic, expect more options soon.
Use the library and sequence buttons to add items. Drag to position and resize them. Click numbered buttons to edit and remove each item.
Items can overlap. The numbers represent order of drawing to the screen. To raise an item to the top, click the center icon.
Select the sequence to display. Remember the inner sequence will only display for the duration configured by the item. If the inner sequence is longer it will automatically progress by one item each cycle of the outer sequence.
The condition tab is used to control when this item is displayed. The Start Date and End Date fields allow a specific date range to be quickly specified. The text area provides the ability to write JavaScript like expressions using data in the system. Buttons provide helper tools for writing advanced conditions.
More about advanced conditions
The advanced tab provides custom transition options and reporting options for collection of playback data. The playback data is useful for proof of play providing a complete report of what displays on each screen.
The events tab is used to define what happens when the screen is touched, a key is pressed or a condition is true.
An event consists of two parts; a trigger and an action. When the trigger occurs, the action is performed. Actions include displaying a web page, playing another sequence, collecting data (such as an email address) or adding advanced data.
A trigger can occur at any time while the item is displaying and the action will interrupt the playback of the active item.
The data tab is used to add custom data to the item. The data may be used in condition evaluation or to store any additional information required.
The test data dialog allows you to set data to be used when evaluating advanced conditions. For example the time
, gpsLatitude
and gpsLongitude
can be set to test whether the item will display at a particular time or GPS location. This is also useful for testing expressions using custom data.
Click the new screen button to create a new screen.
When adding a new screen, the general tab displays software download links. When the software is installed on a device, a MAC address will be displayed. This MAC address must be entered into the MAC address field in the interface to associate the device with the screen entry in the admin interface.
A meaningful label can be assigned to the screen to help find it in the future.
The display tab is used to control what is displayed on the screen. The drop down list will contain all the sequences you have created. Select a sequence to start playback on the screen. When instant updates are available the next and previous control buttons will become available. Pressing these buttons will instantly change the item displayed on screen making it possible to remotely control the sequence.
For sequence playback, a player must be selected under the player tab.
The software tab controls the player software used to display the sequence on the screen. Custom player implementations are available to provide advanced functionality such as using cameras for audience analytics and additional data collection.
Commands can be sent to a device to perform maintenance and debugging:
Command | Description |
---|---|
Send log | Send log information to the server to help debug problems. (DS Loader v6+) |
Send screenshot | Send a screenshot of what is currently on the screen to the server. Please note, videos may be displayed as black when they are using hardware acceleration. (DS Loader v6+) |
Clear data | Delete all downloaded images and videos stored on the device. |
Restart app | Stop the app and start again. |
Stop app | Stop the app and do not restart. |
Reboot device | Shutdown and restart the whole operating system. Only works on rooted devices. |
Upgrade DS Loader | Upgrade the loader software responsible for loading the player. Only works on rooted devices. |
The location tab displays the current geographic location of the screen. If the device has GPS support, the location will be automatically updated. If no GPS device is available, the IP address will give a rough location. A location can also be manually specified.
The access tab is used to grant additional users and user groups to access the screen.
The data tab is used to add custom data to the screen. The data may be used in condition evaluation or controlling advanced player settings.
Access to the platform requires an email address and a password. These credentials and other user related data is defined in a user item.
Administration interface features can be selectively shown and hidden to reduce complexity and simplify tasks. For example, a user may only be responsible for adding content to a sequence and only have the sequences tab visible. Another user may manage the screens and only need to screens tab visible.
Each user only sees the items they create unless they are granted access to other items. All items (including users) can be shared with other users using the access tab when editing items.
It is recommended that specific users are created to control API operations.
Click the new user button to create a new user.
The general tab allows a name, email and password to be specified. The email must be unique and is used when granting group access to objects in the system.
The location tab allows an address to be specified for the user. The search box allows an address to be found using google maps. An address can also specified by dragging the red marker or manually typing the address fields.
The advanced tab allows features to be enabled and a base sequence to be set. These options can only be enabled by another user with the features enabled already. The base sequence option restricts the sequences that can be displayed on the screen.
The auto setup tab speeds up the process of configuring the end user by automatically creating a sequence and screen for the end user.
The access tab is used to grant additional users and user groups to access to this user. If another user has access to a user they will be able to masquerade as the user and see all item that user has access to.
The data tab is used to add custom data to the user.
A group is useful for granting one or more users access to many items in a single operation. For example, newly registered users can be automatically added to a group. A special user can be given access to the group and act as an administrator for all the users.
Groups can be used for sharing items. For example, multiple library items can be added to a group then access to the group can be given to multiple users to form a shared library. Screens and sequences can also be grouped and managed by multiple users.
Click the new group button to create a new group.
The general tab allows a label and a name to be defined for a group. The name must be unique and is used when granting group access to objects in the system.
The members tab lists all items assigned to a group. Everything in this list will be accessible to the users on the access tab.
The access tab is used to grant additional users and user groups to access to all the members in this group.
The data tab is used to add custom data to the group.
The library makes it easy to reuse images and videos. An item can be uploaded into the library once and added to many sequences quickly and easily. Each item in the library can be shared with multiple users or groups of users and can act a template supporting modifications such as adding custom text.
Click the new item button to create a new item for the library.
The library dialog provides a similar set of options to the stack item dialog. Please refer to the stack item dialog section.
The domain name and path used to access the digital signage platform selects a cloud config. The cloud config controls branding, customisations and advanced settings. For example, the domain demo.example.com may allow anonymous registrations and assign users to the user group demo which has a sequence with restrictions imposed by a shared base sequence. The welcome logo, color scheme and favicon may all be customised and different default player applications, languages and timezones configured.
The following web sites can be used for creating compatible bootstrap 3 theme CSS.
Sign in can delegate authentication to Google, Microsoft and Yahoo! OAuth2 providers. To enable, a client ID and client secret must be configured for each.
Reports provide access to data collected by the platform. This data includes user actions, proof of play and other collected data. Reports can be displayed in the administration interface or downloaded as a CSV for viewing in a spreadsheet application.
All actions performed in the administration interface create user action records. The records form a comprehensive audit trail listing the changes made to screens, sequences, users and other items. It also includes failed sign in attempts and other important information. A user action record contains the following data:
The snapshot makes it possible revert to earlier revisions of an object. It also makes it possible to restore deleted objects. To revert changes or restore a deleted object. Edit the record and click save.
A summary of users and groups including counts of accessible items and storage used. This report is built using the configured access controls and will show duplicates where items are shared between users and groups.
To collect data for display reports an item in a sequence must have the collect playback data option enabled. When the item is displayed on a screen a display report record is created. A display report record contains the following data:
An item in a sequence can be assigned a custom ID. This will be included in the CSV file.
The platform provides the ability to collect additional data. For example, an event can be created that allows a viewer to touch an advert and register interest for a product. Data collected can include email addresses, phone numbers or other text data. A collected data record contains the following data:
When a user is allowed to interact with a web page, each new web address visited will also be added to the collected data.
Scanned barcodes and NFC tags will also be added to the collected data. Adding the option collectGps=true
into
the screen data will also instruct the player to collect GPS location. The location will be collected after 100 meters of
movement at up to once per minute.
The collected data for each record is limited to 100 characters. If a web address or other data exceeds this length only the first 100 characters will be available.
Advanced conditions allow you to control when an item is displayed using JavaScript like expressions.
Data defined in the active screen, stack item, slot or sequence can be used in expressions. This data can be populated by
sensors such as GPS, player extensions (such as audience analytics tools), manually set in data fields or automatically updated by 3rd party services.
The stack item will only display if the expression evaluates to true
.
Syntax | Description |
---|---|
== | Test for equality. For example temp == 23 will only return true when the data named temp is set to 23 . |
!= | Test for inequality. For example temp != 23 will only return true when the data named temp is not set to 23 . |
> | Test if one value is greater than another. For example temp > 23 will only return true when the data named temp is greater than 23 . |
< | Test if one value is less than another. For example temp < 23 will only return true when the data named temp is less than 23 . |
>= , <= | Syntax for greater than or equal to and less than or equal to. |
&& | Ensures two expressions are true. For example temp < 23 && screenSize > 40 only returns true when the data named temp is less than 23 and the data named screenSize is greater than 40 . |
|| | Ensures either expression is true. For example temp < 23 || screenSize > 40 returns true when the data named temp is less than 23 or the data named screenSize is greater than 40 . |
( , ) | Control grouping and order of evaluation. For example true || (true && false) returns true but (true || true) && false returns false . |
There are a variety of predefined variables and helper functions to enable powerful logic to be defined.
Syntax | Description |
---|---|
time.after("2014-02-01") | true if time is after 1st Feb midnight. |
time.after("2014-02-01 12:00") | true if time is after 1st Feb 12pm. |
time.before("2014-02-15 13:00") | true if time is before 15th Feb 1pm. |
time.hour() == 13 | true if hour is 1pm. |
time.decimalHour() > 13.5 | true if time is after 1:30pm (decimal). |
time.after("13:30") | true if time is after 1:30pm (time). |
time.day() == "Thursday" | true if day is Thursday. |
time.weekday() | true if it is a weekday. |
time.weekend() | true if it is a weekend. |
time.month() == "August" | true if month is August. |
time.minute() == 5 | true at 5 minutes past every hour. |
time.second() == 59 | true at 59 seconds past every minute. |
time.date() == 1 | true if it is the 1st day of the month. |
time.between("14:05", "16:30") | true if time is between 2:05pm and 4:40pm. |
time.between("18:00", "07:00") | true if time is between 6pm and 7am of the following day. |
time.between("2014-01-01", "2014-01-31") | true if time is between 1st Jan 12am and 31st Jan 12am. |
time.between("2014-01-01 10:00", "2014-01-31 14:00") | true if time is between 1st Jan 10am and 31st Jan 2pm. |
time.between("19:00", "22:00", "Europe/London") | Use a custom timezone. - true if time is between 7pm and 10pm in London. (player 11.11+) |
time.millis() | Milliseconds since the UNIX epoch (January 1, 1970 00:00:00 UTC). |
The time zone used by default will be the time zone of the device.
Syntax | Description |
---|---|
distanceMiles(51.48, -0.10) < 10 | true if the location of the screen is less than 10 miles from the location with latitude of 51.48 and longitude of -0.10. |
distanceKilometers(51.48, -0.10) < 20 | true if the location of the screen is less than 20 kilometers from the location with latitude of 51.48 and longitude of -0.10. |
gpsInside(lat1,lng1,lat2,lng2,lat3,lng3...) |
true if the location of the screen is inside the polygon defined by the list of latitude longitude pairs.
Please note, this function is designed for short distances (max 100km) that do not cross the international dateline.
android-player-17.1.apk+ or android-exoplayer-3.1.apk+ required. |
gpsInside("lat1,lng1,lat2,lng2,lat3,lng3...") |
Same as above but accepts a single argument quoted String representation of many latitude longitude pairs. In addition
to improving performance this function allows other defined data to be used for example
gpsInside(manhattanPolygon) .
|
These functions require gpsLatitide
and gpsLongitude
to be set in the data. Screens will update these values automatically. For testing in the admin interface, set a test location using the Test Data Dialog.
Syntax | Description |
---|---|
random() | Generates a random number between 0 and 1. For example random() < 0.5 returns true 50% of the time.
Note: Generates a new random number every time it appears in a condition. |
random | This value is set to a random number between 0 and 1. Note: A single number is generated after an item displays and available in all conditions. (Player 3.8+) |
The following order is used to collate data:
This means that screen data will override sequence data with the same name. It can be useful setting defaults in the sequence data that will be overriden by specific screens to provide customisation when conditions are evaluated.
Devices can be configured by adding advanced player settings to the screen data. The following settings are available.
Name | Default | Example | Description |
---|---|---|---|
showStatusIcon | false | true | Show a small status icon in the bottom right when downloading media or there are communications problems. |
blackCondition | false | time.between("18:00", "06:59") | When condition is true no images or videos will be displayed and the screen output will be black. CL |
standbyCondition | false | When condition is true the app will exit. Please note the device will not enter standby and turn off the screen until the sleep period configured in the Android OS. The app will restart after standbyPeriod and check the condition again. CL | |
standbyPeriod | 3600000 | The period to remain in standby. After this period the app will resume. | |
restartTime | 03:00 | The time the app should restart. Comma separated list supported. DS Loader version 12.3+ and Player version 10.7+ required. Ignored until app active for 1 minute to prevent restart loops. System clock and time zone must be correct. | |
exitTime | 19:00 | As above except app exits and does not restart. | |
rebootTime | 00:00 | As above except reboot command issued. Requires rooted device and support for reboot shell command. | |
background | #000000 | #FFFFFF | The background colour to display behind other content. Also sets a colour for the video blanker which masks black video when starting and stopping videos. |
videoBlankerPeriod | 250 | 100 | The period in milliseconds when a video starts and stops to display the video blanker. (requires background) |
internetBlobsCondition | true | time.hour() == 3 | When true images and videos will be downloaded from the Internet if not available on the local network. CL |
intranetBlobsCondition | true | When true images and videos will be downloaded from other devices on the local network. CL | |
blobstoreInternal | true | When true internal storage will be used to store images and videos. | |
blobstoreExternal | true | When true external storage will be used to store images and videos when the internal storage has less than 128MB available. Please note, on modern devices external storage is a second internal partition. To use an SD card or USB mass storage device you must specify the full path using blobstoreDir . | |
blobstoreDir | /mnt/external_sd | Additional paths suitable for storing blobs. This path will be used if internal and external locations are disabled or have less than 128MB available. It is recommended that you create a directory on the storage device and use the full path because the root may be limited to 512 files. Multiple additional paths can be specified using blobstoreDir_0 , blobstoreDir_1 etc. | |
blobTransferRateMin | 10240 (10 KiB/s) | The minimum acceptable transfer rate for downloading. If the transfer rate drops below this value the download will be terminated and retried later. | |
blobTransferRateMax | 104857600 (100 MiB/s) | The maximum acceptable transfer rate for downloading. Some devices can not play HD video content at full frame rate while downloading at high speed. For these devices try reducing to 1 MiB/s (1048576). | |
widthOverride | 640 | The width of the desired output. (widthOverride and heightOverride required) | |
heightOverride | 480 | The height of the desired output. (widthOverride and heightOverride required) | |
xOverride | 100 | The x position of the desired top left of output. (widthOverride and heightOverride required) | |
yOverride | 100 | The y position of the desired top left of output. (widthOverride and heightOverride required) | |
collectedDataTarget | A server endpoint to POST collected data such as email addresses. | ||
webviewAllow | https://www.example.com/* | Only allow the webview to access websites matching this pattern. To add multiple, suffix with a number starting with _0 . E.g. webviewAllow_0=... webviewAllow_1=... . This setting restricts main address and iframe addresses but not resources loaded by the page. | |
webviewReuse | 10 | The number of WebView components to cache and reuse. Speeds up rendering web pages that display more than once. Set to 0 to disable. | |
webviewReusePeriod | 600000 | The period in milliseconds a cached WebView should reuse content and avoid reloading the page. | |
maxBitmapCacheSize | 20000000 | The maximum RAM (in bytes) that will be used to cache bitmap images. Default is half memMax . | |
manageSystemUiVisibility | true | false | Attempt to hide the System UI. Disable this option if touch events are ignored. |
password | password | Adds a password field to the exit dialog. Password typed must match this password to exit. |
CL - Conditional logic supported, for example time.between("18:00", "06:59")
will automatically enable the setting between 6pm and 6:59am.
Name | Default | Description |
---|---|---|
cameraId | 3 | The ID of the camera to use. When using a device with a single camera, set this to 0 . |
cameraWidth | 640 | The width in pixels the camera should capture. |
cameraHeight | 480 | The height in pixels the camera should capture. |
cameraOrientation | 0 | Camera orientation (0: original, 1: +90 degrees, 2: -90 degrees, 3: 180 degrees) |
analyticsUseClient | true | Enable Analytics reporting. (required) |
analyticsServerHost | 188.138.26.160 | IP address or host name of Analytics reporting server. |
analyticsServerPort | 20001 | Port of Analytics reporting server. |
analyticsReconnectInterval | 5 | Period in seconds to send reporting data. |
analyticsDeviceKey | The API key required for Analytics. (automatically generated) | |
analyticsDeviceId | The device ID for this screen. (automatically generated) | |
analyticsPreview | false | Show Analytics processing image. (default bottom right) |
analyticsPreviewX | Preview position in pixels from left of screen. | |
analyticsPreviewY | Preview position in pixels from left of screen. | |
analyticsPreviewWidth | 640 | Preview width in pixels. |
analyticsPreviewHeight | 480 | Preview height in pixels. |
Name | Example | Description |
---|---|---|
analyticsError | Set if error detected performing audience analytics. | |
analyticsIsConnected | true | Is screen connected to Analytics servers. |
analyticsIsConfigOk | true | Is the Analytics configuration OK. |
analyticsKeyStatus | OK | The status of the Analytics licence key. |
Devices will periodically send the following data to the server. This data can be used in conditions to control if an item displays. For
example the condition screenWidth > 1000
would ensure the item only displays if the width of the screen is greater than
1000 pixels.
Name | Example | Description |
---|---|---|
freeSpace_0 | 121321321 | The number of bytes of free space on the primary storage device. |
freeSpace_1 | 1584680960 | The number of bytes of free space on the secondary storage device. |
gpsAltitude | 22.299999237060547 | The GPS altitude of the device. |
gpsBearing | 0.0 | The GPS bearing of the device. |
gpsLatitude | 51.19537291 | The GPS latitude of the device. |
gpsLongitude | 0.27393845 | The GPS longitude of the device. |
gpsSpeed | 1.5206907 | The GPS speed of the device. |
hardware | mako | The hardware label assigned to the device. |
hardwareBoard | MAKO | The hardware board label assigned to the device. |
hardwareBootloader | MAKOZ30d | The hardware bootloader label assigned to the device. |
hardwareBrand | google | The hardware brand label assigned to the device. |
hardwareBuild | KTU84P | The hardware build label assigned to the device. |
hardwareDevice | mako | The hardware device label assigned to the device. |
hardwareId | KTU84P | The hardware ID assigned to the device. |
hardwareManufacturer | LGE | The hardware manufacturer label assigned to the device. |
hardwareModel | Nexus 4 | The hardware model label assigned to the device. |
hardwareProduct | occam | The hardware product label assigned to the device. |
hardwareSerial | 004efcdb18961386 | The hardware serial assigned to the device. |
hardwareTags | release-keys | The hardware tags assigned to the device. |
hardwareType | user | The hardware type label assigned to the device. |
hardwareVersionCodename | REL | The hardware version codename assigned to the device. |
loaderUdpPort | 44326 | The port used to communicate directly with this device using UDP. |
loaderVersion | 2.6 | The version of the loader codebase connecting this device to the server. |
memFree | 439568 | The number of bytes of free RAM in the active JVM the loader runs in. |
memMax | 201326592 | The maximum number of bytes available to the JVM for code execution. |
memTotal | 14163968 | The total number of bytes the JVM has allocated. |
requiredDataAvailable | 355141 | The number of bytes available locally to play the currently active sequence. |
requiredDataTotal | 355141 | The number of bytes required to play the currently active sequence. |
screenDpiX | 319.79 | The number pixels per inch vertically. (often inaccurate) |
screenDpiY | 318.745 | The number pixels per inch horizontally. (often inaccurate) |
screenHeight | 1184 | The number of pixels on the screen vertically. |
screenWidth | 768 | The number of pixels on the screen horizontally. |
totalData | 355141 | The number of bytes stored on the device for sequence playback. |
wifiSignalLevel | 90 | The strength of the WiFi signal. |
wifiSpeed | 65 | The speed in megabits of the active WiFi connection. |
wifiSsid | SKY56566 | The SSID of the access point WiFi is connected to. |
plugged | 2 | The power status. Returns a value greater than 0 if the device is plugged in to mains power. This data is useful in the standbyCondition . |
Name | Example | Description |
---|---|---|
males | 3 | The number of males detected looking at the camera. |
females | 2 | The number of females detected looking at the camera. |
kids | 1 | The number of children detected looking at the camera. |
young | 1 | The number of young adults detected looking at the camera. |
adults | 2 | The number of adults detected looking at the camera. |
seniors | 1 | The number of seniors detected looking at the camera. |
kidMales | 1 | The number of male children detected looking at the camera. |
kidFemales | 2 | The number of female children detected looking at the camera. |
youngMales | 3 | The number of young males detected looking at the camera. |
youngFemales | 4 | The number of young females detected looking at the camera. |
adultMales | 5 | The number of adult males detected looking at the camera. |
adultFemales | 6 | The number of adult females detected looking at the camera. |
seniorMales | 7 | The number of senior males detected looking at the camera. |
seniorFemales | 8 | The number of senior females detected looking at the camera. |
emotionHappy | 1 | The number of smiling faces detected looking at the camera. |
emotionNeutral | 2 | The number of neutral faces detected looking at the camera. |
emotionAngry | 3 | The number of angry faces detected looking at the camera. |
emotionSurprised | 4 | The number of surprised faces detected looking at the camera. |
Scrolling text can be displayed on the screen. The following values are used to set and style the scrolling text and can be added as data to the screen, sequence or item.
If scrolling text is set on a screen it can be overriden by an item. For example, adding scrollingTextCondition=false
to an item would hide the scrolling text while the item is displayed.
Name | Default | Example | Description |
---|---|---|---|
scrollingText | My Text | Set to scroll custom text on the screen. (Android only) | |
scrollingTextSpeed | 200 | Scrolling text speed in pixels per second. | |
scrollingTextGravity | bottom | Position the scrolling text should be rendered. | |
scrollingTextSize | 100 | Text size of the scrolling text in pixels. | |
scrollingTextColor | #FFFFFF | Color of the scrolling text. | |
scrollingTextBackgroundColor | #000000 | Color of the background behind the scrolling text. | |
scrollingTextPadding | 10 | Padding between scrolling text and edge of screen. | |
scrollingTextCondition | true | When true and scrollingText set, the scrolling text will be displayed. CL |
A clock can be displayed on the screen. The following values are used to set and style the clock and can be added as data to the screen.
Name | Default | Example | Description |
---|---|---|---|
timePattern | HH:mm:ss | Patten to define date/time formatting. Set to show time. (Android only) | |
timeGravity | top right | Position the date/time should be rendered. | |
timeTextSize | 100 | Text size of the date/time in pixels. | |
timeTextColor | #FFFFFF | Color of the text used for drawing date/time. | |
timePadding | 10 | Padding between date/time and edge of screen. | |
timeZoneOverride | Europe/London | Timezone used to display current time. This will override the devices configured time zone. |
The volume of audio playback can be controlled by setting volume
to a value between 0
and 1
.
The volume setting can be added as data to the screen, sequence or item.
If volume is set on a screen it can be overriden by an item. For example, adding volume=0
to a video item would mute the volume when it plays.
Name | Example | Description |
---|---|---|
volume | 0.5 | Set the volume of the audio. (Android only) |
Multiple screens can be synchronised to start playing items at the same time. The screens must be on the same LAN and configured to display the same sequence or root base sequence. When sequences share the same root base sequence, ensure items stacked above have the same duration to prevent premature sequence progression.
Synchronisation will only occur when all data has been downloaded. It may also take up to 5 minutes to accurately synchronise the local clock after the player starts.
Accuracy varies depending on the hardware, Android version and the type of images and videos displayed. To obtain good playback synchronisation it is recommended the same hardware is used. The following modes can be set to further optimise accuracy of synchronisation.
Name | Value | Description |
---|---|---|
syncVideoMode | 0 | Prepare then start the next video immediately after the previous item. This results in a variable duration gap between videos. |
syncVideoMode | 1 | Prepare the next video and schedule it to start 350ms after the previous item. This mode adds 350ms to the duration of each item but increases accuracy and prevents the end of videos being skipped. |
syncVideoMode | 2 | Prepare the next video, schedule it to start 250ms after the previous item then pause and resume the video for up to 100ms so target start time is achieved. This trick improves start time accuracy. |
syncVideoMode | 3 | Prepare the next video 350ms before the end of the previous video and start it when the previous item finishes. (Requires decoding of two videos at the same time which is not supported on some devices) |
syncVideoMode | 4 | Prepare the next video 350ms before the end of the previous video, start it 100ms before the previous item finishes then pause and resume the video for up to 100ms so target start time is achieved. |
The default mode is 2. Modes 3 and 4 will remove the 350ms padding between items but may cause instability because the device will be processing 2 videos at the same time for a short period. All devices must use the same sync mode, please add this setting to sequence and inner sequence data.
When using a variety of devices and Android versions, some may start earlier than others. To compensate the following values can be added to the screen data.
Name | Value | Description |
---|---|---|
syncOffset | 0 | Delay the transition between items (images and videos) by this number of milliseconds. |
syncVideoOffset | 0 | Delay starting videos by this number of milliseconds. |
The screen brightness can be controlled by setting screenBrightness
to a value between 0
and 1
.
The brightness setting can be added as data to the screen, sequence or item.
If brightness is set on a screen it can be overridden by an item. For example, adding screenBrightness=1
to an image would set maximum brightness when it displays.
Name | Example | Description |
---|---|---|
screenBrightness | 0.5 | Set the brightness of the screen. (Android with built in screen only) |
The screen orientation can be controlled by setting orientation
to one of the values below.
This option will override the internal orientation sensor. Please note, some devices ignore this setting.
Name | Value | Description |
---|---|---|
orientation | 6 | Set landscape orientation |
orientation | 8 | Set reverse landscape orientation |
orientation | 1 | Set portrait orientation |
orientation | 9 | Set reverse portrait orientation |
See Android Documentation for more orientation settings.
Barcodes are automatically read when a USB barcode reader is connected (keyboard emulation). If an event is configured with a matching barcode trigger, the action will be performed.
NFC tags are automatically read when placed near the device. If an event is configured with a matching NFC trigger, the action will be performed.
To display a dynamic web page for many barcodes add ~barcode
in the address for the web page action.
This will be replaced with the barcode. For example http://www.example.com/shopping.php?barcode=~barcode
would display the web page
http://www.example.com/shopping.php?barcode=123456789
if the barcode 123456789
was scanned.
Use ~nfcTagText
for NFC tags.
A phone or tablet with NFC support can also be placed near a digital signage player to open a web browser and load a web page.
To configure the destination web page address, set nfcUrl
to the address of a web page.
The nfcUrl setting can be added as data to the screen, sequence or item.
To complete the NFC transfer, the digital signage screen must be touched.
Name | Example | Description |
---|---|---|
nfcUrl | http://www.example.com | Send a phone or tablet near to the screen to a web address. |
NFC does not function when the digital signage player runs above the Android screen lock.
Screens running Android 5.1+ and supported BLE hardware can broadcast a beacon. The beacon can be received by nearby devices to perform actions on the screen. See Physical Web
Name | Example | Description |
---|---|---|
beaconConfig | blepw | Enable the default BLE Physical Web implementation. |
beaconConfig | http://example.com | Override the default implementation and direct user to custom address. Note: Eddystone URL Spec restricts this to 17 characters. |
RS-232 output makes it possible to send commands to many HDMI switches and TVs that support serial communications. Most USB to RS-232 adapters using Prolific or FTDI chipsets are supported.
Special configuration data is required to setup the communications. The configuration must be added to screen data.
Name | Example | Description |
---|---|---|
rs232config | 38400,8,1,none | Set the baudrate to 38400, data bits to 8, stop bits to 1 and parity to none. |
To send a command to the serial device, add the command to the data of an item.
Name | Example | Description |
---|---|---|
rs232output | avi=1 | When the item displays, this will send avi=1 to the serial device. |
To send binary data to the serial device, encode to hex and add rs232outputFormat=hex
to the data.
Name | Example | Description |
---|---|---|
rs232outputFormat | hex | The output is provided as HEX and should be converted to binary before sending. |
rs232output | AA11FF010112 | When the item displays, this will send AA11FF010112 to the serial device. |
RS-232 communications requires loader version 12.5 and player version 11.2 or above.
The player does not send repeated data, this prevents triggers repeatedly sending the same action when conditions are true.
A custom configuration for monitoring and controlling Samsung TVs with RS-232 input is available. Add rs232config=samsung
to screen data to enable. When enabled, the following values will be added to screen data.
Name | Example | Description |
---|---|---|
samsungScreenPowerStatus | on | Screen power status. Values: on off . |
samsungScreenInputSource | hdmi1 | Screen input source. Values: hdmi1 hdmi2 dvi dtv display_port . |
samsungScreenVolume | 25 | Screen output volume. Values: 0-100 |
Screen status will be checked every 10 seconds. Additional options can be added to rs232config
to automatically maintain the status.
Name | Example | Description |
---|---|---|
rs232config | samsung,off | Keep the samsung screen turned off. |
rs232config | samsung,on,hdmi1 | Keep the samsung screen turned on and set to HDMI 1 input. |
rs232config | samsung,vol=22 | Keep the samsung screen at a volume of 22. |
Screen status can also be updated by sequence items. This can be useful, for example, to switch to another input based on conditions or events. Add rs232output
to item data.
Name | Example | Description |
---|---|---|
rs232output | hdmi2 | Switch to HDMI 2 input now. |
rs232output | dtv,vol=50 | Switch to digital TV input and set volume to 50 now. |
RS-232 Output for Samsung Screens requires loader version 12.5 and player version 14.1 or above.
The following data can be used to control interactive presentations.
Name | Default | Description |
---|---|---|
enableSwipe | true | Enable swiping to navigate sequences. |
enableTouchEvents | true | Enable touch events to trigger actions. |
showTouchAnimations | true | Animate movement of items when swiped or touched. |
showSequenceButtons | false | Display left and right navigation buttons. |
showSequenceBranchBackButton | true | After navigating to another web page, item or sequence, show an up arrow to return. |
The administration interface can be configured for specific users and cloud configurations. The following data can be used to show, hide and disable functionality available to a user or cloud.
Name | Default | Description |
---|---|---|
showServerConfigs | true | Display the cloud config tab and list accessible cloud configs. |
createServerConfig | true | Allow creation of new cloud configurations. |
showGroups | true | Display the groups tab and list accessible groups. |
createGroup | true | Allow creation of new groups. |
showUsers | true | Display the users tab and list accessible users. |
createUser | true | Allow creation of new users. |
showUserSettingsItem | true | Display the user settings item. |
showLibrary | true | Display the library tab and list accessible library items. |
createLibraryItem | true | Allow creation of new library items. |
showHome | true | Display the home tab. |
showSequences | true | Display the sequences tab and list accessible sequences. |
createSequence | true | Allow creation of new sequences. |
showScreens | true | Display the screens tab and list accessible screens. |
createScreen | true | Allow creation of new screens. |
showReports | true | Show the reports tab. |
showSoftwareLinks | true | Show the links to download the installation software. |
showUserManualLink | true | Show the link to this manual page. |
showAccessControls | true | Display the access tab and allow user to grant access to other users and groups. |
showData | true | Show the data tab and allow the user to add and modify raw data in objects. |
createCompositeItem | true | Allow the creation of items that display multiple images and videos at the same time. |
addCompositeWidgetItem | false | Allow a widget to be selected and added to a composite item. |
addCompositeSequenceItem | true | Allow an inner sequence to be selected and added to a composite item. |
pageSize | 20 | The number of rows displayed in a table on a single page. |
reportPageSize | 100 | The number of items to display on each page of a report. |
maxResults | 5000 | The maximum results to fetch from the server in a single request. |
showAdvancedCondition | true | Display the advanced condition for stack items. |
editStackSettings | true | Allow the user to edit stack settings such as maximum duration and stacking above. |
showFullJson | false | Display the link to view the full raw JSON of a sequence. |
displayItemShowBuildButton | true | Display button for building content using a content builder. |
displayItemShowInternetButton | true | Display button for importing from an Internet source or displaying a web page. |
displayItemShowLibraryButton | true | Display button for selecting an item from the library. |
displayItemShowUploadButton | true | Display button for uploading new items. |
showDownloadButton | true | Show download button to export data. (Note: does not apply to reports) |
showMultipleSelectButton | true | Show the multiple selection button to perform actions on multiple items. |
showSearchButton | true | Show the search button used filter items by search text, groups and columns. |
editUserLabel | true | Allow the user to edit their name. |
editUserLocation | true | Allow the user to edit their location. |
showUserAdvanced | true | Show the advanced tab in the edit user dialog. |
editSequenceLabel | true | Allow sequence label to be changed. Can also be set in sequence data (user data overrides it). |
showRssPreviewOption | true | Show option to preview the sequence or screen as an evaluated Media RSS feed. |
showSequenceTestDataOption | true | Show option to add test data to a sequence. Used for testing advanced conditions. |
showExpireOptions | true | Show options to expire, reactivate and remove expired items from a sequence. |
showFindSequenceOption | true | Show find sequence option to stack items linking to an inner sequence. |
showCopyOption | true | Show copy option. |
showRemoveOption | true | Show remove option. |
showEditOption | true | Show edit option. |
showScreenStatusReport | true | Show the option to view the live screen status report. |
showScreenStatusHistoryReport | true | Show the option to view the historical screen status report. |
showScreenLocationReport | true | Show the option to view the screen location report. |
showSimulator | true | Show the option to simulate playback for testing. |
showSequenceMappingReport | true | Show the option to view the screen mapping report. |
showUserSummaryReport | true | Show the option to view the user and group summary report. |
showUserActionReport | true | Show the option to view the user action report. |
showDisplaySummaryReport | true | Show the option to view the display summary report. |
showDisplayReport | true | Show the option to view the display report. |
showMediaUploadReport | true | Show the option to view the media upload report. |
showCollectedDataReport | true | Show the option to view the collected data report. |
showAnalyticsReport | true | Show the option to view the analytics report. |
defaultReportSearchType | screen | Sets the default report search type for display report, display summary and collected data. Valid values screen sequence libraryitem screenId sequenceId itemId libraryItemId . |
offlineWarningDelay | 604800000 | The delay (in milliseconds) a screen can be offline for before adding a warning to screen status. |
showHomeServiceStatus | true | Show the service status (server, replication and reporting health) on the home tab. |
showBillingStatus | false | Show the billing status - billing group applied and how many screen not in a billing group. |
Additional visibility options can be added on request.
The platform is designed to display web pages directly from the Internet. Sometimes it is necessary to host the site locally on the device so it can work in offline mode or reduce delays loading. To achieve these goals it is possible to create a zip file containing all the HTML and resources for the site and upload it to the platform.
Name the web page index.html
and make all paths to images, JavaScript and CSS relative. Compress index.html and
resources into a single zip file. Upload the zip file as regular item and it will be recognised as a zipped web page.
The zip will automatically be extracted onto the device and read locally by the internal web browser.
Using these formats is not recommended. However, if they are uploaded, 3rd party viewer extensions may be used to attempt to display them. It is best to use JPEG images and H264 encoded video for consistent output for digital signage.
Advanced content types are only supported on Android devices.
DS Loader will work on almost all Android devices. Minimum requirements:
Non standard screen outputs for LED arrays smaller than the device output are supported using the advanced options
widthOverride
and heightOverride
in Screen Data.
A device running Android 4.4 or higher is recommended for displaying HTML5 content as it uses the Chrome web browser rendering component.
Video playback uses the Android multimedia framework. For HD and 4K video playback ensure the device is capable of supporting the content you upload.
To prevent users launching other apps or tampering with Android settings, enable the Android screen lock. DS Loader will run above the screen lock when the device is turned on.
To configure the screen lock, go to Android Settings - Security - Screen Lock
It may still be poosible to exit the player, but this will only result in the screen lock appearing. The player will automatically return to the foreground after 1 minute.
Many devices display system user interface controls at the bottom of the screen. For example, back, home and recent apps buttons. The player usually hides these components automatically, but it may be possible to make them reappear.
The player includes a mechanism to completely remove the System UI, but it requires ROOT privileges. There are 2 methods of gaining ROOT privileges:
If neither of these options are possible. The System UI can be aggressively hidden by adding the following to screen data systemUiHideDelay=0
.
For devices used exclusively for digital signage, we recommend removing the Android System UI (com.android.systemui) completely and setting a password
in screen data.
Tip: Enable the Android Screen Lock to ensure the screen lock appears if the player exits. The player will automatically return to the foreground after 1 minute.
The digital signage player can also run as an Android Day Dream (screen saver)
To enable the day dream, go to Settings - Screen - Day Dream - DS Loader
We have 5 public APIs available for integrating with the digital signage platform and automating operations.
All API requests must include a valid session ID in a cookie or an authentication header matching the credentials of a user using basic HTTP authentication.
The session ID cookie will be automatically used if you have signed into the admin interface and are using the same web browser to make API requests.
Please refer to our documentation at swaggerhub. This development resource makes it easy to test and understand RESTful operations:
TargetR Stacks REST API at SwaggerHubAll objects follow a common structure.
{ "id": "ABCEF1234567", "type": "object-type", "data": { "label": "My label", "version": "23", "createdMillis": "1404910684273", "modifiedMillis": "1412943312770", }, }
The id
field is used to uniquely store and reference an object of a specific type
.
The data
field references an inner object containing a map of name value pairs.
Anything can be stored in this map and used in condition evaluation and for other purposes.
All values in the data must be text strings, however, they will be dynamically cast to numbers and boolean values when condition
evaluation is performed.
The data contains a label, a version number, created and modified dates in milliseconds since the epoc. Additional fields will vary depending on the object type. The quickest way to learn the additional fields and object structure is to click the "REST API" button in the data tab of objects within the admin interface.
/rest-api/v1/screens
- GET list of screens./rest-api/v1/screens/[SCREEN-ID]
- GET, PUT and DELETE a specific screen./rest-api/v1/sequences
- GET list of sequences./rest-api/v1/sequences/[SEQUENCE-ID]
- GET, PUT and DELETE a specific sequence./rest-api/v1/libraryitems
- GET list of library items./rest-api/v1/libraryitems/[LIBRARY-ITEM-ID]
- GET, PUT and DELETE a specific library item./rest-api/v1/users
- GET list of users./rest-api/v1/users/[USER-ID]
- GET, PUT and DELETE a specific user./rest-api/v1/groups
- GET list of groups./rest-api/v1/groups/[GROUP-ID]
- GET, PUT and DELETE a specific group./rest-api/v1/serverconfigs
- GET list of server configs. (Also known as cloud configs)./rest-api/v1/serverconfigs/[SERVER-CONFIG-ID]
- GET, PUT and DELETE a specific server config.Updates can only be performed on the items the authenticated user has access to. To control access to items, access controls are used and can be updated using the following endpoints:
/rest-api/v1/accesscontrol
- GET list of access controls./rest-api/v1/accesscontrol/[ACTOR-ID]/[OBJECT-TYPE]/[OBJECT-ID]
- DELETE an access control.New objects can be created by a POST or PUT without including an ID for the new object. New objects will automatically create a new access control allowing the authenticated user to access it.
Access Controls are used to assign items to a Group. Each access control references the group and an item in the group. All users with access to the group have access to items in the group.
To search for members of a group, the group name or group ID can be added to the list request.
?groupName=[GROUP-NAME]
?groupId=[GROUP-ID]
For example, /rest-api/v1/libraryitems?groupName=mycustomgroup
will return library items in the group
named mycustomgroup.
This operation avoids querying access controls to find items in a group and then fetching the items individually.
A masquerade
parameter can be used to list objects a specific user is able to access.
For example ?masquerade=[USER-ID]
.
Please note, the active user (as defined by the authenticated API credentials) must have permissions to access the specific
user to perform masquerading.
To filter results from a list request a filter
parameter can be used. The filter is a predicate
that is applied to data in each object. For example:
?filter=modifiedMillis>=1533901286294
?filter=label=="test"
?filter=mycustomkey=="mycustomvalue"
?filter=androidSdk>20&&screenSize<55
Please URL encode the value of the filter to encapsulate any special characters.
The following examples require json_simple-1.1.jar on the classpath. This library is used to help construct the JSON for the server communications.
This example demonstrates how to create users and groups and apply access controls.
List responses can be filtered by group by adding the query parameter groupId
or groupName
referencing a group to return.
The Quick Data API can be used for making changes to data in objects without the complexity of managing JSON objects. The purpose of this API is to automate adding data that is used in stack item evaluation.
Data can be sent as a URL encoded form post or as query parameters in the URL. For example:
/api/screen-data/ABCEF1234567?temp=23&wet=true
temp
to the value 23
and the data named wet
to the value true
in
the screen with the ID ABCEF1234567
.
/api/sequence-data/1234567ABCEF?offer=1
offer
to the value 1
in the sequence with the ID 1234567ABCEF
.
The Quick Data API can also be used to make data changes that are not part of stack item evaluation. For example quickly changing the sequence being displayed or updating scrolling text on a screen. Changes take effect instantly.
/api/screen-data/ABCEF1234567?sequenceId=1234567ABCDEF
1234567ABCDEF
on the screen with the ID ABCEF1234567
.
/api/screen-data/ABCEF1234567?scrollingText=HelloWorld!
ABCEF1234567
.
/api/user-data/1A2B3C4D5E6F7?label=Joe%20Blogs
label
to the value Joe Bloggs
in the user with the ID 1A2B3C4D5E6F7
.
To remove data from an object, provide the name and equals with no value.
/api/screen-data/ABCEF1234567?scrollingText=
scrollingText
from the screen with the ID ABCEF1234567
.
To modify data in a group of screens in a single request.
/api/group-screen-data/london.screens?overrideTimeZone=Europe/London
london.screens
with overrideTimeZone=Europe/London
.
The group-screen-data
endpoint is for updating data for multiple screens and does not return data. The
response body will be OK
if successful.
Simple examples demonstrating the quick data API.
A remote API call can be made to trigger a pre-configured event on a specific screen or group of screens. The trigger can be used to interrupt current playback and display another item or sequence of items. It is also possible to remotely trigger JavaScript within an active web page. This makes it possible to remotely control interactive web pages. Using the ds-loader layer 1 communications (UDP), triggers are typically delivered in under 200ms.
The remote trigger API call is of the following format:
/api/screen-trigger/SCREEN-MAC?name=DATA
where SCREEN-MAC is the MAC address of the screen and DATA is the data
that matches the configured trigger event or provides additional data to a JavaScript function in an active web page.
To listen for triggers in an interactive web page it is necessary to have configured a function with the following name:
DigitalSignageTriggerCallback
. This function will be called when the remote API call is made.
Additional JavaScript functions are available to help with building web pages controlled remotely.
Name | Description |
---|---|
function DigitalSignageStartCallback(){} | Called when the web page starts being displayed. |
function DigitalSignageTriggerCallback(data){} | Called when the remote trigger API is used. The data will be the data provided to the remote trigger API. |
function DigitalSignageEndCallback(){} | Called when the web page ends being displayed (after configured duration). |
DigitalSignage.setResumeDelay(30000) | Delays sequence progression by 30 seconds. This is useful if you know a user is still interacting and don"t want to interrupt them. |
DigitalSignage.getScreenId() | Returns the screen ID (MAC address) of the screen displaying the web page. |
DigitalSignage.getData(name) | Gets data value of the specified name stored in the screen, active item, stack or sequence. |
A simple example is available here.
The reporting API is used to stream large reports and collected data for further analysis.
Click the download button in the interface to download a report. Reports can be extremely large and the total size of the report is not known because it streamed directly out of the database.
To download a report via API use the following endpoints:
/api/display-report/full.csv
Custom date ranges can be specified using startMillis
and endMillis
parameters. (Milliseconds
since the epoc)
/api/display-report/full.csv?startMillis=1388534400000
A report for a specific screen, sequence, stack item or library item can be downloaded by setting type
and id
parameters.
/api/display-report/full.csv?startMillis=1388534400000&type=screen&id=1234567ABCDEF
1234567ABCDEF
since January 2014.
Set type
to screen
, sequence
, item
or libraryitem
as required.
/api/display-summary/full.csv?aggregation=item
Set aggregation
to item
, screen
or item_and_screen
as required.
/api/collected-data-report/full.csv
The fields contained in the reports can be selected using a parameter named fields
containing a comma separated list of field names.
Players can periodically connect to a web server and fetch a JSON object. The data in the JSON object will be used when evaluating conditions.
Name | Example | Description |
---|---|---|
remoteDataSource | http://api.example.com/json | Endpoint to get JSON object from. |
remoteDataFetchPeriod | 10000 | The period in milliseconds between downloads. |
For example, a web server on a train could be configured to return the next station and arrival time:
{ "nextStation": "London Bridge", "eta": 4 }
A condition (in a stack item or event trigger) could use this data to display an item, another sequence or trigger a custom action:
nextStation == "London Bridge" && eta < 5
All images, videos and other resources are named based on their raw data. The Blob naming convention provides efficient storage, avoids data duplication, provides the ability to verify data and safely share the data between local devices with strong consistency.
A Blob name is the MD5 of the binary data followed by a dash then the length in bytes.
For example: 962B5B1AF8C3B868D87979E92D8BFCE7-164197
A Blob can be cached forever because a Blob with a given name never changes.
Dynamic content uses snapshots. A snapshot is the dynamically generated Blob at a specific point in time. Snapshots are updated after they are used in a lazy fashion.
Blobstores can be shared with multiple servers and served using a content delivery network (CDN).
For example: http://blobstore.net/962B5B1AF8C3B868D87979E92D8BFCE7-164197
To supplement the global blobstores, additional blobstores can be specified in a cloud config. This makes it possible for a digital signage network to use their own infrastructure for storing and distributing images and videos.
When configured, all new data uploaded will be transferred to one or more additional servers. Players will download using HTTP from the configured endpoints.
The cloud config must use a fully qualified domain name and players must be configured with a matching
serverAddress
for the custom blobstore to be used.
blobstoreConfig | s3,[AMAZON-ACCESS-KEY],[AMAZON-SECRET-KEY],[BUCKET-NAME],[BUCKET-REGION] |
blobstoreHttpEndpoint | http://s3.amazonaws.com/[BUCKET-NAME]/ |
blobstoreHttpsEndpoint | https://s3.amazonaws.com/[BUCKET-NAME]/ |
blobstoreConfig | gcs,[GOOGLE-SERVICE-ACCOUNT-JSON-KEY-FILE-PATH],[BUCKET-NAME] |
blobstoreHttpEndpoint | http://storage.googleapis.com/[BUCKET-NAME]/ |
blobstoreHttpsEndpoint | https://storage.googleapis.com/[BUCKET-NAME]/ |
Note, JSON Key file must be added to our servers manually.
blobstoreConfig | blobstore://[SERVER-DOMAIN-NAME] |
blobstoreHttpEndpoint | http://www.mycustomserver.com/ |
blobstoreHttpsEndpoint | https://www.mycustomserver.com/ |
blobstoreConfig | ftp://[USERNAME]:[PASSWORD]@[SERVER-DOMAIN-NAME]/blobstore/ |
blobstoreHttpEndpoint | http://www.mycustomserver.com/blobstore/ |
blobstoreHttpsEndpoint | https://www.mycustomserver.com/blobstore/ |
blobstoreConfig | scp://[USERNAME]:[PASSWORD]@[SERVER-DOMAIN-NAME]/blobstore/ |
blobstoreHttpEndpoint | http://www.mycustomserver.com/blobstore/ |
blobstoreHttpsEndpoint | https://www.mycustomserver.com/blobstore/ |
After adding a new blobstore configuration, test it by uploading content.
Multiple blobstores can be specified by using numbered name suffixes. For example blobstoreConfig_0=...
, blobstoreConfig_1=...
, blobstoreConfig_3=...
.
The blobstores must share the same HTTP endpoints (Round Robin DNS).
A newly configured blobstore can be primed using the /blobstore-sync tool. This tool requires a user ID. All blobs accessible to the user will be transferred.
Please contact us before attempting to add a custom blobstore.
DS Loader provides a platform for loading software. Usually this will be a digital signage player but can potentially be anything.
Custom players for the Android platform must implement the following methods:
void start(Context context)
void setLoaderData(Map<String, String> data)
The Context
is an Activity
or a DreamService
. The
custom player must call setContentView(View v)
in the Context
to draw to the screen.
The method setLoaderData()<String, String> data)
receives data and commands from the loader e.g. URL to download sequence data etc.
The loader control communications is designed to instigate secondary communications mechanisms such as JSON data transfer over HTTP. The virtual persistent UDP connection enables the server to instantly send messages to DS Loader and (indirectly) to player software at any time.
To add additional software to the list of players in the interface the following data must be added to a cloud config
player_android_0=custom-player-0.3.jar,com.example.player.CustomPlayer
custom-player-0.3
. When selected, the server will instruct DS Loader
to download custom-player-0.3.jar
and call start()
in the class with the name
com.example.player.CustomPlayer
.
Contact your digitial signage provider for information about adding custom players. Custom players must be added to the server platform and be digitally signed before DS Loader will execute their custom code.
The administration interface has support for multiple languages. A Locale can be added to the path to switch between languages. For example: /zh/.
A default locale can also be applied to cloud config data. For example localeOverride=zh
.
Contact your digitial signage provider for information about adding support for new languages.
All user accounts are protected by an email address and password. Traffic between the web browser and user interface is encrypted using the latest encryption standards (when SSL Certificate installed).
All passwords are scrambled before storage using bcrypt hashing.
Live traffic analysis is performed to prevent brute force attacks. All actions, including failed password attempts, are stored in an audit log that can not be deleted.
A password policy can be defined in a cloud config to restrict passwords that can be used.
There are two layers of security between devices and servers. All data on the first layer (loader comms) is digitally signed by a private key on secure servers. Devices verify the data using a public key before to invoking second layer communications (player comms). The second layer uses digital signatures in additional to an optional TLS connection.
DS Loader will only execute new player applications that are digitally signed with the correct key.
We have the ability to transition to new keys in the event of a private key security breach.
The digital signage service is distributed across servers in America, Europe and Asia using different cloud providers. Traffic is routed to the closest available server using latency based routing with health checks. Asynchronous replication with eventual consistency provides low latency connections, scalability and resilience worldwide. Multimedia is stored and delivered from Amazon S3 and Google Cloud Storage. Additional storage and CDNs can be configured.
Please contact your digital signage administrator before connecting 250 or more screens.
No inbound ports need to be opened in your firewall. Playback synchronisation and blob data sharing on local area network requires no additional configuration.
Type | Port | Notes |
---|---|---|
Loader Control (Outbound connections) | UDP 9091 and TCP 80 | UDP used for instant updates. |
Player Control (Outbound connections) | TCP 80 and TCP 443 | |
Playback Synchronisation (LAN Broadcast) | UDP 9096 | |
Peer to Peer Blob Sharing (LAN Broadcast) | UDP 9097 | Players before v11.0 used UDP 9095 |
Peer to Peer Blob Sharing (LAN Data Transfer) | Ephemeral TCP | Random port assigned when starting. |
Receiving local data and triggers (LAN Broadcast) | UDP 9098 | Requires player v18.5+. Contact supplier for details. |
The following estimates are based on loader comms every 30 seconds and player comms every 1 minute with infrequent updates over a full 24 hour period. Transfer of multimedia must be added to estimations. Blob data is only transferred once and cached locally.
Type | Direction | Calculation | Total |
---|---|---|---|
Loader Control | Device to Server | 100 bytes x 2 x 60 x 24 | 281 KB |
Loader Control | Server to Device | 100 bytes x 2 x 60 x 24 | 281 KB |
Player Control | Device to Server | 2 KB x 60 x 24 | 2880 KB |
Player Control | Server to Device | 10 KB x 24 | 720 KB |
Total | < 5MB (per device per day) |
Local network blob sharing is used when devices display the same content. This eliminates duplicate Internet downloads.