Skip to main content

Omnicon Generic DDS Engine Python API

Project description

OmniCon GenericDDSEngine PythonAPI

Introduction

OmniCon's Generic DDS Engine is a pluggable software library that provides simple, fully generic monitoring and message injection capabilities for Data Distribution Service (DDS).

Motivation

This project encapsulates DDS-complex API and configuration. It provides a simple, user friendly API to easily incorporate DDS traffic to generic monitoring and visualization tools.

Engine Capabilites

Engine's monitor inputs:

  1. Active dynamic/static monitoring based on a generic DDS Participant.
  2. Passive (non-intrusive) dynamic monitoring using network sniffing techniques.
  3. Offline network recording dissection.

Engine's monitor outputs & plugins:

  1. A generic C++, C# and Python APIs for receiving monitored messages in JSON and Map formats via push/poll methods.
  2. Customized integration to operational monitoring tools (proprietary and open-source).
  3. Textual reports generation.
  4. Integration to databases (relational and non-relational).

Engine's message injection:

  1. A C++, C# and Python APIs for injecting messages via JSON or Map formats.
  2. Message injection based on a user-provided textual format (e.g. CSV).

DDS XML/IDL Type Files Introspection:

  1. A simplified C++, C# and Python APIs for extracting detailed information on a selected DDS type's structure.
  2. Documentation / ICD generator.

DDS Overview

The OMG Data Distribution Service (DDS™) is a middleware protocol and API standard for data-centric connectivity from the Object Management Group® (OMG®). It integrates the components of a system together, providing low-latency data connectivity, extreme reliability, and a scalable architecture that business and mission-critical Internet of Things (IoT) applications need.
For more information refer to https://www.dds-foundation.org/.

Installation

Examples

For full API documentation and examples refer to https://www.OmniconSystems.com

Active Dynamic Monitoring

Demonstrate how to dinamically monitor every topic in a desired DDS domain. The same API applies for Passive monitoring.

import Omnicon_GenericDDSEngine_Py as omnicon
from time import sleep


class ActiveDynamicMonitorExampleListener(omnicon.EngineListener):

    def OnUserDataJson(self, sampleJson):
        print("OnUserDataJson")
        print(sampleJson)

    def OnDiscoveryDataJson(self, sampleJson):
        print("OnDiscoveryDataJson")
        print(sampleJson)


class ActiveDynamicMonitorExample:
    def __init__(self):
        print(self.run())

    @staticmethod
    def run():
        print("Active Dynamic Monitoring Example")

        # Factory configuration (optional) (can also be performed via an XML configuration)
        factory_configuration = omnicon.FactoryConfiguration()
        factory_configuration.loggerConfiguration.verbosity = omnicon.LogSeverityLevel.trace
        if not omnicon.GenericDDSEngine.SetFactoryConfiguration(factory_configuration):
            print("error setting factory configuration")
            return False

        # Engine configuration (can also be performed via API)
        engine = omnicon.GenericDDSEngine()
        engine_configuration = omnicon.EngineConfiguration()
        engine_configuration.engineOperationMode = omnicon.EngineOperationMode.ACTIVE_DYNAMIC_MONITORING
        engine_configuration.ddsConfigurationFilesPath.append("./EngineConfigurationExamples/ActiveDynamicMonitoring")
        engine_configuration.enableJsonOutput = True

        if not engine.Init(engine_configuration):
            return False

        # Register to engine's callbacks/events
        listener = ActiveDynamicMonitorExampleListener()
        if not engine.BindListener(listener, omnicon.ON_USER_DATA_JSON | omnicon.ON_DISCOVERY_DATA_JSON):
            return False

        if not engine.Run():
           return False

        print("Running Example...")
        input('Press Enter to Exit ')
        sleep(1)
        engine.UnbindListener()
        print("Shutting Down...")

Required Standard DDS configuration files include a basic participant with the DDS types files and DDS domain. For example:

<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <types>
    <enum name="ShapeFillKind">
        <enumerator name="SOLID_FILL"/>
        <enumerator name="TRANSPARENT_FILL"/>
        <enumerator name="HORIZONTAL_HATCH_FILL"/>
        <enumerator name="VERTICAL_HATCH_FILL"/>
    </enum> 
    <struct name= "ShapeType">
        <member name="color" stringMaxLength="128" type="string" key="true"/>
        <member name="x" type="int32"/>
        <member name="y" type="int32"/>
        <member name="shapesize" type="int32"/>
    </struct>
    <struct name= "ShapeTypeExtended" baseType="ShapeType">
        <member name="fillKind" type="nonBasic"  nonBasicTypeName= "ShapeFillKind"/>
        <member name="angle" type="float32"/>
    </struct>
  </types>

  <domain_library name="Domain_Lib">
    <domain name="Domain" domain_id="7"/>
  </domain_library>

  <domain_participant_library name="Participants_Lib">
    <domain_participant name="OmniCon_Engine_Participant" domain_ref="Domain_Lib::Domain">
      <subscriber name="Subscriber"/>
    </domain_participant>
  </domain_participant_library>

</dds>

Message Injection

Demonstrate how to generically inject every DDS Topic using dictionary/json format.

import Omnicon_GenericDDSEngine_Py as omnicon
from time import sleep


class MessageInjectionExample:
    def __init__(self):
        print(self.run())

    @staticmethod
    def run():
        print("Message Injection Example")

        engine = omnicon.GenericDDSEngine()
        # Engine configuration (can also be performed via xml config file)
        engine_configuration = omnicon.EngineConfiguration()
        engine_configuration.engineOperationMode = omnicon.EngineOperationMode.MESSAGE_INJECTION
        engine_configuration.ddsConfigurationFilesPath.append("./EngineConfigurationExamples/MessageInjection")

        if not engine.Init(engine_configuration):
            return False
        if not engine.Run():
            return False

        # Prevent data races:
        sleep(2)
        print("List of available writers: ")
        for writerInfo in engine.GetWritersInfo():
            print(writerInfo.entityName, "to Topic", writerInfo.topicName)
        print("")

        # Primitive Topic message:
        primitive_topic_input = {
            "SampleData.myLongLong": "-1",
            "SampleData.myUnsignedShort": "0",
            "SampleData.myFloat": "-6789889.3392",
            "SampleData.myDouble": "-6789898989.33999442",
            "SampleData.myBoolean": "0",  # can also use "False"
            "SampleData.myChar": "",
            "SampleData.myWchar": "0",  # wchar is treated as number
            "SampleData.myOctet": "0",
            "SampleData.myShort": "-32768",
            "SampleData.myLong": "-2147483648",
            "SampleData.myUnsignedLong": "0"
        }
        print("Injecting Primitive Topic Message")
        engine.InjectMessage("Publisher::PrimitiveTypeTopic_DW", primitive_topic_input)

        # String Topic Message
        string_topic_input = {
            "SampleData.myBoundedString": "Hello",
            "SampleData.myUnboundedString": "OmniCon",
            "SampleData.myBoundedWString": "!"
        }
        print("Injecting String Topic Message")
        engine.InjectMessage("Publisher::StringsTypeTopic_DW", string_topic_input)

        # Enum Topic Message
        enum_topic_input = {
            "SampleData.mySimpleEnum": "2",
            "SampleData.myDigitsEnum": "-1",
            "SampleData.LetterPrimitiveEnum": "1"
        }
        print("Injecting Enum Topic Message")
        engine.InjectMessage("Publisher::EnumTypeTopic_DW", enum_topic_input)

        # PrimitiveNested Topic Message
        primitive_nested_topic_input = {
            "SampleData.myAliasLongType": "1",
            "SampleData.myFirstType.myChar": "1",
            "SampleData.myFirstType.myWchar": "1",
            "SampleData.myFirstType.myOctet": "1",

            "SampleData.PrimitiveSecondNested.myFloat": "2.5",
            "SampleData.PrimitiveSecondNested.myNestedType.myChar": "z",
            "SampleData.PrimitiveSecondNested.myDouble": "3.14159265359"
        }
        print("Injecting PrimitiveNested Topic Message")
        engine.InjectMessage("Publisher::PrimitiveNestedTypeTopic_DW", primitive_nested_topic_input)

        # Array Topic Message
        array_type_topic_input = {
            "SampleData.myKey": "1",
            "SampleData.AliasCharArray[0]": "1",
            "SampleData.PrimitiveOneDimensionalLiteralSizeArray.boolean_array[0]": "1",
            "SampleData.PrimitiveOneDimensionalLiteralSizeArray.boolean_array[1]": "0",
            "SampleData.PrimitiveOneDimensionalLiteralSizeArray.boolean_array[2]": "1",
            "SampleData.PrimitiveOneDimensionalLiteralSizeArray.short_array[0]": "223",
        }
        print("Injecting ArrayTypeTopic Topic Message")
        engine.InjectMessage("Publisher::ArrayTypeTopic_DW", array_type_topic_input)

        # Sequence Topic Message
        sequence_topic_message = 	{
					  "SampleData": {
						"myKey": "0",
						"myBooleanSeq": [
							"TRUE"
						],
						"myAliasLongUSeq": [],
						"myAliasSeqEnumMember": [
							"(1) - GREEN",
							"(2) - BLUE"
						],
						"myAliasSeqStringMember": [
							"ABC"
						],
						"myPrimitiveSeq": [
							{
								"myChar": "\u0000",
								"myWchar": "0",
								"myOctet": "0",
								"myShort": "2",
								"myUnsignedShort": "0",
								"myLong": "0",
								"myUnsignedLong": "0",
								"myLongLong": "0",
								"myUnsignedLongLong": "0",
								"myFloat": "0",
								"myDouble": "0",
								"myBoolean": "TRUE"
							}
						],
			        }
                }
        print("Injecting SequenceTypeTopic Topic Message")
        engine.InjectMessage("Publisher::SequenceTypeTopic_DW", sequence_topic_message)

        # Union Topic Message
        union_type_topic_input = {
            "SampleData.myKey": "1",
            "SampleData.mySimpleUnion.AliasLong_2_3": "111",
            # "SampleData.PositionError.Error3DMember.sigmaXX": "23",
            "SampleData.PositionError.Error2DMember.sigmaXX": "245"
        }
        print("Injecting UnionTypeTopic Topic Message")
        engine.InjectMessage("Publisher::UnionTypeTopic_DW", union_type_topic_input)

        input("Press Enter to Exit...")
        return True

Required Standard DDS configuration files include a basic participant with the DDS types files and DDS domain. For example:

<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <types>
    <!--User Types-->
    <include file="TypeFiles/ShapeType.xml" />
    <include file="TypeFiles/myIncludedTypesTester.xml" />
    <include file="TypeFiles/myGenericTypesTester.xml" />
  </types>

<!-- Optional -->
  <qos_library name="QOSLibrary">
    <qos_profile name="DefaultProfile" is_default_participant_factory_profile="true" is_default_qos="true" >
      <participant_qos/>
      <datawriter_qos>
        <property>
          <value>
            <!--Required for unbounded types support-->
            <element>
              <name>dds.data_writer.history.memory_manager.fast_pool.pool_buffer_max_size</name>
              <value>4096</value>
            </element>
          </value>
        </property>
      </datawriter_qos>
      <datareader_qos>
        <property>
          <value>
            <!--Required for unbounded types support-->
            <element>
              <name>dds.data_reader.history.memory_manager.fast_pool.pool_buffer_max_size</name>
              <value>4096</value>
            </element>
          </value>
        </property>
      </datareader_qos>
    </qos_profile>
  </qos_library>



  <domain_library name="Domain_Lib">
    <domain name="Domain" domain_id="7">
      <!--Types Definition-->
      <register_type name="ShapeType" type_ref="ShapeType" />
      <register_type name="PrimitiveType" type_ref="PrimitiveType" />
      <register_type name="MyNamespace::StringsType" type_ref="MyNamespace::StringsType" />
      <register_type name="EnumType" type_ref="EnumType" />
      <register_type name="PrimitiveNestedType" type_ref="PrimitiveNestedType" />
      <register_type name="SequenceType" type_ref="SequenceType" />
      <register_type name="UnionType" type_ref="UnionType" />
      <register_type name="ArrayType" type_ref="ArrayType" />

      <!--Topics Definition-->
      <topic name="Square" register_type_ref="ShapeType"/>
      <topic name="PrimitiveTypeTopic" register_type_ref="PrimitiveType" />
      <topic name="StringsTypeTopic" register_type_ref="MyNamespace::StringsType" />
      <topic name="EnumTypeTopic" register_type_ref="EnumType" />
      <topic name="PrimitiveNestedTypeTopic" register_type_ref="PrimitiveNestedType" />
      <topic name="SequenceTypeTopic" register_type_ref="SequenceType" />
      <topic name="UnionTypeTopic" register_type_ref="UnionType" />
      <topic name="ArrayTypeTopic" register_type_ref="ArrayType" />

    </domain>
  </domain_library>
  <domain_participant_library name="Participants_Lib">
    <domain_participant name="OmniCon_Engine_Participant" domain_ref="Domain_Lib::Domain">
      <publisher name="Publisher">
        <data_writer name="PrimitiveTypeTopic_DW" topic_ref="PrimitiveTypeTopic">
          <datawriter_qos base_name="QOSLibrary::DefaultProfile"/>
        </data_writer>
        <data_writer name="StringsTypeTopic_DW" topic_ref="StringsTypeTopic">
          <datawriter_qos base_name="QOSLibrary::DefaultProfile"/>
        </data_writer>
        <data_writer name="EnumTypeTopic_DW" topic_ref="EnumTypeTopic">
          <datawriter_qos base_name="QOSLibrary::DefaultProfile"/>
        </data_writer>
        <data_writer name="PrimitiveNestedTypeTopic_DW" topic_ref="PrimitiveNestedTypeTopic">
          <datawriter_qos base_name="QOSLibrary::DefaultProfile"/>
        </data_writer>
        <data_writer name="ArrayTypeTopic_DW" topic_ref="ArrayTypeTopic">
          <datawriter_qos base_name="QOSLibrary::DefaultProfile"/>
        </data_writer>
        <data_writer name="SequenceTypeTopic_DW" topic_ref="SequenceTypeTopic">
          <datawriter_qos base_name="QOSLibrary::DefaultProfile"/>
        </data_writer>
        <data_writer name="UnionTypeTopic_DW" topic_ref="UnionTypeTopic">
          <datawriter_qos base_name="QOSLibrary::DefaultProfile"/>
        </data_writer>
      </publisher>
    </domain_participant>
  </domain_participant_library>
</dds>

Type Introspection Example

Demonstrate how to extract DDS type infromation for analysis purposes.

import Omnicon_GenericDDSEngine_Py as omnicon

class TypeIntrospectionExample:
    def __init__(self):
        print(self.run())

    @staticmethod
    def run():
        print("Type Introspection Example")
        factory_configuration = omnicon.FactoryConfiguration()
        factory_configuration.loggerConfiguration.verbosity = omnicon.LogSeverityLevel.trace
        omnicon.GenericDDSEngine.SetFactoryConfiguration(factory_configuration)

        engine = omnicon.GenericDDSEngine()
        # Engine configuration (can also be performed via xml config file)
        engine_configuration = omnicon.EngineConfiguration()
        engine_configuration.engineOperationMode = omnicon.EngineOperationMode.TYPE_INTROSPECTION
        engine_configuration.ddsConfigurationFilesPath.append("./EngineConfigurationExamples/TypeIntrospection/TopicNamesToTypesDefMap.xml")

        if not engine.Init(engine_configuration):
            return False
        if not engine.Run():
            return False

        DDSTopicToTypeXMLMapping = omnicon.GenericDDSEngine.GetTopicNameToTypeNameMap(
            "./EngineConfigurationExamples/TypeIntrospection/TopicNamesToTypesDefMap.xml")
        for topic, type in DDSTopicToTypeXMLMapping.items():
            print(topic + " - " + type)

            dds_type = engine.IntrospectType(type)
            if dds_type is None:
                print(type + " is None")
            for element in dds_type.structure:
                print(element.name)

                if element.typeKindName == "STRUCTURE":
                    print("\tdataTypeName - " + (element).dataTypeName)
                if element.typeKindName == "STRING":
                    print("\tlen - " + str((element).length))
                if element.typeKindName == "ENUMERATION":
                    print("\tENUMERATION")
                if element.typeKindName == "SEQUENCE":
                    print("\tlen - " + str((element).length))

Required Standard DDS configuration files include a basic DDS types/topic XML definition. For example:

<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="http://community.rti.com/schema/6.1.0/rti_dds_profiles.xsd"
     version="6.1.0">
  <types>
    <include file="TypeFiles//myIncludedTypesTester.xml"/>
    <include file="TypeFiles//myGenericTypesTester.xml"/>
    <include file="TypeFiles//ShapeType.xml"/>
  </types>

  <domain_library name="Domain_Lib">
    <domain name="Domain">
      <!--Types Definition-->
      <register_type name="ShapeType" type_ref="ShapeTypeExtended" />
      <register_type name="PrimitiveType" type_ref="PrimitiveType" />
      <register_type name="MyNamespace::StringsType" type_ref="MyNamespace::StringsType" />
      <register_type name="EnumType" type_ref="EnumType" />
      <register_type name="PrimitiveNestedType" type_ref="PrimitiveNestedType" />
      <register_type name="SequenceType" type_ref="SequenceType" />
      <register_type name="UnionType" type_ref="UnionType" />
      <register_type name="ArrayType" type_ref="ArrayType" />

      <!--Topics Definition-->
      <topic name="Square" register_type_ref="ShapeType"/>
      <topic name="PrimitiveTypeTopic" register_type_ref="PrimitiveType" />
      <topic name="StringsTypeTopic" register_type_ref="MyNamespace::StringsType" />
      <topic name="EnumTypeTopic" register_type_ref="EnumType" />
      <topic name="PrimitiveNestedTypeTopic" register_type_ref="PrimitiveNestedType" />
      <topic name="SequenceTypeTopic" register_type_ref="SequenceType" />
      <topic name="UnionTypeTopic" register_type_ref="UnionType" />
      <topic name="ArrayTypeTopic" register_type_ref="ArrayType" />
    </domain>
  </domain_library>

</dds>

OmniCon Distributed System LTD All Rights Reserved ©2019-2023

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

Omnicon_GenericDDSEngine_Py-4.6.1-11-cp39-cp39-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.9Windows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-11-cp38-cp38-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.8Windows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-11-cp37-cp37m-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.7mWindows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-10-cp39-cp39-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.9Windows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-10-cp38-cp38-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.8Windows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-10-cp37-cp37m-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.7mWindows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-8-cp39-cp39-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.9Windows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-8-cp38-cp38-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.8Windows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-8-cp37-cp37m-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.7mWindows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-5-cp39-cp39-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.9Windows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-5-cp38-cp38-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.8Windows x86-64

Omnicon_GenericDDSEngine_Py-4.6.1-5-cp37-cp37m-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.7mWindows x86-64

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-11-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-11-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5887dd890e46a16858540a72b2d50ed2366b89c113a079ecd1fb3ff883bd4171
MD5 e352263a76422c35f2e595ae4f6b393d
BLAKE2b-256 f42c34b1845ce599a432026a680ba2376b463e5c5a9bc2481a09642edd9cb66d

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-11-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-11-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 20a5ecc77d3f80a58f87fe8b54561fdc7fcd542741c60d63e009ad5ad77bf23e
MD5 58c6bb0eed4aff93c96931f0eb1ad56e
BLAKE2b-256 824d8600021aa2e383b2212d092ae1b2dce654be71f1ce0a3cf3bc9f410ac179

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-11-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-11-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 91f4233de5ce498a55170358e6cd2d8e2570c1cf0d5e7a1482fa830017d5e64f
MD5 48ada5477ab474b9f646b6a13781706e
BLAKE2b-256 89cce50e13a362f646310bc7a24e0945c1b8fb17e030e6d7feae052a7f1af7f8

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-11-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-11-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0c43246c9cad129a5c16dee6bc46b05e7819969d7e8deefd84e469c733fcc710
MD5 14acf01573818d04152ce5d73d7ef954
BLAKE2b-256 ef32332c2cdf262336247f697061698009ed145df1c0953fa5d04939726df069

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-11-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-11-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 593cceac26bfd76772002085b1af3d2fceba6e721542efbbffdcc2dc640bfc88
MD5 272b323dc8e11ca8b1293859b2d398d7
BLAKE2b-256 ab4c019b8e595d48ff1502771e445308d5fddd6dde59c1e319ffaf9cffa63f41

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-11-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-11-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 04edeea10ea2d0aa0fb11bc76338d8fb9c083bd5fcc530fa0932ab0d7229b595
MD5 afc1ee29bc9a2598c7df575d29025882
BLAKE2b-256 ef18548ea16dd4da089a4a7a744f7fb27817e2767235bd06fb11cd8aacf6f4bf

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-10-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-10-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6dcaa8b11d49af13bbe0d891d9adfc85939bbb10604e8811a07d8f2e8237aefb
MD5 c2dc29569d7d4149f89790d65476f25d
BLAKE2b-256 6a644aac84ee487b5ccddc4858cbb7f55ab4b903b0fd322cfb24593b330a3de6

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-10-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-10-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5412ba8736c435eaf8d961db616466bbb8080d3e3830235420f03c0b9648835c
MD5 be6898b197e6b96d65506ac870c2da9d
BLAKE2b-256 4e6d4eda289a6ff209017f9987d3eca6169e9cbfc397dd92050fd4887921fc22

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-10-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-10-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 2acd2192f3f0739ff0999d9b32a01a066bfd03bebcc9914442d1da8f70fc06e2
MD5 f6ec689a23fecbdd4152dcef853e5f52
BLAKE2b-256 f5463116313a2cdd5d2f1346c859fe6c0024e928ec71f6d293f1c0cc2a40859d

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-10-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-10-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3d20ed4ad5ea01e226f11b2c4f5becb8e37b665e7d9d3de14c83901a3afb2336
MD5 67a9e72a208edf1fafe3ff3e21c305de
BLAKE2b-256 1aaca3bd8b3030c8decb072c928d714e6619a2c22fd2767cc66949218321c345

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-10-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-10-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 cd8c7889388993e1a989cd57c30eab2f1c84b7d80cda54b60432097176ca53bf
MD5 06b23f60371352498c3500edfd0dc541
BLAKE2b-256 9cc38e3772e0c80f3584a00537527f1ea1ff3f8036a77ed9b5b6d1c46a8e55a5

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-10-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-10-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b335782fb436d04f3910963adf69d60d82ddc4060b477a3d11ff4d332cc7061c
MD5 58e10de6a8c69ab7ac92428e642bbd29
BLAKE2b-256 f5fa6f911c0aa3a2728caf8923fe3c1a6e96dc4fef2c34e0fbbf0d0937519a60

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-8-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-8-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 fbc990a9286ada380e29c9c6d6d163576ab091b95d74bd71b6e057d42a071ea8
MD5 3d47b973e50f02ea7c5c333564b604c4
BLAKE2b-256 bec0ea9836338a964f3572df091c1f65ea3732d4d87363f9bcd03610d52c8e07

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-8-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-8-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1dde3e4bde29a2044c9a00eff2df830c5f6239fe4b858495a6426241f2108700
MD5 d2b29005eea4c325b887bd672afa89bb
BLAKE2b-256 eb74c13acb85a776dfa92dadd12b0c85aee6b0fcbb10e0ac67a8f8d736c5ba72

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-8-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-8-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 1fb2acb1e36481f90b7ac82897288f74888875d31f333553ba4d117ca62310e6
MD5 232d48faf674bbc98e9122fe4c4266cd
BLAKE2b-256 59e35691d458c79b9f71e4f68facd5f17c741936a4bac81111be4250c7cbe1ab

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-8-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-8-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b895cc4e5f20ad3a4473881510e3c607af4168bc53ce794a3838e7c7634c9e4a
MD5 84c37dab8b94c912d1c70072e6be4175
BLAKE2b-256 5b43f5e41ad567894255669d4391f292ab2762130f9322980b66aa31285cd192

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-8-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-8-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 35a6f82e6728cbc839fbea22669217efb8cc4c66289031f31bdef9950bc17e51
MD5 6f866565537252a93813146d8fa5acaa
BLAKE2b-256 2cc87e4a7abeaef231ac970faf9be56b93e62ab41f15cf5feb83729617688d5c

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-8-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-8-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e8d3a1ab123807b87720ae008abbff0df7a20422a41ad153d5eaf958ce158139
MD5 671c52df23946cc4a9f2ce7f9c128ef5
BLAKE2b-256 f386b98f130b47bd79321a3c5aed5109a87b4a385b6fdb419cded77d1171136b

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-5-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 40dd6a2ae02a0998f47c4cb033ffe15ace4a673485b8ce23f5f670ee1bd27016
MD5 e67f5f46f8a2b7cd4c133d71a8dd0303
BLAKE2b-256 8ae1aba6fb724175527cde87717aeacfe2c0c4de0ca9e374c97c45e88749825e

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-5-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-5-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5a30a1111fd80e58ec1f336e5183cf13758c8e3229831dd4330ec385f52d5c40
MD5 1c60f6bfb43e4f574870c937b20e32d3
BLAKE2b-256 851d1c261e2215f1f761fb46642ee9493348af6cb0cc922e31628e04d6ab2077

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-5-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 c6b0a7496690bd0fb6ef02104136761834e78263d3cd246437699fe998043453
MD5 7a01c19c0c006cf10844300b9bdd73bd
BLAKE2b-256 8a67295cff4d9396449835a49e04e67cdddda1ad0b3c67ae4a851692fc5a6f27

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-5-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-5-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2ed20fd238237b007a8f1742ce149b0a5caec70da7a0a641d3e50c521d04b8ab
MD5 749fd5b8f77a6ab07f88e5c5d9929aab
BLAKE2b-256 e3dd268bfa0a5eb4e22c1d4e3ca4bcef12b37cf88b8d53c66faa3fea4e3d3927

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-5-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-5-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ad7bde40b882d01dfedbc156736660d3b499892a9fc2b74a114b1f958b86dbdf
MD5 6301c449f9da1e3145e4783486f74f78
BLAKE2b-256 0933b36cab2a2f0f1aaae4bbd488ca36404a5916652b16df0fa31e532106dc01

See more details on using hashes here.

File details

Details for the file Omnicon_GenericDDSEngine_Py-4.6.1-5-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Omnicon_GenericDDSEngine_Py-4.6.1-5-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d7d84e1e4830ad3ea470ea0620068b4609f07f43299e8866454a2745a89bc592
MD5 1b06f6ad2640687c7889344239de6094
BLAKE2b-256 89b61bc00485a72e43d8a2e1a14efd8c900f7bd49d266e2ba87b27d7369752c3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page