Giter VIP home page Giter VIP logo

libonvif's Introduction

libONVIF

os os_build Status
Android Linux Build Status
Android Windows Build Status
Linux Linux Build Status
Windows Windows Build Status
Macos Macos Build Status

Yet another ONVIF library

What does ONVIF stand for:

ONVIF (Open Network Video Interface Forum) is a global and open industry forum with the goal of facilitating the development and use of a global open standard for the interface of physical IP-based security products – or, in other words, to create a standard for how IP products within video surveillance and other physical security areas can communicate with each other. Wikipedia

The idea behind this library is to hide some complexity of gsoap and to provide 'high level' classes including QT5 goodness. Currently there are eleven client side service methods implemented:

For every service exists a class following the naming scheme Onvif*Client (* matches service name). These classes handle the RPCs. For the convenience of WS discovery and ONVIF (pull point) event handling there are two more classes: OnvifDiscovery and OnvifPullPoint.

Design thoughts:

  • The most of this library is thread safe and should work in a multithreaded environment
  • gsoap is 'hidden' from the user as much as possible
  • RAII classes Request<>, Response<> wrapping the RPC parameters are responsible for the memory management

Further reading

  • The library comes with a small application (named ovifinfo) that does some device-discovery, inspection. You may want to look at the source code.
  • If you want to learn more about how to use libONVIF in a qml app take a look at the following project ONVIFMonitor.
  • It is always advisable to look at the ONVIF programmers guide to learn more about ONVIF.

libonvif's People

Contributors

tereius avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

libonvif's Issues

Authorization

Hello! Thanks for the library!

I managed to use the discovery method, I received a list of uri, but I just can not figure out how to perform the authorization! I am new to onvif, I will be grateful for a small example!

Questions related to example usage

Thanks for writing this library. I have a few questions related to examples that would help me, and likely others, out a lot.

At a high level, I ultimately want to perform these steps as fast as possible, in a tight loop:

  1. Grab a current image at some specified resolution (based on available resolutions retrieved on initialization).
  2. Do some processing on that image
  3. Direct PTZ camera movement based on the results of the previous step

I have your example compiling and running on a raspberry pi and it detects my camera. As a baby step, if I specify the --host flag, I get:

./onvifinfo --host http://192.168.1.10 --port 8899 -u admin -p admin
WARNING: This binary was compiled without OpenSSL: SSL/TLS and http digest auth are disabled. Your password will be send as plaintext.
Using device endpoint:  "http://192.168.1.10:8899/onvif/device_service"
This build doesn't support http digest auth. Switching back to ws token
ONVIF device service namespace: http://www.onvif.org/ver10/device/wsdl Url: http://192.168.1.10:8899/onvif/device_service
This build doesn't support http digest auth. Switching back to ws token
ONVIF media service namespace: http://www.onvif.org/ver10/media/wsdl Url: http://192.168.1.10:8899/onvif/Media
This build doesn't support http digest auth. Switching back to ws token
ONVIF event service namespace: http://www.onvif.org/ver10/events/wsdl Url: http://192.168.1.10:8899/onvif/Events
This build doesn't support http digest auth. Switching back to ws token
ONVIF imaging service namespace: http://www.onvif.org/ver20/imaging/wsdl Url: http://192.168.1.10:8899/onvif/Imaging
This build doesn't support http digest auth. Switching back to ws token
ONVIF ptz service namespace: http://www.onvif.org/ver20/ptz/wsdl Url: http://192.168.1.10:8899/onvif/PTZ
This build doesn't support http digest auth. Switching back to ws token

Topic name "Motion"
Topic path "tns1:RuleEngine/CellMotionDetector"
    Item "VideoSourceConfigurationToken" type "tt:ReferenceToken" primitive "string"
    Item "VideoAnalyticsConfigurationToken" type "tt:ReferenceToken" primitive "string"
    Unknown Item "Rule" type "xsd:string"
    Item "IsMotion" type "xsd:boolean" primitive "boolean"

Topic name "SignalLoss"
Topic path "tns1:VideoSource"
    Item "Source" type "tt:ReferenceToken" primitive "string"
    Item "State" type "xsd:boolean" primitive "boolean"

Topic name "MotionAlarm"
Topic path "tns1:VideoSource"
    Item "Source" type "tt:ReferenceToken" primitive "string"
    Item "State" type "xsd:boolean" primitive "boolean"

Topic name "tnsn:SignalStandardMismatch"
Topic path "tns1:VideoSource"
    Item "VideoSourceToken" type "tt:ReferenceToken" primitive "string"
    Item "State" type "xsd:boolean" primitive "boolean"

How would you recommend accomplishing rapid, single-image retrieval (limited by the camera and network of course) and PTZ movement? In other words, any help with examples that would help accomplish the image capture and ptz continuous move steps outlined above would be really helpful.

Thanks,
David

Media2 Service

Hello! Thanks for the library!

I'm trying to use the media2 service through your library (e.g. GetVideoEncoderConfigurations() method of onvifmedia2). I traced the request and the response via Wireshark and both are correctly. I think this shows that response is being received at the network layer. And the XML format of the response with the successful code (HTTP 200 OK ) and the correct information received from the camera.
Also, the cameras support media2 service and ONVIF version 2.6 . But in the code execution output, I encounter the following error (with code 200 !!!!! ):

"HTTP Fault: SOAP-ENV:Sender: Error 200: HTTP 200 OK"

Also, after receiving the response and calling the GetResultObject() function, an empty value is returned.
Another important point is that I tracked the request through Wireshark and I observed that the following statement is not written in the XML format of request:
xmlns:tr2="http://www.onvif.org/ver20/media/wsdl"

libonvif version : 2.0.0
OS : ubuntu 22.04

Sample Code:

Request<tr2__GetConfiguration> rRequest3;
rRequest3.ConfigurationToken = new QString("VideoEncoderToken0s0");
rRequest3.ProfileToken = new QString("Profile0s0");
auto response2 = mpD->mpOnvifMedia2Client->GetVideoEncoderConfigurations(rRequest3);
qDebug() << "GetResultObject:  " << response2.GetResultObject();
qDebug() << "GetErrorCode:  " << response2.GetErrorCode();
qDebug() << "IsAuthFault:   " << response2.IsAuthFault();
qDebug() << "GetErrorCode:  " << response2.GetErrorCode();
qDebug() << "GetFaultSubcode: " << response2.GetFaultSubcode();
qDebug() << "GetCompleteFault: " << response2.GetCompleteFault();

Output:

GetResultObject:   0x0
GetErrorCode:   200
IsAuthFault:    false
GetErrorCode:   200
GetFaultSubcode:  ""
GetCompleteFault:  "HTTP Fault: SOAP-ENV:Sender: Error 200: HTTP 200 OK"

Thank you for your help.

Qt Example as starter

Hi Björn,
I don't know if I have to open an issue for this...
I am very happy that I could compile and install your lib libONVIF on my Raspberry Pi! Great!

It would be very helpful to have a runnable example in Qt or cpp available as a starter.

Functions:
-Find camera on local network
-display stream in a GUI, preferably in a Qt widget
-zoom setting

I have not found anything on the net.
As I said, I don't know if this is the right way here in this issue.
Nevertheless I would like to thank you for your great support!!!

No IPv4Address found while executing GetNTP

Hello!

IPv4Address is empty (IPv4Address is nullptr) when I try to use GetNTP.
soap responce
<SOAP-ENV:Body><tds:GetNTPResponse><tds:NTPInformation><tt:FromDHCP>false</tt:FromDHCP><tt:NTPManual><tt:Type>IPv4</tt:Type><tt:IPv4Address>172.17.4.51</tt:IPv4Address></tt:NTPManual></tds:NTPInformation></tds:GetNTPResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

Code
` auto builder = SoapCtx::Builder();
auto ctx = builder.EnableOMode(SOAP_XML_INDENT)
.SetConnectTimeout(1000)
.Build();

        ctx->EnablePrintRawSoap();

        OnvifDeviceClient onf(dev.onvifAddress(), ctx);
        onf.SetAuth(dev.login(), dev.pass(), AUTO);

        Request<_tds__GetNTP> req;
        auto const res = onf.GetNTP(req);
        if(res)
            auto ntp = res.GetResultObject()->NTPInformation;
            qDebug() << ntp->FromDHCP;
            qDebug() << ntp->Extension;
            for(auto h: ntp->NTPFromDHCP) {
                qDebug() << "dhcp";
                qDebug() << (int)h->Type;
                qDebug() << h->DNSname;
                qDebug() << h->IPv4Address;
                qDebug() << h->IPv6Address;
            }
            for(auto h: ntp->NTPManual) {
                qDebug() << "manual";
                qDebug() << (int)h->Type;
                qDebug() << h->DNSname;
                qDebug() << h->Extension;
                qDebug() << h->IPv4Address;    // is NULL
                qDebug() << h->IPv6Address;
            }`

ERROR: cmake_minimum_required(VERSION 3.13)

Hello,

unfortunately another fail occured:

pi@raspberrypi:~/software/ONVIF/libONVIF-master/build $ cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING=Debug /home/pi/software/ONVIF/libONVIF-master/src
CMake Error: File /home/pi/software/ONVIF/libONVIF-master/src/CMake/libONVIFConfig.cmake.in does not exist.
CMake Error at /usr/share/cmake-3.13/Modules/CMakePackageConfigHelpers.cmake:316 (configure_file):
configure_file Problem configuring file
Call Stack (most recent call first):
CMakeLists.txt:482 (configure_package_config_file)

CMake Warning (dev) in CMakeLists.txt:
No cmake_minimum_required command is present. A line of code such as

cmake_minimum_required(VERSION 3.13)

should be added at the top of the file. The version specified may be lower
if you wish to support older CMake versions for this project. For more
information run "cmake --help-policy CMP0000".
This warning is for project developers. Use -Wno-dev to suppress it.

-- Configuring incomplete, errors occurred!
See also "/home/pi/software/ONVIF/libONVIF-master/build/CMakeFiles/CMakeOutput.log".

In CMakeLists.txt at top of the file you can find:
cmake_minimum_required(VERSION 2.8.12)

Note:
Python on my Raspberry Pi:

pi@raspberrypi:~ $ whereis python
python: /usr/bin/python3.7 /usr/bin/python /usr/bin/python3.7m /usr/bin/python3.7m-config /usr/bin/python2.7 /usr/bin/python2.7-config /usr/bin/python3.7-config /usr/lib/python3.7 /usr/lib/python2.7 /etc/python3.7 /etc/python /etc/python2.7 /usr/local/lib/python3.7 /usr/local/lib/python2.7 /usr/include/python3.7 /usr/include/python3.7m /usr/include/python2.7 /usr/share/python /usr/share/man/man1/python.1.gz
CMakeOutput.log

Build issue in ubuntu

Hi ,

I am trying to build this project on my ubuntu machine and encountered below issue


Could NOT find CommonLibs_DIR (missing: CommonLibs_DIR_DIR)
CMake Error at src/CMakeLists.txt:418 (install):
install TARGETS given no LIBRARY DESTINATION for shared library target
"onvifcommon".

Configuring incomplete, errors occurred!
See also "/home/pallab/onvif/libONVIF/build/CMakeFiles/CMakeOutput.log".

The common lib dependency as explained can be met from https://github.com/Tereius/CommonLibs
But as per Readme.md its Unix makefiles are still awaiting .
Can I get some pointers on how to proceed on this project in ubuntu

Regards
Pallab

OnvifEventClient::PullMessages returns empty Message

Hello,
I'm trying to use this library to pull message from an Optex InSight camera which supports ONVIF's pull points subscriptions.
Using the library I'm able to create a subscription and to pull messages from the device. However, these messages doesn't contain the message information, they only contain the Topic information, i.e., the wsnt__NotificationMessageHolderType::Message::Message object is always null.
I have been using other tools like ONVIF Device Manager and they show the message content (such as the UTC Time or the source). In fact, using Wireshark I can see that the responses to the requests sent by the library include the message field, as this example does:

<?xml
    version="1.0"
    encoding="UTF-8"
    ?>
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsa5="http://schemas.xmlsoap.org/ws/2004/08/addressing"
    xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:xmime="http://tempuri.org/xmime.xsd"
    xmlns:xop="http://www.w3.org/2004/08/xop/include"
    xmlns:tt="http://www.onvif.org/ver10/schema"
    xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2"
    xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"
    xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2"
    xmlns:ns1="http://www.onvif.org/ver10/events/wsdl/PullPointSubscriptionBinding"
    xmlns:ns2="http://www.onvif.org/ver10/events/wsdl/EventBinding"
    xmlns:tev="http://www.onvif.org/ver10/events/wsdl"
    xmlns:ns3="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding"
    xmlns:ns4="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding"
    xmlns:ns5="http://www.onvif.org/ver10/events/wsdl/NotificationConsumerBinding"
    xmlns:ns6="http://www.onvif.org/ver10/events/wsdl/PullPointBinding"
    xmlns:ns7="http://www.onvif.org/ver10/events/wsdl/CreatePullPointBinding"
    xmlns:ns8="http://www.onvif.org/ver10/events/wsdl/PausableSubscriptionManagerBinding"
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
    xmlns:tns1="http://www.onvif.org/ver10/topics"
    xmlns:ter="http://www.onvif.org/ver10/error">
    <SOAP-ENV:Header>
        <wsa5:MessageID>
            urn:uuid:99d6f38c-0002-4336-aac9-bf229bf11696
            </wsa5:MessageID>
        <wsa5:To
            SOAP-ENV:mustUnderstand="true">
            http://support.vaelsys.com:4000/onvif/event_service?idx=5
            </wsa5:To>
        <wsa5:Action
            SOAP-ENV:mustUnderstand="true">
            http://www.onvif.org/ver10/events/wsdl/PullPointSubscription/PullMessagesResponse
            </wsa5:Action>
        </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <tev:PullMessagesResponse>
            <tev:CurrentTime>
                2005-01-05T23:02:33Z
                </tev:CurrentTime>
            <tev:TerminationTime>
                2038-01-01T00:00:00Z
                </tev:TerminationTime>
            <wsnt:NotificationMessage>
                <wsnt:SubscriptionReference>
                    <wsa5:Address>
                        http://192.168.1.62/onvif/event_service?idx=5
                        </wsa5:Address>
                    </wsnt:SubscriptionReference>
                <wsnt:Topic
                    Dialect="http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet">
                    tns1:VideoSource/MotionAlarm
                    </wsnt:Topic>
                <wsnt:Message>
                    <tt:Message
                        UtcTime="2005-01-05T23:02:30Z"
                        PropertyOperation="Initialized">
                        <tt:Source>
                            <tt:SimpleItem
                                Name="Source"
                                Value="video_source_01"/>
                            </tt:Source>
                        <tt:Data>
                            <tt:SimpleItem
                                Name="State"
                                Value="false"/>
                            </tt:Data>
                        </tt:Message>
                    </wsnt:Message>
                </wsnt:NotificationMessage>
            </tev:PullMessagesResponse>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

In this example, if the event is wsnt__NotificationMessageHolderType event*, logging event->Topic->Dialect I get http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet, which is right, but event->Message.Message is null.

Is this a bug in the library? Maybe the wsdl used by the library is outdated? Or what could the problem be?

Thanks a lot for your help.

Error: /usr/bin/ld: cannot open output file headerParser: it is a folder

Hi Tereius,

Thanks a lot for your answer!

I followed your advice:

cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING=Debug /home/pi/software/ONVIF/libONVIF-master

pi@raspberrypi:~/software/ONVIF/libONVIF-master $ cmake --build ./

... but some new errors occured:

[ 43%] Building CXX object src/CMakeFiles/onvifcommon.dir/gsoap/httpda.c.o
[ 43%] Building CXX object src/CMakeFiles/onvifcommon.dir/onvifcommon_autogen/mocs_compilation.cpp.o
[ 43%] Linking CXX shared library libonvifcommond.so
[ 43%] Built target onvifcommon
[ 43%] Automatic MOC for target onvifimaging
[ 43%] Built target onvifimaging_autogen
Scanning dependencies of target onvifimaging
[ 43%] Building CXX object src/CMakeFiles/onvifimaging.dir/generated/soapImagingBindingProxy.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifimaging.dir/OnvifImagingClient.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifimaging.dir/onvifimaging_autogen/mocs_compilation.cpp.o
[ 43%] Linking CXX shared library libonvifimagingd.so
[ 43%] Built target onvifimaging
[ 43%] Automatic MOC for target onvifdisplay
[ 43%] Built target onvifdisplay_autogen
Scanning dependencies of target onvifdisplay
[ 43%] Building CXX object src/CMakeFiles/onvifdisplay.dir/generated/soapDisplayBindingProxy.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifdisplay.dir/OnvifDisplayClient.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifdisplay.dir/onvifdisplay_autogen/mocs_compilation.cpp.o
[ 43%] Linking CXX shared library libonvifdisplayd.so
[ 43%] Built target onvifdisplay
[ 43%] Automatic MOC for target onvifevent
[ 43%] Built target onvifevent_autogen
Scanning dependencies of target onvifevent
[ 43%] Building CXX object src/CMakeFiles/onvifevent.dir/generated/soapPullPointSubscriptionBindingProxy.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifevent.dir/OnvifEventClient.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifevent.dir/OnvifPullPoint.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifevent.dir/Topics.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifevent.dir/NotificationFilter.cpp.o
[ 43%] Building CXX object src/CMakeFiles/onvifevent.dir/onvifevent_autogen/mocs_compilation.cpp.o
[ 43%] Linking CXX shared library libonvifeventd.so
[ 43%] Built target onvifevent
[ 43%] Automatic MOC for target headerParser
[ 43%] Built target headerParser_autogen
[ 43%] Building CXX object src/CMakeFiles/headerParser.dir/headerParser/main.cpp.o
[ 43%] Building CXX object src/CMakeFiles/headerParser.dir/headerParser_autogen/mocs_compilation.cpp.o
[ 43%] Linking CXX executable headerParser
/usr/bin/ld: cannot open output file headerParser: Ist ein Verzeichnis
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/headerParser.dir/build.make:99: src/headerParser] Fehler 1
make[1]: *** [CMakeFiles/Makefile2:245: src/CMakeFiles/headerParser.dir/all] Fehler 2
make: *** [Makefile:152: all] Fehler 2
pi@raspberrypi:~/software/ONVIF/libONVIF-master $

Install libONVIF on Raspberry Pi

Hello,
I am a complete beginner in ONVIF. I am trying to install libONVIF on my
Raspberry Pi 4B 8GB and 32Bit OS.

Unfortunately I fail at the point:
conan install ./ -o build_type=Debug --build missing

with the error message:
conan install ./ -o build_type=Debug --build missing
Configuration:
[settings]
arch=armv7
arch_build=armv7
build_type=Release
compiler=gcc
compiler.libcxx=libstdc++
compiler.version=8
os=Linux
os_build=Linux
[options]
build_type=Debug
[build_requires]
[env]

ERROR: /home/pi/software/ONVIF/libONVIF-master/conanfile.py: option 'build_type' doesn't exist
Possible options are ['shared', 'openssl']

Can anyone tell me what to do here?
Thanks a lot
Walter

Note:

Python on my Raspberry Pi:

pi@raspberrypi:~ $ whereis python
python: /usr/bin/python3.7 /usr/bin/python /usr/bin/python3.7m /usr/bin/python3.7m-config /usr/bin/python2.7 /usr/bin/python2.7-config /usr/bin/python3.7-config /usr/lib/python3.7 /usr/lib/python2.7 /etc/python3.7 /etc/python /etc/python2.7 /usr/local/lib/python3.7 /usr/local/lib/python2.7 /usr/include/python3.7 /usr/include/python3.7m /usr/include/python2.7 /usr/share/python /usr/share/man/man1/python.1.gz

Authentication

I can get Discovery to work. I can get GetSystemDateandTime to work. But anything requiring authentication fails. It seems to insist on using Basic authentication which my cameras do not support. If I turn authentication off in the cameras, this code works. When I snoop the traffic with wireshark, I do not see any soap headers.

Cmake compiler error : soapC.cpp.obj 'File too big'

Hi,

cd <src_path> after cmake commend. But error:
Fatal error: can't write 139 bytes to section .text of CMakeFiles\onvifcommon.dir\generated\soapC.cpp.obj: 'File too big'
CMakeFiles\onvifcommon.dir\generated\soapC.cpp.obj: too many sections

can you help me ? Thank you.

SSL error

Hello, I am implementing a test project including the ONVIF library but I get an error when calling the GetProfiles() function: 'SOAP_SSL_ERROR'.
Any idea about how could I solve it?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.