Method, system, and program storage device for managing tenants in an industrial internet of things

In an example embodiment, a method, system, and program storage device for binding an industrial application to a plurality of services in an Industrial Internet of Things (IIoT) is provided. For each of a plurality of tenants, a service template corresponding to a group in which the corresponding tenant belongs is retrieved and an instance of the industrial application is instantiated for the corresponding tenant. Then, at runtime of an instance of the industrial application, a number of actions are taken. A request by the instance of the industrial application for a service identified by a first service name is detected. Then a credential for the service name is retrieved, with the credential identifying a location where an instance of the service identified by the first service name resides. The service identified by the first service name is then dynamically called using the location.

TECHNICAL FIELD

This application relates generally to industrial equipment. More particularly, this application relates to managing tenants in an industrial Internet of Things.

BACKGROUND

The traditional Internet of Things (IoT) involves the connection of various consumer devices, such as coffee pots and alarm clocks, to the Internet to allow for various levels of control and automation of those devices. The Industrial Internet of Things (IIoT), on the other hand, involves connecting industrial assets as opposed to consumer devices. There are technical challenges involved in interconnecting diverse industrial assets, such as wind turbines, jet engines, and locomotives, that simply do not exist in the realm of consumer devices.

DETAILED DESCRIPTION

Overview

In an example embodiment, a new concept of tenant is introduced for the purposes of IIoT implementations, Specifically, each tenant is comprised not just of a customer but also of a bundle of services. In an example embodiment, this new concept of tenant is implemented using templates. These templates can be defined broadly or narrowly. Specifically, there could be one template used for all tenants or different templates used for different configurations of groups of tenants (e.g., one template for industrial customers, one template for commercial customers, or alternatively grouped by industry, etc.). Furthermore, the resolution of service instance credentials can be performed at runtime, allowing for alterations in the instantiations/bindings to occur without requiring restarting the application.

Some of the technical challenges involved in an IIoT include items such as predictive maintenance, where industrial assets can be serviced prior to problems developing to reduce unplanned downtimes. As such, one such technical challenge involves prediction of when industrial assets or parts thereon will fail. In an example embodiment, an IIoT may be designed that monitors data collected from sensors and, using physics-based analytics, detects potential error conditions based on an asset model. The asset in question can then be gracefully shut down for maintenance at the appropriate time. In addition to these types of edge applications (applications involving the industrial assets directly), the IIoT may also pass the sensor data to a cloud environment where operational data for all similar machines under management can be stored and analyzed. Over time, data scientists can discover new patterns and create new and improved physics-based analytical models. The new analytical model can then be pushed back to all of the assets, effectively improving the performance of all assets simultaneously.

FIG. 1is a block diagram illustrating a system100, in accordance with an example embodiment, implementing an IIoT. An industrial asset102, such as a wind turbine as depicted here, may be directly connected to an IIoT machine104. The IIoT machine104is a software stack that can be embedded into hardware devices such as industrial control systems or network gateways. The software stack may include its own software development kit (SDK). The SDK includes functions that enable developers to leverage the core features described below.

One responsibility of the IIoT machine104is to provide secure, bi-directional cloud connectivity to, and management of, industrial assets, while also enabling applications (analytical and operational services) at the edge of the IIoT. The latter permits the delivery of near-real-time processing in controlled environments. Thus, the IIoT machine104connects to an IIoT cloud106, which includes various modules, including asset module108A, analytics module108B, data module108C, security module108D, and operations module108E, as well as data infrastructure110. This allows other computing devices, such as client computers, running user interfaces/mobile applications to perform various analyses of either the individual industrial asset102or assets of the same type.

The IIoT machine104also provides security, authentication, and governance services for endpoint devices. This allows security profiles to be audited and managed centrally across devices, ensuring that assets are connected, controlled, and managed in a safe and secure manner, and that critical data is protected.

In order to meet requirements for industrial connectivity, the IIoT machine104can support gateway solutions that connect multiple edge components via various industry standard protocols.FIG. 2is a block diagram illustrating different edge connectivity options that an IIoT machine104provides, in accordance with an example embodiment. There are generally three types of edge connectivity options that an IIoT machine104provides: machine gateway (M2M)202, cloud gateway (M2DC)204, and mobile gateway (M2H)206.

Many assets may already support connectivity through industrial protocols such as Open Platform Communication (OPC)-UA or ModBus. A machine gateway component208may provide an extensible plug-in framework that enables connectivity to assets via M2M202based on these common industrial protocols.

A mobile gateway component212enables people to bypass the IIoT cloud106and establish a direct connection to an asset102. This may be especially important for maintenance scenarios. When service technicians are deployed to maintain or repair machines, they can connect directly from their machine to understand the asset's operating conditions and perform troubleshooting. In certain industrial environments, where connectivity can be challenging, the ability to bypass the cloud and create this direct connection to the asset may be critical.

As described briefly above, there are a series of core capabilities provided by the IIoT system100. Industrial scale data, which can be massive and is often generated continuously, cannot always be efficiently transferred to the cloud for processing, unlike data from consumer devices. Edge analytics provide a way to preprocess the data so that only the pertinent information is sent to the cloud. Various core capabilities provided include file and data transfer, store and forward, local data store and access, sensor data aggregation, edge analytics, certificate management, device provisioning, device decommissioning, and configuration management.

As described briefly above, the IIoT machine104can be deployed in various different ways. These include on the gateway, on controllers, or on sensor nodes. The gateway act as a smart conduit between the IIoT cloud106and the asset(s)102. The IIoT machine104may be deployed on the gateway device to provide connectivity to assets)102via a variety of protocols.

The IIoT machine104can be deployed directly onto machine controller units. This decouples the machine software from the machine hardware, allowing connectivity, upgradability, cross-compatibility, remote access, and remote control. It also enables industrial and commercial assets that have traditionally operated standalone or in very isolated networks to be connected directly to the IIoT cloud106for data collection and live analytics.

The IIoT machine104can be deployed on sensor nodes. In this scenario, the intelligence lives in the IIoT cloud106and simple, low-cost sensors can be deployed on or near the asset(s)102. The sensors collect machine and environmental data and then backhaul this data to the IIoT cloud106(directly or through an IIoT gateway), where it is stored, analyzed, and visualized.

Customers or other users may create applications to operate in the IIoT cloud106. While the applications reside in the IIoT cloud106, they may rely partially on the local IIoT machines104to provide the capabilities to gather sensor data, process it locally, and then push it to the IIoT cloud106.

The IIoT cloud106enables the IIoT by providing a scalable cloud infrastructure that serves as a basis for platform-as-a-service (PaaS), which is what developers use to create Industrial Internet applications for use in the IIoT cloud.

Referring back toFIG. 1, services provided by the IIoT cloud and generally available to applications designed by developers include asset services from asset module108A, analytics services from analytics module108B, data services from data module108C, application security services from security module108D, and operational services from operations module108E.

Asset services include services to create, import, and organize asset models and their associated business rules. Data services include services to ingest, clean, merge, and ultimately store data in the appropriate storage technology so that it can be made available to applications in the manner most suitable to their use case.

Analytics services include services to create, catalog, and orchestrate analytics that will serve as the basis for applications to create insights about industrial assets. Application security services include services to meet end-to-end security requirements, including those related to authentication and authorization.

Operational services enable application developers to manage the lifecycle and commercialization of their applications. Operational services may include development operational services, which are services to develop and deploy Industrial Internet applications in the cloud, as well as business operational services, which are services that enable transparency into the usage of Industrial Internet applications so that developers can ensure profitability.

The asset model may be the centerpiece of many, if not all, Industrial Internet applications. While assets are the instantiations of asset types (types of industrial equipment, such as turbines), the asset model is a digital representation of the asset's structure. In an example embodiment, the asset service provides Application Program Interfaces (APIs), such as Representational State Transfer (REST) APIs that enable application developers to create and store asset models that define asset properties, as well as relationships between assets and other modeling elements. Application developers can then leverage the service to store asset-instance data. For example, an application developer can create an asset model that describes the logical component structure of all turbines in a wind farm and then create instances of that model to represent each individual turbine. Developers can also create custom modeling objects to meet their own unique domain needs.

In an example embodiment, the asset module108A may include an API layer, a query engine, and a graph database. The API layer acts to translate data for storage and query in the graph database. The query engine enables developers to use a standardized language, such as Graph Expression Language (GEL), to retrieve data about any object or property of any object in the asset service data store. The graph database stores the data.

An asset model represents the information that application developers store about assets, how assets are organized, and how they are related. Application developers can use the asset module108A APIs to define a consistent asset model and a hierarchical structure for the data. Each piece of physical equipment may then be represented by an asset instance. Assets can be organized by classification and by any number of custom modeling objects. For example, an organization can use a location object to store data about where its pumps are manufactured, and then use a manufacturer object to store data about specific pump suppliers. It can also use several classifications of pumps to define pump types, assign multiple attributes, such as Brass or Steel, to each classification, and associate multiple meters, such as Flow or Pressure, to a classification.

Data services from the data module108C enable industrial Internet application developers to bring data into the system and make it available for their applications. This data may be ingested via an ingestion pipeline that allows for the data to be cleansed, merged with data from other data sources, and stored in the appropriate type of data store, whether it be a time series data store for sensor data, a Binary Large Object (BLOB) store for medical images, or a relational database management system (RDBMS).

Since many of the assets are industrial in nature, much of the data that will commonly be brought into the IIoT system100for analysis is sensor data from industrial assets. In an example embodiment, a time series service may provide a query efficient columnar storage format optimized for time series data. As the continuous stream of information flows from sensors and needs to be analyzed based on the time aspect, the arrival time of each stream can be maintained and indexed in this storage format for faster queries. The time series service also may provide the ability to efficiently ingest massive amounts of data based on extensible data models. The time series service capabilities address operational challenges posed by the volume, velocity, and variety of IIoT data, such as efficient storage of time series data, indexing of data for quick retrieval, high availability, horizontal scalability, and data point precision.

The application security services provided by the security module108D include user account and authentication (UAA) and access control. The UAA service provides a mechanism for applications to authenticate users by setting up a UAA zone. An application developer can bind the application to the UAA service and then use services such as basic login and logout support for the application, without needing to recode these services for each application. Access control may be provided as a policy-drive authorization service that enables applications to create access restrictions to resources based on a number of criteria.

Thus, a situation arises where application developers wishing to create industrial applications for use in the IIoT may wish to use common services that many such industrial applications may use, such as a log-in page, time series management, data storage, and the like. The way a developer can utilize such services is by instantiating instances of the services and then having their applications consume those instances. Typically, many services may be so instantiated.

There is a desire among developers to develop applications that are capable of being multi-tenant. Multi-tenant applications allow for different customers of the application to “share” the application (in the cloud), while having their respective data kept private from each other (called “isolation”), Thus, in such circumstances, an application developer may need to instantiate different instances of each service used by the application for the different customers. Thus, if an application is designed to consume four IIoT cloud services, and the application has two different customers, the application developer must eventually instantiate eight different instances. This can be very time consuming and resource intensive. Each instance must be instantiated and then bound to the application. Additionally, once the bindings are complete, the application needs to be restarted, which causes downtime. Thus, if a new tenant/customer is added to an application, the application developer not only needs to instantiate four new instances for the services and bind them to the application, but also cause downtime for the application in order to restart the application for all tenants to ensure that the changes take effect.

In an example embodiment, a new concept of tenant is introduced for the purposes of IIoT implementations. Specifically, each tenant is comprised not just of a customer but also of a bundle of services.

In an example embodiment, this new concept of tenant is implemented using templates. These templates can be defined broadly or narrowly. Specifically, there could be one template used for all tenants, or different templates used for different configurations of groups of tenants (e.g., one template for industrial customers, one template for commercial customers, or alternatively grouped by industry, etc.).

Furthermore, the resolution of service instance credentials can be performed at runtime, allowing for alterations in the instantiations/bindings to occur without requiring restarting the application.

Referring back toFIG. 1, the instantiations and bindings may be performed using a service broker112. Applications114A-114C, which are created by a developer and run on the cloud, may be hosted by application platform116.

Customers118A-118bmay then interact with applications114A-114C to which they have subscribed. Here, for illustrative purposes, customers118A and118B are both tenants of application114A. A tenant service120may be used to manage tenant-related modifications, such as management of templates and creation of tenants.

FIG. 3is an interaction diagram illustrating a method300of establishing a new tenant. The method utilizes an application302, a UAA zone304, and a tenant service instance306. At operation308, the tenant service instance306is created by the application302. At operation310, the application is bound to the tenant service instance306. At operation312, a client identification (ID) is created (or an existing one reused) to access the tenant service instance306, and registered with the UAA zone304.

At operation314, a lookup is performed to locate the tenant service instance location. At operation316, credentials for the client ID are requested from the UAA zone304, which are returned at operation318.

At operation320, a service template is defined by the application302on the tenant service306. At operation322, an identification for this template is returned to the application302. The template comprises a collection of service names and service plans and thus may be created by the application302specifying these items to the tenant service306. At operation322, a new tenant is created by the application302on the tenant service306by passing the template identification to the tenant service306. It should be noted that in some example embodiments, the application302need not pre-register the template and the template can simply be created at operation322by the application302providing the service names and service plans at that time.

At operation324, a notification that the provisioning of the tenant is in process is sent to the application302by the tenant service. For example, this notification may be in the following format:

At operation326, the application302may periodically or continuously poll for the status of the provisioning. At operation328, the tenant service306may notify the application302that the tenant has been provisioned. For example, this notification may be in the following format:

At operation330, the application302may create the scope/authority for each service for a scope returned by the tenant service306in the notification in operation328.

FIG. 4is an interaction diagram illustrating a method400, in accordance with an example embodiment, of providing tenant service access. The method400may utilize a customer402, an application404, a tenant service406, a UAA zone408, and an asset service410. In some example embodiments the application404may be the same application as application302, the tenant service406may be the same service as tenant service306, and the UAA zone408may be the same zone as UAA zone304. At operation412, the customer402may request a resource from the application404. This resource may utilize a service and the request may include an identification of the service. At operation414, the application404may lookup a tenant identification for the customer402in an application database. At operation416, the application404may request credentials for the client from the UAA zone408. At operation418, these credentials may be returned.

At operation420, the application404may look up a tenant service credential for the service name. At operation422, the credential for the service name is returned. For example, this credential may be in the following format:

As can be seen, this credential includes a location of a tenant specific instance of the service. At operation424, the application may call the tenant specific instance from asset service410using this location. Thus, because the location is retrieved at runtime, and specifically at the time the resource/service is requested, it is not necessary to restart the application for a binding to take effect; essentially, the application404has been dynamically bound to the service instance.

It should be noted that while the above describes calling the tenant service for each request, in an example embodiment, this can be avoided by pre-loading a tenant service instance mapping into memory at application bootstrap.

FIG. 5is a diagram illustrating an example tenant registry500, in accordance with an example embodiment. The tenant registry500may be used by the tenant service406to keep track of which tenants have been assigned which service. Specifically, for each combination of application, tenant, and service, a different row in the registry500is provided. Each row may store, for the combination of tenant and service, an identification502of the application, an identification of the space504in which the application resides, an identification of the tenant506, an identification of the service508, an identification of the service instance510, a credential512, and a scope514.

Additionally, if a tenant is deleted, the tenant service deletes instances of the tenant in the tenant registry500, which also acts to delete the service instances related to the tenant.

FIG. 6is a block diagram illustrating an IIoT architecture600, in accordance with an example embodiment. This figure presents a logical depiction of the components of the IIoT architecture600. An application602resides in a space604on a Software-as-a-Service (SaaS) component606. A tenant service instance608instantiates tenant specific services610A-610C and612A-612C, as described earlier, based on one or more templates set up establishing bundles of instances. A PaaS component614hosts its own space616in which various services618A-618D are hosted. The application602, may, for example, retrieve tenant specific service details from the tenant service610to use to instantiate the tenant service instance608, which may then be used at run-time to instantiate the tenant specific services610A-610C and612A-612C, which then can be used to access services618A-618C (although only accessing service610A is depicted here).

FIG. 7is a flow diagram illustrating a method700, in accordance with an example embodiment, of binding an industrial application to a plurality of services in an IIoT. A loop is begun for each of a plurality of tenants. At operation702, an instance of a tenant service is created for the corresponding tenant. At operation704, the industrial application is bound to the instance of the tenant service. At operation706, a client identification for the corresponding tenant is registered with a UAA zone. At operation708, a lookup is performed to locate a location of the instance of the tenant service. At operation710, credentials for the corresponding tenant are requested from the UAA zone.

At operation712, a service template corresponding to a group in which the corresponding tenant belongs is retrieved using the credentials. The service template contains a plurality of service identifications representing a bundle of services assigned to the group. At operation714, an instance of the industrial application is instantiated for the corresponding tenant. At operation716, it is determined if there are any additional tenants to establish for the industrial application. If so, then the method700loops back to operation702for the next tenant.

If not, then at operation718, a request by the instance of the industrial application for a service identified by a first service name is detected. At operation720, a credential is retrieved for the first service name. The credential identifies a location where an instance of the service identified by the first service name resides. At operation722, the service identified by the first service name is dynamically called using the location.

Modules, Components, and Logic

Machine and Software Architecture

The modules, methods, applications, and so forth described in conjunction withFIGS. 1-7are implemented, in some embodiments, in the context of a machine and an associated software architecture. The sections below describe representative software architecture(s) and machine (e.g., hardware) architecture(s) that are suitable for use with the disclosed embodiments.

Soft Architecture

FIG. 8is a block diagram800illustrating a representative software architecture802, which may be used in conjunction with various hardware architectures herein described.FIG. 8is merely a non-limiting example of a software architecture802, and it will be appreciated that many other architectures may be implemented to facilitate the functionality described herein. The software architecture802may be executing on hardware such as a machine900ofFIG. 9that includes, among other things, processors910, memory/storage930, and I/O components950. A representative hardware layer804is illustrated and can represent, for example, the machine900ofFIG. 9. The representative hardware layer804comprises one or more processing units806having associated executable instructions808. The executable instructions808represent the executable instructions of the software architecture802, including implementation of the methods, modules, and so forth ofFIGS. 1-7. The hardware layer804also includes memory and/or storage modules810, which also have the executable instructions808. The hardware layer804may also comprise other hardware812, which represents any other hardware of the hardware layer804, such as the other hardware illustrated as part of the machine900.

In the example architecture ofFIG. 8, the software architecture802may be conceptualized as a stack of layers where each layer provides particular functionality. For example, the software architecture802may include layers such as an operating system814, libraries816, frameworks/middleware818, applications820, and a presentation layer844. Operationally, the applications820and/or other components within the layers may invoke API calls824through the software stack and receive a response, returned values, and so forth illustrated as messages826in response to the API calls824. The layers illustrated are representative in nature, and not all software architectures have all layers. For example, some mobile or special purpose operating systems may not provide a frameworks/middleware818, while others may provide such a layer. Other software architectures may include additional or different layers.

The operating system814may manage hardware resources and provide common services. The operating system814may include, for example, a kernel828, services830, and drivers832. The kernel828may act as an abstraction layer between the hardware and the other software layers. For example, the kernel828may be responsible for memory management, processor management (e.g., scheduling), component management, networking, security settings, and so on. The services830may provide other common services for the other software layers. The drivers832may be responsible for controlling or interfacing with the underlying hardware. For instance, the drivers832may include display drivers, camera drivers, Bluetooth® drivers, flash memory drivers, serial communication drivers (e.g., Universal Serial Bus (USB) drivers), Wi-Fi® drivers, audio drivers, power management drivers, and so forth, depending on the hardware configuration.

The libraries816may provide a common infrastructure that may be utilized by the applications820and/or other components and/or layers. The libraries816typically provide functionality that allows other software modules to perform tasks in an easier fashion than to interface directly with the underlying operating system814functionality (e.g., kernel828, services830, and/or drivers832). The libraries816may include system libraries834(e.g., C standard library) that may provide functions such as memory allocation functions, string manipulation functions, mathematic functions, and the like. In addition, the libraries816may include API libraries836such as media libraries (e.g., libraries to support presentation and manipulation of various media formats such as MPEG4, H.264, MP3, AAC, AMR, JPG, PNG), graphics libraries (e.g., an OpenGL framework that may be used to render 2D and 3D in a graphic context on a display), database libraries (e.g., SQLite that may provide various relational database functions), web libraries (e.g., WebKit that may provide web browsing functionality), and the like. The libraries816may also include a wide variety of other libraries838to provide many other APIs to the applications820and other software components/modules.

The frameworks/middleware818may provide a higher-level common infrastructure that may be utilized by the applications820and/or other software components/modules. For example, the frameworks/middleware818may provide various graphic user interface (GUI) functions, high-level resource management, high-level location services, and so forth. The frameworks/middleware818may provide a broad spectrum of other APIs that may be utilized by the applications820and/or other software components/modules, some of which may be specific to a particular operating system or platform.

The applications820include built-in applications840and/or third-party applications842. Examples of representative built-in applications840may include, but are not limited to, a contacts application, a browser application, a book reader application, a location application, a media application, a messaging application, and/or a game application. Third-party applications842may include any of the built-in applications840as well as a broad assortment of other applications. In a specific example, the third-party application842(e.g., an application developed using the Android™ or iOS™ software development kit (SDK) by an entity other than the vendor of the particular platform) may be mobile software running on a mobile operating system such as iOS™, Android™, Windows® Phone, or other mobile operating systems. In this example, the third-party application842may invoke the API calls824provided by the mobile operating system such as the operating system814to facilitate functionality described herein.

The applications820may utilize built-in operating system functions kernel828, services830, and/or drivers832), libraries (e.g., system libraries834, API libraries836, and other libraries838), and frameworks/middleware818to create user interfaces to interact with users of the system. Alternatively, or additionally, in some systems, interactions with a user may occur through a presentation layer, such as the presentation layer844. In these systems, the application/module “logic” can be separated from the aspects of the application/module that interact with a user.

Some software architectures utilize virtual machines. In the example ofFIG. 8, this is illustrated by a virtual machine848. A virtual machine creates a software environment where applications/modules can execute as if they were executing on a hardware machine (such as the machine900ofFIG. 9, for example). The virtual machine848is hosted by a host operating system (operating system814inFIG. 8) and typically, although not always, has a virtual machine monitor846, which manages the operation of the virtual machine848as well as the interface with the host operating system (i.e., operating system814). A software architecture executes within the virtual machine848, such as an operating system850, libraries852, frameworks/middleware854, applications856, and/or a presentation layer858. These layers of software architecture executing within the virtual machine848can be the same as corresponding layers previously described or may be different.

Example Machine Architecture and Machine-Readable Medium

The machine900may include processors910, memory/storage930, and I/O components950, which may be configured to communicate with each other such as via a bus902. In an example embodiment, the processors910(e.g., a central processing unit (CPU), a reduced instruction set computing (RISC) processor, a complex instruction set computing (CISC) processor, a graphics processing unit (GPU), a digital signal processor (DSP), an ASIC, a radio-frequency integrated circuit (RFIC), another processor, or any suitable combination thereof) may include, for example, a processor912and a processor914that may execute the instructions916. The term “processor” is intended to include a multi-core processor912,914that may comprise two or more independent processors912,914(sometimes referred to as “cores”) that may execute the instructions916contemporaneously. AlthoughFIG. 9shows multiple processors910, the machine900may include a single processor912,914with a single core, a single processor912,914with multiple cores (e.g., a multi-core processor912,914), multiple processors912,914with a single core, multiple processors912,914with multiples cores, or any combination thereof.

The memory/storage930may include a memory932, such as a main memory, or other memory storage, and a storage unit936, both accessible to the processors910such as via the bus902. The storage unit936and memory932store the instructions916embodying any one or more of the methodologies or functions described herein. The instructions916may also reside, completely or partially, within the memory932, within the storage unit936, within at least one of the processors910(e.g., within the cache memory of processor912,914), or any suitable combination thereof, during execution thereof by the machine900. Accordingly, the memory932, the storage unit936, and the memory of the processors910are examples of machine-readable media.

Communication may be implemented using a wide variety of technologies. The I/O components950may include communication components964operable to couple the machine900to a network980or devices970via a coupling982and a coupling972respectively. For example, the communication components964may include a network interface component or other suitable device to interface with the network980. In further examples, the communication components964may include wired communication components, wireless communication components, cellular communication components, near field communication (NEC) components, Bluetooth® components (e.g., Bluetooth® Low Energy), Wi-Fi® components, and other communication components to provide communication via other modalities. The devices970may be another machine or any of a wide variety of peripheral devices (e.g., a peripheral device coupled via a USB).

Transmission Medium

The instructions916may be transmitted or received over the network980using a transmission medium via a network interface device (e.g., a network interface component included in the communication components964) and utilizing any one of a number of well-known transfer protocols (e.g., hypertext transfer protocol (HTTP)). Similarly, the instructions916may be transmitted or received using a transmission medium via the coupling972(e.g., a peer-to-peer coupling) to the devices970. The term “transmission medium” shall be taken to include any intangible medium that is capable of storing, encoding, or carrying the instructions916for execution by the machine900, and includes digital or analog communications signals or other intangible media to facilitate communication of such software.

Language