1. Field of the Invention
This invention relates to a platform for the delivery of content and services to networked connected computing devices. The platform enables the rapid development and deployment of content and services to smartphones; typical services include the sale and promotion of products, the digital distribution of tickets, live information aggregated from the internet, and many other use cases.
2. Description of the Prior Art
There are many different platforms for the delivery of content and services to networked computing devices. Reference may be made to articles defining Service Delivery Platforms and related technologies such as LDAP. In addition, reference may be made to the many enterprise and B2C software applications that frequently use the same design patterns in their architecture, such as:
In practice, the repeated implementation of these features for different software applications for the delivery of content and services to networked-connected computing devices is a lengthy, often complex and always time consuming process, and is especially wasteful when those essential elements are commonly duplicated between projects.
The parts of these projects that differ significantly are generally quite minor in comparison to the framework of software written to support them.
Whilst there are “toolkits” of software modules available to ease this repetitive process, they only ease this rather than eliminate it. The aim of this invention is to provide a faster, more efficient and reliable method of delivering content and services to networked connected computing devices.
The invention is a platform for the delivery of content and services to networked connected computing devices, in which the platform stores content by arranging nodes in a hierarchical format that is capable of semantically representing content, with each node including a unique ID and in which the hierarchical format acts as an abstraction layer that insulates a content or service creator and the connected computing devices from being restricted (i) to any specific, predefined data format for the content or (ii) to any specific, predefined transport media for exchanging data over the network.
Optional, implementation features include the following:
A second aspect is a method of providing content and services to networked connected computing devices, in which the method includes the step of using a platform that stores content by arranging nodes in a hierarchical data format that is capable of semantically representing content, with each node including a unique ID and in which the hierarchical format acts as an abstraction layer that insulates a content or service creator and the connected computing devices from being restricted (i) to any specific, predefined data format for the content or (ii) to any specific, predefined transport media for exchanging data over the network.
A third aspect is a platform for the delivery of content and services to networked connected computing devices, in which business logic is represented as modules and these modules can be connected together in a visual development environment, for example using drag-and-drop, to form workflows with modules that can be triggered with an alias from one or more nodes, where the modules produce further nodes and which can then be published for use in workflows
A fourth aspect is a platform for the delivery of content and services to networked connected computing devices, in which the platform selectively pre-fetches and caches POI data only for those geographic regions which meet predefined criteria of popularity, including regularity of requests, frequency of requests, volume of requests, how recent requests have been.
A firth aspect is a platform for the delivery of content and services to networked connected computing devices, in which the platform stores an abstracted record of a customer activity to enable activity to be analysed whilst preserving customers' privacy.
A sixth aspect is a platform for the delivery of content and services to networked connected computing devices, in which the platform provides digital tickets to the connected computing devices for them to display, the tickets including an animated watermark or image that indicates that the ticket is validly available for use.
A seventh aspect is a system including a platform as defined above and multiple network connected computing devices, such as mobile telephones.
Corethree have developed Core Engine, a cutting-edge technology platform for delivering services of many kinds to connected devices. It is a hosted platform and framework for the development and distribution of content and services to smartphones and other networked equipment.
Applications include the sale and promotion of products and offers, the digital distribution of tickets, vouchers and proofs of purchase, live information aggregated from the Internet and many other use cases.
It is designed to make the process of commissioning, building and managing “app-like” services on mobile and connected devices fast and easy, with a lower TCO for our clients than a traditional mobile development project. It allows communication with mobile devices using a standard set of high-level protocols, so that a single set of mobile apps can give access to an unlimited range of applications running on Core Engine.
This specification documents the various components of Corethree's technology, which all fit together to form the solution. At the end of the specification are use cases detailing how Core Engine is used to service various different scenarios.
Corethree's team have worked for many years on enterprise and B2C software applications frequently using the same design patterns in their architecture, such as:
The repeated implementation of these features is a lengthy, often complex and always time consuming process, and is especially wasteful when those essential elements are commonly duplicated between projects. The parts of these projects that differ significantly are generally quite minor in comparison to the framework of software written to support them. Whilst there are “toolkits” of software modules available to ease this repetitive process, they only ease this rather than eliminate it.
Corethree's team focused on the problem and surmised that the common components could be broken down into the following generic elements:
By abstracting industry and application-specific details, the vast majority of user-facing software projects can be broken down into these basic elements.
Corethree have designed and built a set of tools providing these generic elements, and have added to them the means to defile extra business logic to “glue” the elements together into complete applications. This business logic can be defined at run-time without any need to replace components or schedule system downtime, and can be modified equally as easily.
Furthermore, all components have been designed to be incrementally updateable, so that loosely connected parts of the whole can be updated and improved upon whilst retaining backwards compatibility. For example, outlying parts such as client applications on mobile devices will continue to work with new features even if they make use of facilities that are not known to that client application.
The ultimate result is that Corethree has the capability to quickly:
In short, Core Engine allows Corethree to build new solutions capitalising on our clients' existing IT systems and intellectual property in a fraction of the time usually required for a custom application, but with virtually no limitation to the complexity of business logic involved and volume of content delivered. Those solutions are extensible, flexible and since they are built on a single software platform, highly scalable regardless of demand.
The following innovative concepts are described:
Core Engine is a platform for the distribution, aggregation, manipulation and delivery of information with additional features enabling usage monitoring, customer loyalty, and dynamic business workflows. It is a software application which runs on as few or as many servers as are required depending on demand, and is hosted by Corethree. When in operation, it manifests as a service responding via common protocols such as HTTP to individual requests for information from outside client applications.
The combination of a standard specification for client software, open standards-based protocols and server-side business logic means that new services can be built entirely on the server and deployed immediately without client app updates, with the client apps providing display, navigation and interaction with the device's own facilities.
Important characteristics of the system are:
Content may be gathered via a variety of abstract means—for example:
In the latter case, it is left up to the author of these dynamically defined modules to decide how best to structure the final resulting content. Content for consumption by intermediary software, for example, may be structured more simply but less attractively than content ultimately viewed by an end-user.
Core Engine's immense flexibility comes in the form of modules of business logic, which can be glued together to form workflows. All of the high-level functionality within Core Engine is implemented using these modules (“Parts”) and workflows (“Part flows”) built from them.
These high-level modules describe logic implemented using lower-level functionality built into the server software, and other facilities provided by the underlying framework used to build Core Engine itself—in this case, Microsoft .NET.
For clarity, there follows examples of the various functionality at each layer:
In the case of routine interaction with Core Engine's internal functionality, all access is made via a set of Corethree-developed “API” Parts which encapsulate an array of commonly required methods such as those listed above.
Typically, Parts and Part flows are used to integrate with outside systems, define business logic for manipulating content, and allow implement of logic specific to Corethree's clients' solutions.
Parts take the form of code written in C#, with arbitrary inputs and an output value, and “Part flows”, designed using a flowchart-style UI where inputs may be contextual values like the current User or a text box value, or the output of another Part. In this way, parts can be chained together and reuse common functionality.
When saved, Parts are compiled to a native application library for performance—this is crucial, since every single request for information from the outside world is handled by one Part or another. Once loaded (which happens the first time a given Part is requested), it runs as fast as any other part of Core Engine. Core Engine caches these libraries for performance and to conserve memory, and routinely checks for updated versions.
All Parts can be marked as requiring specific permissions on the part of the user triggering their execution. If users are unlikely to ever have these permissions, Core Engine is capable of executing them under impersonation of the original author—this is useful for building reusable Parts to “wrap” potentially dangerous functionality (such as accessing a critical database) in a safe, managed mechanism for use by less able administrators.
Part flows are a layer on top of Parts, and are stored as a series of “elements” with unique references (e.g. “abc123” and “xyz789”), each one of which is either another Part (or Part flow), user-defined value such as a text string or number, or something contextual such as the current User's name. Stored with these is a list of the links between them—for example “abc123 takes the result of xyz789 as its input”.
When the Part flow is created or modified and then saved, the following takes place:
Any Part or Part flow can be marked as “Exposed”. Exposing one of these building blocks makes it available for access via any one of Core Engine's transport media. Transport media are arbitrary ways in which systems consuming Core Engine's data can access it via a computer network—for example:
Each of these media may have its own quirks and in-built mechanisms for passing contextual information—for example, XML-RPC will need to convert content generated within Core Engine into an XML format. As such, Node content can be represented in a multitude of ways, including XML and JSON (see “Nodes”).
The mechanism of exposure can be as simple as a check-box in an administration console, which simply flags the Part as being available to external access. Depending on the transport media, the method of access will vary but will likely be based upon the Part's name. For example, a Part with the name
As with any other triggering of a Part, Parts accessed in this way may have security requirements on the part of the user triggering them. Whether the user is allowed to proceed is based on their (or the application they are using) having identified themselves, and Core Engine cross-checking their allocated rights with those required by the Part. The mechanism for authenticating will depend on the transport medium—for example HTTP AUTH for HTTP transport.
Exposed Parts typically result in the output of structured Node content—see “Nodes” later in this document.
Parts may also have defined some internal functionality for testing both their own logic and any systems that they rely on to function. Tests require no input information and simply result in a “true” or “false”, indicating their success. When a test is defined, Core Engine will periodically perform the test. If the test fails, the author and any other configured administrators can be notified by email or other appropriate means that the Part requires maintenance.
Furthermore, thresholds for acceptable failures, detailed auditing of testing and information about the test process itself, and aggregated business intelligence on success and failure rates can all be configured and used to further improve the reliability of business logic.
Finally, the test itself may modify the behaviour of other Core Engine services in response to a success or failure—for example, updating tabular reporting data, or temporarily suspending a given application if an external service it depends on becomes unavailable.
Similar to the above, Part self-test mechanism, Parts themselves can be scheduled to execute directly on any defined schedule. Core Engine uses “Cron” schedules to define when to execute Parts, but other scheduling methods could also be used, such as a periodic timer. When a Part is run, if it results in an error, the author of the Part and the scheduled job can be notified accordingly, and provided with a log of the execution and failure details.
This facility is immensely powerful, and since Parts can encapsulate almost any kind of dynamic business logic, scheduled Parts can be used to manage most routine tasks involved in keeping the system running smoothly.
Shared application platforms commonly require separation of clients' sensitive information, which is a challenge when data is held in one place. Attempting to unify customer usage data when customers may be shared between those business clients is even more difficult.
There is an increasing need for intelligent methods to analyse how end-users are interacting with online services whilst preserving their right to privacy. This part of the system avoids the need for full disclosure whilst at the same time gaining effective, useful insights into the activities of end-users.
Core Engine abstracts records of customer activity within the system, to allow the use of otherwise sensitive activity information without disclosing details of individual transactions or data belonging to other clients.
The system abstracts the record of an activity from the activity itself, in order to:
The mechanism consists of two elements:
As the above suggests, activities requiring substantial commitment (e.g. a financial purchase) might accrue a higher score than those of a more casual nature (e.g. reading a page of content). Thus, via reports produced for business clients, a customer reward scheme may be constructed around these scores—see “Rewarding activity” further on in this document.
The end result is that since the activity itself is recorded in a generic way, but can now be viewed without full details of the transaction carried out, business clients can be provided with market information based upon these activity class records and the end-users carrying them out without disclosing individual transaction details, which may be of a sensitive nature to both the end-user and the business client fulfilling the transaction.
The activity logging system detailed here, due to its scoring and weighting mechanisms, has applications outside simple business analytics. It can also be used as the basis for a system of rewarding users for their on-going usage of the system (“engagement”).
Internal activity can build-up points on users' aggregated scores, encouraging the further usage of the system. Differing points scores can be assigned using the triggers detailed in the previous section (“Abstraction of Customer Usage Data”) in order to encourage activity in a particular area or set of services in conjunction with a promotional campaign. Since activity is often tied to a specific user, by storing that user's identity details for online services (such as social networks), their activity elsewhere can also influence their aggregated score. For example, by linking a Twitter account with a user's records in the system, every time a user “Tweets”, a Part can be executed, checking to see if the user has promoted a service within the system, logging an activity with associated reward points if so, to encourage users to publicise the system.
Using the combination of the activity logging mechanism and the runtime engine, the system is able to record arbitrary data logged against date and time, triggered via various methods:
The activity logged can store a numerical value against the current date and time using the meta-data attributes. Alongside this value will be an identifier unique to that type of logged data, and permissions indicating who is permitted to view the data.
Once data has been collected, it may be displayed in standard time-series graph form. Multiple sets of data may also be viewed on the same graph, allowing for visual cross-referencing of differing classes of data. Examples of this may be:
Since the activity logging system is part of Core Engine itself, its functionality for both logging and analysis of logs is available from within Parts. Powerful facilities can be built using a combination of logging activity and then using those logs to affect other parts of an application.
The system incorporates a database of content, which is structured hierarchically, and is made up of individual content entities (“Nodes”), each of which has a name, unique identification property (“ID”—generally a GUID), and a number of other arbitrary properties relevant to the content itself. The structure is provided by one-to-many parent-child relationships, where a given Node may have one Parent and multiple Children. In this way, the relationship between Nodes can be represented in a way that is useful for both semantic organisation and visual navigation between Nodes when presented within a user interface. The entire database may be thought of as a tree, with branches represented by the Nodes.
Each Node may have a number of permission definitions assigned to it, which by default cascade down to its children, unless they each over-ride that permission explicitly. Such permissions may control the ability of users and the public to view, edit, delete and otherwise manipulate those Nodes.
Similarly, tags (detailed further on in this document) can provide for the storage of meta-data describing secondary characteristics of each Node, which although not critical to the presentation and processing of a Node, can contain information useful to both the central system and consuming devices. Examples of such tags include presentation information (such as colour schemes for visual rendering), or a geographic location at which the content was originally relevant.
Since each Node has a unique ID and various other properties, the system can allow referral to specific Nodes and branches by means of a textual path, similar to the specification known as XPath. Each path along the tree may be referred to using either a Node's ID or one of its properties, with steps separated by a predefined symbol (e.g. “/”), and the properties prefixed with another positional symbol (e.g. “@”). For example, where Node A has children B and C, and C has a child D, the following may be used to refer to D:
As a shortcut, if the user knows that there is only one Node with a given property, the following may be used:
Access to content using the methods above (named “CorePath”) is subject to the querying user's permissions as cross-referenced to the Nodes they request access to.
As a secondary facility, the above CorePath addresses may also contain keyword place-holders which the system will automatically replace with computed values. These place-holders can be predefined using a custom syntax, or can take the form of short snippets of programming code, delimited to indicate their status as place-holders. For example, using C# code syntax, this pseudo-CorePath could be used to find all Nodes named after a given user:
This allows for very simple filtering based upon criteria such as date and time, user meta-data and other readily available information without the potential complexity of Part aliases.
Each Node has a property defining how long each device consuming the content may store it before requesting fresh content. This may be defined, for example, as the number of seconds from retrieval (“TTL” or “Time To Live”). When a consuming device retrieves content, it should actively monitor the TTL property of relevant content (for example, content currently being viewed by a user), and should request an update if it expires.
Each Node may have a Type. This Type is a text string which identifies the kind of content that this Node contains, along with the properties that it can be expected to have. The specification of the system defines a range of Node Types, which are generic abstractions of common varieties of content. For example:
It will be noted from the above examples that dot-notation is used to indicate the conceptual hierarchy of Node Types. Each nested Type inherits the properties from its parent Type, and sometimes gains further properties. This is intended to ensure that if a consuming device cannot understand a particular type of content (for example, Node.Media.Image), it can “fall-back” to a higher-level Type (for example, a Node). In this example, it would retain the Name property, and so would be able to display to the user a simple navigation item with the Node's name, linking to the target image without display it itself.
The system thus enables elegant evolution of consuming devices' capabilities without rendering previous generations of accessing software immediately obsolete.
Nodes may also represent controls with which users can interact with services and provide their own input in client apps. For example, all of these are currently in use within Core Engine:
“Events” are the general-purpose name for the triggering of a button or some other situation requiring Core Engine to handle it and provide further actions. When an event is triggered by a user, the client app will send a request to an exposed Part, giving it three things:
The Part will then ask Core Engine to find another Part flagged as containing the business logic to handle the event, and will pass execution to that Part, if it's available. Finally, any appropriate business logic will be carried out, possibly involving the values of the other FormControls provided, and a result will be sent back to the client app for presentation to the user. In this way, fully interactive, transactional applications can be built with multiple steps of Nodes with FormControls and Parts to handle each stage.
In Corethree's implementation, creation of Parts to handle events is simply by name. In the case of a button with ID “abc123”, the Part may be named “Handler.Click.abc123”—this convention keeps the processes loosely coupled, allowing for flexibility of implementation and on-going architecture.
Any Node may have any number of Node Tags, which are key/value pairs of strings, permitted to contain any type of meta-data. Tags are designed for several uses:
The anatomy of a Tag Key is simple—it is just a dot-delimited string, with segments used as a namespace mechanism to keep control of the tags used. The rest of this documentation page catalogues the tags used, their purpose, and their creator.
When saved in the database, for reasons of internal query syntax, ‘.’ chars are replaced with “_” (underscores), and so Tag names must not include these.
A Key may have the prefix “C:”, which specifies that that particular Tag should persist to the Child Nodes of the Node upon which it is specified. For example, a hypothetical “C:Style.Header.Color” would apply a header colouring to not only a Node, but also all of its Children.
Keys may also be given the prefix “I:” by the system, which indicates that that Tag has been cascaded down from an ancestor at some point. The prefix (but not the Tag itself) should be ignored by clients unless there is a specific reason to do otherwise.
Tags specifying images can also have optional related Tags giving the width and height of the image, which will be generated automatically when the images are set via Core Control. These will be identical to the main Tag, with the suffix “.W” and “.H”, and will specify an integer pixel value.
As touched upon earlier, Node tags may be used to store information about the geographic region within which a given set of data is relevant. To use an earlier example, a business listings Part flow may generate Nodes representing pizza restaurants in London. The parent Node may, before being sent to consuming devices, have the following tags added:
Combined, these tags indicate (to a consuming device equipped with the means to monitor its geographic location) the area within which those listings are relevant. If the user moves outside of that area whilst viewing the listings, the consuming device is now able to notify the end-user, and allow them to refresh and re-request new content for their new location, or do so automatically.
In a system of substantial size, duplication of information is a risk. As such, the system has mechanisms to allow the referral of content from two locations, and the ability to treat content Nodes as if they are children of one parent Node when they are in fact children of another.
Each Node may have a property which defines that it is a placeholder to another Node (an “alias”). The identity of the other node is referred to using a URL-style string, along with a second property, the “alias mode”, indicating when that alias should be followed:
Alias URLs may be in the following formats:
When Core Engine receives a request for a Node or tree of Nodes which includes Aliases, it will resolve the aliases (depending on the alias mode), merging in the resulting query result or Part output accordingly.
Primarily, aliases are intended to allow for re-use of common content structures, and in order that multiple end-users can access a single set of Nodes without duplication of data. When used in conjunction with Node tags for the storage of meta-data about a particular set of Nodes, they form the basis for a service subscription-management framework:
Thus, many users may access one service, all from within their own “sub-root” of the overall tree, as if it were directly held at that location, whilst allowing administrators to centrally manage that content Node elsewhere.
Additionally, this provides a valuable method to reduce the bandwidth used in consuming devices retrieving these service Nodes, especially when such aliases are marked with the “On Request” mode. This may be very important both for end-users, whose available bandwidth is frequently cost-limited by their service provider, and by Corethree, who will be faced with similar considerations in terms of hosting and bandwidth costs.
Since the ultimate aim of the Node specification is to provide a generic, platform-agnostic format for the representation of semantic content to users, it is essential that such content be easily represented and transferred to those devices used by users for the navigation about the services provided in Node form. Since the data is hierarchical, hierarchical data formats are generally used. For example, XML is an ideal mechanism for the output and transference of Node content, since all properties and relationships can be contained in their original structure as XML entities.
For those consuming devices unable to work with XML, there are many other formats available, including JSON, Protocol Buffers and Thrift, all of which are designed for the textual serialisation of hierarchical data. Furthermore, such data can be exchanged via a variety of common communications protocols, such as HTTP, TCP Sockets, XML-RPC and many others, without interference, often taking advantage of helpful optimisations such as data compression and caching.
Some devices have problems with the deeply nested hierarchical structure of Node data. For that reason, flat/relational can also be provided. In the case of “flat JSON”, data is provided as an array of single JSON Nodes, with parent/child relationships represented using a “ParentID” property and “Ancestors” list.
A full list of formats and transports is impossible to create, as Nodes are by definition agnostic of both format and media. However, by way of example, Nodes could be exchanged using any combination of the following:
By its very nature, any such list is partial—one could come up with a different method of writing down the properties and hierarchy of Nodes and relationships between them, and as long as both ends of an exchange knew how to deal with it, that would be fine. The important factor when considering Nodes is the semantic content. The same (abbreviated) Node could be written in XML:
or indeed a binary format not even human-readable.
In all cases, the content is the same, and irrelevant of the format, the hierarchy is the same and client devices should interpret them the same. It means that the server and client can negotiate the best combination for the capabilities of each at any moment, and the original author need not know in advance, or indeed at the time. Furthermore, if new and more efficient methods of data transfer are developed in the future, client and server can add support and take advantage of it, speeding up interaction—but no other part of the software stack need be affected, including Core Engine's runtime Parts system, the rest of the client app, the database etc.
At the point of consumption, systems consuming this data can adapt it to their needs, resolving textually-represented Node type names (such as “Node.Media.Image”, for example) to their best supported type for that device. Thus, all consuming devices will be capable of rendering a best-attempt representation of any content provided by the main system, a solution ideal for a large, widely-distributed arrangement of consuming devices, which may or may not be up-to-date as the capabilities progress over time.
Core Engine currently stores Node data in MongoDB, which is a non-relational database system designed for high performance and easy changes to the data schema. Nodes are stored in a single collection of individual Nodes with a single root.
As with “flat JSON”, Nodes are kept “loose” and the hierarchy is represented using “ParentID” and “Ancestors” fields. This presents certain challenges—for example, the removal and replacement of an entire branch of the tree requires the old branch to be deleted based on a common ancestor contained in descendants' “Ancestors” list, and then the prefixing of the new Nodes' ancestry with that of their new common parent in order to maintain hierarchical integrity.
Despite each Node tree query often requiring multiple database transactions, the resulting storage system is extremely fast, with complex branch queries often taking under 10 ms to complete.
Node trees' hierarchical nature, together with their ability to store virtually any kind of content and attached meta-data makes them useful as a generic data storage system for all sorts of applications built on top of Core Engine. Examples include:
Parts and applications built using them can store data representing application state (e.g. the stage of a business process the user has reached) in a Node's meta-data tags, and then sent back to the server later. This is similar to how cookies work in web browsers, with the major difference being that this meta-data can be attached to Node content at deeper levels than the one currently being used.
For example, a listing of retail shop locations may contain aliases, each with a tag with a store's name. When that alias is navigated to, and the client app requests resolution of that alias, the tag can be used by a Part to retrieve further details about the chosen store, and then generate more Nodes with a map, picture of the shop front and contact details.
Server-Side State Management—e.g. Retail Inventory
Similarly, Nodes generated and stored either by hand or automatically via Parts can act as a data store.
For example, a small business' mobile and e-commerce system can use Nodes to represent products and categories of product, including user-friendly content, pricing and images, but also the current stock levels in a Node meta-data tag. When an item is ordered and the transaction is handled by a Part or Part flow, that Part can decrement the stock could on an individual item Node, which would then feed back into any user interfaces displaying those Nodes to affect whether that item is available to order. A separate set of Nodes and Parts can also be provided for mobile and exposed Part use (as an HTTP API, for example) to maintain stock records when new stock arrives.
As an aside, activity logging could also come into play here, as a mechanism for auditing and reporting on the transactions affecting stock levels over time. Scheduled Parts could also be used to regularly check stock levels and send automatic notifications to the business owner when they get low.
A combination of Nodes and exposed Parts accessing those Nodes can support a mobile application and website simultaneously. One way to use this would be to store structured information for browsing via Corethree's client apps, including branding and styling meta-data, but also create exposed Parts to provide this data via an HTTP REST API.
That API can then be used by a simple set of ASP.NET or PHP scripts running on an outside web server to generate corresponding web pages using the Node content and a pre-set page template. This is in fact the method used to manage the majority of Corethree's own website.
Points of Interest (PoI) can be generally summarised as any location, expressed within the Core Engine system as a latitude and longitude, which may be of interest to an end-user or as a component piece of information within a service used by end-users.
In order to store and manipulate these generic PoI, Core Engine stores them in an abstract form like so:
An example of their use could be in storing details of retail stores belonging to one of Corethree's clients. A PoI for a restaurant may look like this, if represented using JSON:
In this way, PoI can be handled in a standard way, and aggregated regardless of type without losing their unique properties at the namespace level. Core Engine stores PoI of many kinds in a single database, filtered by location, namespace and various other metadata criteria depending on the usage. Typically, these PoI are first accessed by Parts as a result of an alias resolution or a FormControl event—for example, a page with a TextBox for postcode entry and a Button. When the button is pressed, the “click” event handling Part can search the PoI database for items near the given postcode.
Before sending back to a client app, the PoI will need to be converted into a Node or set of Nodes. This is where the metadata is used—the business logic within the Part processing the request can extract the metadata—for example, a picture of the shop-front—and build a Node to represent the content—for example, a Node.Media.Image to display the picture.
In some situations, PoI of many sorts may be displayed in one listing—such as a list of amenities of various kinds near a user's current location. In this case, the namespace can be used to identify a Part which can generate a listing item (in Node form) and then handle the user navigating to view more details. As with Node event handlers, this is by convention.
In the case of a branch of Carl's Cafe, for example, the Part used to turn a PoI into a list item could be named:
PoIHandler.RenderDetails.com_carlscafe_branches
These handlers can do much more than just display static details—since they produce Nodes as output, they can contain deeper-level menus, purchase processes, table booking and virtually anything else required.
Often, PoI will be drawn from sources outside of Core Engine. In these cases, they may be generated by Parts, either scheduled or triggered by users' requests, and pulled-in from web services or other online data sources. This presents a problem in several ways:
We can resolve these problems by pre-fetching and caching these data in advance. This, though, also creates a problem in that many sources of data are only able to provide data for a limited region at one time. In the case of web services provided for searching for cash machines, for example, we are only able to fetch results for 50 miles around a given latitude and longitude at a time. Pre-fetching the whole of the UK, then, would require approximately 1,890 separate requests, which the owners of the service may object to.
Core Engine avoids this problem like so:
Locations not covered can be fetched separately when required, but this method vastly reduces the volume of location data required to be pre-fetched, as it will only bother with fetching for locations where users regularly require information.
There are various algorithms which can be used to quickly calculate a user's quadrant based on their location—Core Engine generally uses the Maidenhead Locator System, which breaks the grid up into squares represented as 8-character identifiers for convenience, which are approximately 5 km/sq. depending on the location.
Digital tickets are a way for client devices to show limited-access vouchers and tokens as proof of offer or purchase. Corethree use them to produce digital ticketing systems for transport and venue operators, and vouchers for loyalty and retail offers.
They have a few basic properties:
Tickets are stored as logged activities (see “Activity Logging”), and as such may simultaneously be the audit record of that item's purchase or issuance. The distinguishing property of a ticket as opposed to a standard activity is its metadata (again, see “Activity Logging” for further details).
In addition to a unique ID identifying the individual ticket, tickets have several items of meta-data which control their properties:
The last two items above are crucial to the verification of tickets. By making sure that every device with matching DigiticketlD and UpdateResolution displays an identical graphic at any given time, client staff can simply verify matching visuals to confirm validity.
The mechanism for delivery of tickets is via an exposed Part, which fetches all tickets available to the requesting user and then converts them to Nodes, which include both the ticket information above, and also any relevant content such as logos, branding and links to product information.
Tickets are stored on the client-side in a persistent fashion, so that they are available even if the device is operating offline. Tickets can be retrieved from the server at any time by requesting all new items created or updated since a specified date and time—for example, an HTTP request may look like this:
https://[server address]/Corethree/Client Support/FetchTickets?from=[Date/time]
The data format in which the ticket Nodes are delivered can be changed depending on the client device and its capabilities.
Tickets are simply standard Nodes, with the same meta-tags as a Ticket activity on the first child-level Nodes sent back. Each ticket is a normal, navigable Node. Client devices provide a “Tickets and vouchers” navigation choice, which will list saved tickets in the following priority:
Once opened, Tickets are rendered and navigable as standard Nodes, with one key difference: any Nodes with ticket meta-tags should display the animated watermark above all other content bar the title bar.
Expired tickets will simply display a large “Expired” graphic above Node content.
Tickets which have yet to be redeemed will display a button marked “Activate”, with a caption below indicating the validity time within which the ticket will be valid. For example, “Valid for 3 days after redemption”. Upon selecting that button, the user is asked to confirm, with the message “Once you've redeemed this, you'll have [time] to use it”, plus a “Cancel” and “Yes, please” buttons. Confirmation of redemption will immediately:
Tickets currently available to use will display an animated watermark, generated using the following process:
Once the values for colour and code have been generated, graphical layers are displayed, from back to front:
A countdown timer is shown below the watermark, displaying a live indication of the validity time remaining.
The ticket's Daytime Mask may contain details specifying when the ticket should be available to use. If this is not defined, or the ticket has expired, this should be ignored, but if it's present, client devices MUST check it before allowing access.
An example of how this mask may be represented in JSON is as follows:
As the above example suggests, the rule set is made up of an array of JSON objects, where each individual rule can comprise:
When evaluating rules for a match to the current date and time, all items within a single rule must match, but any of the rules in the set can match.
A rule specifying that a ticket is valid off-peak on weekdays, and all weekend would be:
Once a ticket has been redeemed on the client, the device will attempt to inform the server using an exposed Part. If not online, or if an error occurs, then the ticket will be added to a local queue that will attempt to activate the tickets again once every minute.
Core Engine's integration capabilities extend easily to equipping applications with the means to take payments from customers in a variety of ways. Applications from consumer mobile commerce and food ordering to commercial insurance sales may require the secure collection of payment details of one sort or another—most frequently credit or debit card details.
Outside of pure payment applications, there are other scenarios requiring the use of securely stored data not limited to card details—various kinds of information may need to be stored on client devices. For example, billing addresses may be entered many times, so it's advantageous to store them for re-use.
However, in order to keep our clients' options open in terms of how these details are used, we required a mechanism to store them in a way that they could be accessed in their original form. Thus, Core Engine can switch to a different payment provider (for example) without asking end-users to re-enter them. In order to do this securely, we have specified a split-encryption mechanism to store data on the client device and the key centrally, with no way to link them until the user needs to use them.
The process is quite straightforward and makes use of industry standard public/private key encryption in an innovative way:
When the user is ready to actually use the details, the process is similar:
When a user is presented with a payment form, a “Secure Wallet Picker” control can be displayed by the client device. This can be a standard list box, populated with all stored data items of type matching the appropriate type of secure item. There will also be an “Add Item” option, in case the user needs to create a new payment method, or none yet exist.
If the user needs to add a new item, the client app will make a call to the server using the following URL, sending the type of the item being registered. For example:
https://[server address]/Corethree/ClientSupport/GetSecureWalletAdditionForm?type=[Item type]
This will send back a structure of Nodes generated to take the details of the new item. It's up to the server to ensure that the form is suitable for the given kind of item. The client device simply needs to browse that returned content.
When registration is complete, a Node (generally a message to be popped-up) will be sent back to confirm the addition. This message will have several additional Node Tags containing data relevant to the process:
Secure data items contain the following fields:
Separately from addition, Core Engine may also send UI information to the client device to display a picker for item removal. In this case, it'll work exactly the same as any other form submission.
The only difference is that the subsequent response will include a Node Tag to command the client to delete a payment item:
This process has several key advantages:
A complete transport ticketing system can be built using the following elements:
Core Engine's content management system is used to store a structure of Nodes providing categorised ticket types, with Node tags used to store:
The user navigates this content and adds product items to their shopping basket, before submitting it using a Node.FormControls.Button. The handling Part calculates a total price and checked the validity of the products, and generates a summary, plus a secure wallet picker for the payment card, and a Node.FormControls.TextBox for the user's CV2 code. Another Node.FormControls.Button triggers a Part which sends the transaction information to a payment processor, and then presents the results to the user.
If the transaction was successful, it also logs a “Successful Purchase” activity, with the transaction details. A separate activity is logged for each ticket purchased, with its metadata containing the digital ticket ID, expiry date and time and other relevant details.
The client app then requests any new tickets, and a Core Engine Part sends back a structure of Nodes representing the generated tickets. The client device can then examine the Nodes' metadata to extract the properties detailed in “Properties and storage”, and display the ticket's watermark for validation.
This model is also applicable, with appropriate modifications for the use case, for:
A food pre-ordering solution can be built using:
Core Engine's content management system is used to store a structure of Nodes providing categorised products, with Node tags used to store:
In this case, when the user chooses their order and checks-out, an order activity is logged, and the user is shown a digital receipt confirming their order.
Separately, a scheduled Part runs every 30 seconds, checking for new but unprocessed orders. The Part will pick up a batch of new orders and submit them using a third-party vendor's API, so that the merchant's POS system can send the order to the kitchen for preparation.
When the order is ready for collection, the POS system can submit an HTTP REST request back to another exposed Part, providing the order number and the new status as “Ready”. That Part can then fetch the order details from the originally logged activity, look-up the user's details and send them a notification to tell them that their food is ready to collect.
With minor changes to the fulfilment process—for example, using a digitally watermarked ticket as a proof-of-purchase—this is also applicable to:
In combination with the “Transport ticketing” and “Mobile shopping” for booking and entry, Core Engine can provide a complete solution for any venue with a fast-changing schedule of events.
The system itself can be used to build and administration application for venue organisers. For each event scheduled, administrators can use their smartphones or web-admin systems to enter details of the upcoming event, including exhibitors, performances and so on.
Parts designed to process this input can generate Nodes from branded templates, populated with the given information to give the end result of a professional, well-presented source of visitor information for those attending.
Together with the “Mobile shopping” use case for merchants inside the venue, visitors can also be provided with mobile ordering and payment of refreshments and merchandising, cutting down on queues and delays during their visit.
An integrated, live transport information system can draw multiple sources of data into one place. For example, a train operating company (TOC) may have IT systems providing information on various elements of their operation. Typically, these data will be functional and not designed for consumption by the general public.
The solution can make us of:
At the top level of navigation, Nodes are used to provide navigation to a list of rail stations, current delays and other relevant information. On navigating to the list of stations, a Part will fetch PoI representing rail stations operated by the TOC, filtering using the user's location and namespace corresponding to the TOC. Navigating to the list of delays will trigger a Part which will fetch a list of delays from a network operations provider subcontracted by the TOC.
In both cases, navigating further will submit a Node alias (which will have a station code in its metadata tags) to a Part. That Part will extract the station code from the triggering Node, and perform several functions:
Finally, it will build a Node structure to display all of this information intuitively, with appropriate icons indicting services running on time and those delayed, and send it all to the client app. Further detail may be provided to an even deeper level using the same techniques.
Using the model pioneered by “pay by phone”-style operators, Core Engine can easily be configured to manage both sides of a self-service parking scheme, using:
A set of Nodes provides a user interface allowing users to see a list of parking locations nearby their current position. On choosing their closest location, they are asked to enter a time period (in minutes, for example), and choose a payment method. Finally, they enter their car registration and their CV2 code, and payment is taken. An activity is logged for the parking payment, along with metadata recording the duration, expiry and customer's vehicle registration details.
Enforcement officers also have a UI accessed from parking authority-issued smartphones. The UI lists all of the paid-for vehicles nearby, also allowing search for a specific vehicle registration. If a given vehicle has not been paid for, the UI will also allow for a penalty to be sent by taking a photograph (potentially with a Node.FormControls.ImageUpload control) and triggering of a Part with a Button “click”, sending an email to the enforcement office for further processing.
Finally, the same end-user-facing process can be provided by an automated telephone response system (IVR). Exposed Parts can provide data to an IVR API to submit parking and payment details by telephone, using caller ID to recognise the user and retrieve their payment details, before asking for the time period, location and CV2 code. SMS messages or other notifications can be sent to users when their time is near expiry, inviting them to extend parking by re-entering the UI once more.
Using the PoI handler system (see “PoI Handlers”) and the results of analysis of logged activities, users may be presented on request with a list of various services which are either nearby or serendipitous to their recent behaviour.
Although simple as a concept, each item in this list can be a gateway to any of the use cases above (and a virtually infinite variety of others), and thus will be an ecosystem of interlinked services all accessible via one common user-interface. The user's experience will be a smooth and easy one, since their payment details will be on hand for any transactions they might need to pay for, and information about recent activity can be used in cross-promotions and in tailoring each service to direct the user to the information most applicable to their account profile.
Furthermore, various business clients of Corethree are able to work together to identify shared customers and promote mutually complementary services and products via the platform.
Core Engine can be used to unify disparate automation technologies in buildings or even regions, using:
Users can use Core Engine's web-based administration system to configure systems available for control such as power management, weather monitoring, security and other systems. This process, which can pass information on new systems to Parts for configuration, will result in the generation of Nodes in the user's own services list, preconfigured to point to Node aliases to other Parts providing control functions.
When accessed, various UI workflows can trigger calls from Parts to outside systems connected via web services to do things like control lighting and entertainment systems, monitor security systems and report on power consumption. Scheduled Parts can automatically check current statistics and either act without intervention, or notify a user or users of the changes. Outside systems can themselves use exposed Parts to actively send data into Core Engine, potentially triggering another course of action on its own.
Finally, changes to outside systems can be logged as activities and reported on as with any other activity data, Examples might include:
All of the elements of Core Engine are available to mobilise services which Corethree's business customers already use. Examples of this include:
This appendix describes the invention with reference to the drawings.
In this diagram, each outlined block is a Node, which when delivered to a device such as a smartphone may be displayed in a set of list-based navigation menus.
Retail outlets 1 and 2 are clients of the service provider. They each define their own information, including location and staff content which is specific to that particular location. However, the room service menu is a shared resource which both outlets have in common. In order to avoid duplication of data, and to allow administrators to manage just one set of content rather than two identical sets, two aliases are created as children of each of the retail outlet's main menu, both referring to the room service menu Node. When a client device requests the content for retail outlet 1, for example, Core Engine will resolve the alias, sending the client device the full tree including the segments indicated with dashed outlines. Thus, the user's perception will be of a single integrated tree of content, where each retail outlet appears to have its own room service menu.
In this diagram, the top section illustrates a critical path from a root Node in a Core Engine content database to content up to six levels below the root. Each block represents a single Node, with the connections between blocks from left to right indicating a parent-child relationship. Note that one or more of the Nodes shown could potentially be the result of an Alias having been resolved by Core Engine before the complete tree was delivered to a client device.
The lower section illustrates the corresponding wireframe view that a user may see displayed on a mobile device's screen. Each screen is the practical rendering of the Node directly above it in the upper section. The illustration indicates that any path through a set of Nodes from root to any deep-level descendant may be navigated by a user in the form of hierarchical lists, which is an established and easily understood means for drilling-down through content of increasing specificity.
On the left of this diagram, a Node tree is defined, representing navigation and content related to a hypothetical bus operator using Core Engine. The data may be manually defined (by a member of an administration team), or generated elsewhere as a result of a Part being scheduled or otherwise triggered and that having imported data and produced the tree as a result.
In either case, a user will navigate through the content, drilling-down to ticket categories (e.g. “Daily tickets”) and then individual product types (e.g. “Item 1”, “Item 2”). After choosing their desired products using a shopping list-type mechanism on their device, the submit the choices back to Core Engine, which feeds those choices into the “Checkout” event handler Part flow. The Part flow gathers the shopping list, user details and product prices and executes a “Process transaction” Part, which in turn triggers an “Issue tickets” Part. That Part will log the ticket purchase, and an activity for each individual ticket—the log will include the user's details, payment method and ticket product details.
Finally, the Part flow will generate Node content for each logged ticket item, which may include content such as the digital watermark and expiry details. Client devices can request a full list of available tickets at any time, which will be re-generated from the activity log on demand.
Number | Date | Country | Kind |
---|---|---|---|
1108709.5 | May 2011 | GB | national |
1121885.6 | Dec 2011 | GB | national |
Filing Document | Filing Date | Country | Kind | 371c Date |
---|---|---|---|---|
PCT/GB2012/051168 | 5/24/2012 | WO | 00 | 2/10/2014 |