For the complete documentation index, see llms.txt. This page is also available as Markdown.

OPC UA सर्वर

डिवाइस डेटा को OPC UA tags के रूप में प्रदर्शित करें जिन्हें PLCs, SCADA systems, और अन्य औद्योगिक clients पढ़ और लिख सकते हैं।

OPC UA (Open Platform Communications Unified Architecture) एक औद्योगिक संचार प्रोटोकॉल है जो डिवाइसों, PLCs, और SCADA प्रणालियों के बीच डेटा का आदान-प्रदान करता है। OPC UA Server एक एज कंटेनर सेवा है जो डिवाइस पर टैग प्रकाशित करती है ताकि औद्योगिक क्लाइंट inference results पढ़ सकें और मान वापस लिख सकें।

आप Deployment Manager Configuration टैब से टैग, फ़ोल्डर, और सर्वर सेटिंग्स परिभाषित करते हैं, फिर अपने OPC UA क्लाइंट को डिवाइस की ओर इंगित करते हैं।

OPC UA Server केवल Enterprise ग्राहकों के लिए उपलब्ध है। Roboflow बिक्री टीम से संपर्क करें और जानें।

कनेक्शन विवरण

बदलें <device-ip> को Deployment Manager में डिवाइस पेज पर दिखाए गए IP पते से बदलें।

उद्देश्य
पता

OPC UA एंडपॉइंट

opc.tcp://<device-ip>:4840/opcua/server

वेब UI और REST API

http://<device-ip>:8092

पोर्ट
प्रोटोकॉल
उद्देश्य

4840

OPC UA बाइनरी

औद्योगिक क्लाइंट कनेक्शन (PLCs, SCADA)

8092

HTTP

वेब UI, REST API, दस्तावेज़ीकरण

कॉन्फ़िगरेशन स्रोत

Configure मोडल के शीर्ष पर मौजूद "Configuration Source" टॉगल नियंत्रित करता है कि टैग और फ़ोल्डर कॉन्फ़िगरेशन कहाँ से आता है। डिवाइस पर एक समय में केवल एक ही स्रोत सक्रिय रहता है।

स्रोत
संग्रहीत
इसे तब उपयोग करें जब

"Web UI"

OPCUA_CONFIG

जब आप मोडल में ही टैग, फ़ोल्डर, और सर्वर सेटिंग्स को इनलाइन परिभाषित करना चाहते हैं। यह डिफ़ॉल्ट है।

"File"

OPCUA_CONFIG_FILE

कॉन्फ़िगरेशन किसी environment variable के लिए बहुत बड़ा है, जैसे हजारों टैग वाला deployment। सर्वर को डिवाइस पर किसी पथ की ओर इंगित करें (उदा.: /data/opcua-config.json).

"File" मोड में सर्वर स्टार्टअप पर सत्यापित करता है कि फ़ाइल मौजूद है, पढ़ने योग्य है, और खाली नहीं है, और यदि इनमें से कोई भी सच नहीं है तो एक स्पष्ट log entry के साथ शुरू होने में विफल रहता है। OPCUA_CONFIG_FILE से अधिक प्राथमिकता रखता है OPCUA_CONFIG.

स्रोत बदलते समय, मोडल खुला रहने पर इनलाइन मान और फ़ाइल पथ दोनों बने रहते हैं। सेव करने पर, जिस स्रोत को आपने नहीं चुना था उसे साफ़ कर दिया जाता है, इसलिए दोनों में से ठीक एक variable सेट रहता है। "File" मोड में service card इनलाइन टैग सूची के स्थान पर कॉन्फ़िगर किया गया फ़ाइल पथ दिखाती है।

सर्वर सेटिंग्स

सेटिंग
विवरण

"Server Name"

सर्वर instance के लिए मानव-पठनीय नाम, जो नेटवर्क ब्राउज़ करने वाले क्लाइंट्स को दिखता है।

"Namespace URI"

टैग जिनके अंतर्गत पंजीकृत होते हैं, उस सर्वर namespace की पहचान करने वाला अद्वितीय URI। डिफ़ॉल्ट रूप से http://opcua.roboflow.run.

"Max Sessions"

एक साथ कितने OPC UA क्लाइंट जुड़े रह सकते हैं। डिफ़ॉल्ट रूप से 200.

हर क्लाइंट एक सत्र रखता है, जिसमें प्रत्येक inference pod द्वारा टैग लिखना और प्रत्येक SCADA कनेक्शन शामिल है। किसी crashed client का सत्र तभी मुक्त होता है जब सर्वर उसका टाइमआउट कर देता है, इसलिए व्यस्त साइट पर live clients की तुलना में अधिक sessions हो सकते हैं। जब सीमा पहुँच जाती है, आगे के क्लाइंट्स को BadTooManySessions के साथ अस्वीकार कर दिया जाता है और उनके टैग अपडेट होना बंद हो जाते हैं। यदि कोई साइट डिफ़ॉल्ट से अधिक concurrent clients चलाती है, तो मान बढ़ाएँ। मोडल में इसे सेट करने पर यह server config में लिखा जाता है, और OPCUA_MAX_SESSIONS हाथ से प्रबंधित deployments के लिए इसे प्रति डिवाइस ओवरराइड कर सकता है। BadTooManySessions और उनके टैग अपडेट होना बंद हो जाते हैं। यदि कोई साइट डिफ़ॉल्ट से अधिक concurrent clients चलाती है, तो मान बढ़ाएँ। मोडल में इसे सेट करने पर यह server config में लिखा जाता है, और OPCUA_MAX_SESSIONS हाथ से प्रबंधित deployments के लिए इसे प्रति डिवाइस ओवरराइड कर सकता है।

फ़ोल्डर और टैग

फ़ोल्डर टैग्स को एक पदानुक्रम में व्यवस्थित करते हैं। प्रत्येक फ़ोल्डर का एक नाम और एक वैकल्पिक विवरण होता है, और OPC UA address space में एक node के रूप में दिखाई देता है ताकि क्लाइंट्स टैग्स को ब्राउज़ और खोज सकें। कोई टैग किसी फ़ोल्डर से संबंधित हो सकता है या root स्तर पर रह सकता है।

टैग उन डेटा बिंदुओं को परिभाषित करते हैं जिन्हें सर्वर एक्सपोज़ करता है। प्रत्येक टैग में ये फ़ील्ड होते हैं:

फ़ील्ड
विवरण

"Display Name"

OPC UA क्लाइंट्स को दिखने वाला मानव-पठनीय नाम।

"Browse Name"

address space में उपयोग किया जाने वाला प्रोग्रामेटिक पहचानकर्ता। Display name से जनरेट किया जाता है।

"Data Type"

टैग में मौजूद मान का प्रकार।

"Access Level"

क्या टैग ReadWrite या ReadOnly.

"Folder"

टैग किस फ़ोल्डर से संबंधित है, या यदि असाइन नहीं है तो Root।

"Initial Value"

सर्वर शुरू होने पर प्रारंभिक मान। डेटा प्रकार के विरुद्ध सत्यापित किया जाता है।

"Description"

टैग किस काम के लिए है, उसका वैकल्पिक लेबल।

डेटा प्रकार

प्रकार
विवरण
उदाहरण

बूलियन

सही या गलत

true

Int32

32-बिट साइन किया हुआ पूर्णांक

42

फ़्लोट

32-बिट फ़्लोटिंग-पॉइंट

3.14

डबल

64-बिट फ़्लोटिंग-पॉइंट

3.14159265359

स्ट्रिंग

UTF-8 पाठ

चल रहा है

DateTime

ISO 8601 समय-मुद्रा

2024-01-15T10:30:00Z

ये वे प्रकार हैं जो Configure मोडल प्रदान करता है। हाथ से लिखी गई कॉन्फ़िगरेशन फ़ाइल भी Int16, UInt16, और UInt32, का उपयोग कर सकती है, जिन्हें सर्वर स्वीकार करता है।

एक्सेस स्तर

ReadWrite टैग्स को OPC UA क्लाइंट्स के साथ-साथ REST API, CLI, और वेब UI द्वारा पढ़ा और लिखा जा सकता है। इन्हें कंट्रोल आउटपुट, सेटपॉइंट, और उपयोगकर्ता द्वारा समायोज्य मानों के लिए उपयोग करें।

ReadOnly टैग OPC UA क्लाइंट के लेखन को BadNotWritableके साथ अस्वीकार करते हैं। REST API, CLI, और वेब UI फिर भी access level की परवाह किए बिना मान अपडेट कर सकते हैं, इसलिए ReadOnly सेंसर मानों, गणना किए गए आउटपुट, और उस system status के लिए उपयोग करें जिसे केवल डिवाइस को उत्पन्न करना चाहिए।

वैकल्पिक बाधाएँ

संख्यात्मक प्रकार "Min Value" और "Max Value" का समर्थन करते हैं ताकि अनुमत सीमा को सीमित किया जा सके, साथ ही वर्णनात्मक इकाई लेबल के लिए "Engineering Units" भी (उदा.: °C, PSI, RPM)। String प्रकार वर्णों की संख्या सीमित करने के लिए "Max Length" का समर्थन करते हैं।

प्रमाणीकरण

सर्वर डिफ़ॉल्ट रूप से SecurityPolicy None का उपयोग करते हुए anonymous connections की अनुमति देता है। प्रत्येक क्लाइंट से username और password की आवश्यकता के लिए Configure modal में "Require authentication" चालू करें।

जब टॉगल चालू हो, तो आपको username और password दोनों देने होंगे। पासवर्ड bcrypt से hash किया जाता है इससे पहले कि उसे संग्रहीत किया जाए, इसलिए मूल पासवर्ड कभी सहेजा नहीं जाता और बाद में पुनः प्राप्त नहीं किया जा सकता। मौजूदा सर्वर पर पासवर्ड बदलने के लिए, Configure modal में नया पासवर्ड दर्ज करें, या वर्तमान पासवर्ड बनाए रखने के लिए फ़ील्ड खाली छोड़ दें। टॉगल बंद करने पर anonymous access बहाल हो जाता है।

क्रेडेंशियल्स दो environment variables के रूप में संग्रहीत होते हैं, जिन्हें या तो साथ-साथ सेट होना चाहिए या दोनों को अनसेट छोड़ा जाना चाहिए:

चर
विवरण

OPCUA_USERNAME

क्लाइंट प्रमाणीकरण के लिए सादा-पाठ username।

OPCUA_PASSWORD_HASH

10 salt rounds पर पासवर्ड का bcrypt hash, जो शुरू होता है $2b$10$.

टैग रिपोर्टिंग

सर्वर निर्धारित समय पर अपने टैग Roboflow को रिपोर्ट कर सकता है, ताकि आप साइट विज़िट के बिना देख सकें कि वह क्या सर्व करता है। इसे Configure modal के "Tag Reporting" सेक्शन में सेट करें।

सेटिंग
विवरण

"Send periodic tag reports"

रिपोर्टिंग को चालू या बंद करता है। डिफ़ॉल्ट रूप से चालू।

"Include tag values"

प्रत्येक टैग का वर्तमान मान भेजता है। केवल टैग counts भेजने के लिए इसे बंद करें। डिफ़ॉल्ट रूप से चालू।

"Reporting Interval"

रिपोर्टों के बीच सेकंड। डिफ़ॉल्ट 60।

सेटिंग्स environment variables के रूप में संग्रहीत होती हैं, जिन्हें सर्वर स्टार्टअप पर पढ़ता है:

चर
डिफ़ॉल्ट
विवरण

OPCUA_SNAPSHOT_INTERVAL_SECONDS

60

रिपोर्टों के बीच सेकंड। 0 रिपोर्टिंग बंद करता है।

OPCUA_SNAPSHOT_INCLUDE_VALUES

true

false केवल टैग counts भेजता है।

OPCUA_SNAPSHOT_TTL_SECONDS

व्युत्पन्न

कोई रिपोर्ट कितनी देर तक वर्तमान रहती है। Modal इसे interval से व्युत्पन्न करता है और हर बार सेव करने पर इसे फिर से लिखता है।

सर्वर जिस मान को स्वीकार नहीं करता वह डिफ़ॉल्ट पर वापस जाने के बजाय रिपोर्टिंग बंद कर देता है, इसलिए एक टाइपो रिपोर्टों को रोक देता है। डिवाइस पेज ऐसे डिवाइस को not reporting के रूप में दिखाता है।

यदि इनमें से कोई भी variable reference द्वारा सेट है ({$ref}), तो modal रिपोर्टिंग को संपादित नहीं कर सकता और सेव करने पर इसे जैसा है वैसा ही छोड़ देता है। फॉर्म से रिपोर्टिंग प्रबंधित करने के लिए reference को literal value से बदलें।

निगरानी

डिवाइस पेज एक लाइव OPC UA स्थिति कार्ड दिखाता है जिसमें जुड़े हुए क्लाइंट्स की संख्या, "Max Sessions" के मुकाबले उपयोग में सत्र, और सबसे हाल की टैग रिपोर्ट शामिल होती है। टैग रिपोर्टिंग से पुराने इमेज पर मौजूद डिवाइस रिपोर्ट के स्थान पर यह बताता है।

जब सर्वर session cap तक पहुँचकर नए क्लाइंट्स को अस्वीकार करता है, तो कार्ड एक बैनर दिखाता है जिसमें session count, cap, और कितने क्लाइंट्स अस्वीकार किए गए थे, यह बताया जाता है। इसके बारे में ईमेल पाने के लिए, डिवाइस के "Device Alerts" टैब से एक "OPC UA Refusing Clients" अलर्ट जोड़ें और पहले कितने मिनट तक अस्वीकृतियाँ होने दें, यह सेट करें। देखें डिवाइस अलर्ट सेट करें.

वेब इंटरफ़ेस

सर्वर पर एक वेब इंटरफ़ेस उपलब्ध है: http://<device-ip>:8092.

पृष्ठ
पथ
सामग्री

डैशबोर्ड

/

सभी कॉन्फ़िगर किए गए टैग उनके वर्तमान मानों के साथ, हर 2 सेकंड में रिफ़्रेश होते हैं। किसी भी टैग का मान उसके access level की परवाह किए बिना, एक edit dialog के माध्यम से संपादित किया जा सकता है।

दस्तावेज़ीकरण

/docs.html

सर्वर गाइड, कॉन्फ़िगरेशन फ़ॉर्मेट संदर्भ, और समस्या-समाधान नोट्स।

API एक्सप्लोरर

/api/docs

एंडपॉइंट्स का परीक्षण करने और अनुरोध तथा प्रतिक्रिया schema देखने के लिए इंटरैक्टिव Swagger UI।

HTTP API

REST API टैग मानों और सर्वर जानकारी तक प्रोग्रामेटिक पहुँच देता है। सभी एंडपॉइंट JSON लौटाते हैं। बेस URL है http://<device-ip>:8092/api. देखें सेवाएँ डिवाइस पर मौजूद सभी सेवा APIs द्वारा साझा किए गए नियमों के लिए।

टैग संरचना रनटाइम पर अपरिवर्तनीय होती है। टैग और फ़ोल्डर आते हैं OPCUA_CONFIG environment variable से, या उस फ़ाइल से जिसका नाम OPCUA_CONFIG_FILE बड़ी कॉन्फ़िगरेशनों के लिए, और इस API के माध्यम से बनाए, बदले, या हटाए नहीं जा सकते। केवल मान लिखे जा सकते हैं।

टैग मान पढ़ें और लिखें

accessLevel OPC UA प्रोटोकॉल को नियंत्रित करता है, इस API को नहीं। जिस टैग को चिह्नित किया गया है ReadOnly OPC UA क्लाइंट्स से लिखने के अनुरोधों को BadNotWritable के साथ अस्वीकार करता है, लेकिन यहाँ अभी भी लिखा जा सकता है, जिससे एक pipeline sensor value प्रकाशित करती है जिसे औद्योगिक क्लाइंट्स को केवल उपभोग करना चाहिए।

List all tags

get

Returns all configured tags with their current values.

Responses
200

List of tags with current values

application/json
get/tags
GET /api/tags HTTP/1.1
Host: device-ip:8092
Accept: */*
200

List of tags with current values

{
  "tags": [
    {
      "id": "text",
      "nodeId": "text",
      "displayName": "text",
      "dataType": "Boolean",
      "accessLevel": "ReadOnly",
      "currentValue": true,
      "lastUpdated": "2026-01-01T00:00:00.000Z",
      "folder": "text"
    }
  ]
}

Get a single tag

get

Returns a single tag with its current value.

Path parameters
idstringRequired

Tag ID

Responses
200

Tag with current value

application/json
get/tags/{id}
GET /api/tags/{id} HTTP/1.1
Host: device-ip:8092
Accept: */*
{
  "tag": {
    "id": "text",
    "nodeId": "text",
    "displayName": "text",
    "dataType": "Boolean",
    "accessLevel": "ReadOnly",
    "currentValue": true,
    "lastUpdated": "2026-01-01T00:00:00.000Z",
    "folder": "text"
  }
}

Update tag value

put

Updates the value of a tag. Tags with accessLevel: "ReadOnly" reject writes over the OPC UA protocol but remain writable through this endpoint.

Path parameters
idstringRequired

Tag ID

Body
valueone ofRequired

New value to set

booleanOptional
or
numberOptional
or
stringOptional
Responses
200

Updated tag with new value

application/json
put/tags/{id}/value
PUT /api/tags/{id}/value HTTP/1.1
Host: device-ip:8092
Content-Type: application/json
Accept: */*
Content-Length: 14

{
  "value": true
}
{
  "tag": {
    "id": "text",
    "nodeId": "text",
    "displayName": "text",
    "dataType": "Boolean",
    "accessLevel": "ReadOnly",
    "currentValue": true,
    "lastUpdated": "2026-01-01T00:00:00.000Z",
    "folder": "text"
  }
}

लिखने का अनुरोध 400 के साथ अस्वीकार किया जाता है जब मान अनुपस्थित हो, प्रकार टैग के dataTypeसे मेल न खाता हो, या वह कॉन्फ़िगर किए गए minValue, maxValue, या maxLengthसे बाहर हो। ऐसे टैग पर लिखना जो मौजूद नहीं है, यह भी लौटाता है 400, न कि 404. GET /tags/{id} वापस देता है 404, इसलिए यदि आपको किसी अज्ञात टैग को एक गलत मान से अलग करना हो तो इसका उपयोग करें।

कॉन्फ़िगरेशन एंडपॉइंट्स

चल रहे कॉन्फ़िगरेशन के केवल-पठन दृश्य, जो लिखने से पहले टैग IDs और उनकी बाधाएँ खोजने के लिए उपयोगी हैं।

Get full configuration

get

Returns the complete server configuration, including server settings, folders, and tag definitions. Read-only.

Responses
200

Full configuration

application/json
versionintegerRequired

Configuration version

get/config
GET /api/config HTTP/1.1
Host: device-ip:8092
Accept: */*
200

Full configuration

{
  "version": 1,
  "server": {
    "port": 1,
    "namespace": "text",
    "serverName": "text",
    "maxSessions": 1
  },
  "folders": [
    {
      "id": "text",
      "name": "text",
      "description": "text"
    }
  ],
  "tags": [
    {
      "id": "text",
      "nodeId": "text",
      "browseName": "text",
      "displayName": "text",
      "description": "text",
      "dataType": "Boolean",
      "folderId": "text",
      "accessLevel": "ReadOnly",
      "initialValue": true,
      "engineeringUnits": "text",
      "minValue": 1,
      "maxValue": 1,
      "maxLength": 1
    }
  ]
}

Get all folders

get

Returns all folder definitions.

Responses
200

List of folders

application/json
get/config/folders
GET /api/config/folders HTTP/1.1
Host: device-ip:8092
Accept: */*
200

List of folders

{
  "folders": [
    {
      "id": "text",
      "name": "text",
      "description": "text"
    }
  ]
}

सत्र और स्वास्थ्य

एक बार maxSessions तक पहुँच जाता है, तो आगे के क्लाइंट्स को BadTooManySessions, इसलिए तुलना करें sessionCount को maxSessions अतिरिक्त गुंजाइश के लिए।

एक 200 से /subscriptions शून्य सत्र सूची के साथ और maxSessions का अनुपस्थित होना दर्शाता है कि OPC UA सर्वर चल नहीं रहा है। इसे warm-up के बजाय outage मानें: यदि एंडपॉइंट बिल्कुल भी जवाब देता है, तो startup पहले ही पूरा हो चुका है या विफल हो चुका है। इसके साथ पुष्टि करें /health, जो रिपोर्ट करता है status: "unhealthy" और opcuaServer: "stopped".

maxSessions उस स्थिति में शून्य के बजाय अनुपस्थित रहता है ताकि कोई consumer जो गणना करता है maxSessions - sessionCount किसी अज्ञात सीमा को पूर्ण सीमा के रूप में न पढ़े।

List active sessions and subscriptions

get

Returns the connected OPC UA clients and the tags each one is monitoring. Compare sessionCount against maxSessions for headroom before clients start being refused with BadTooManySessions.

A 200 with a zeroed session list and maxSessions omitted means the OPC UA server is not running. Treat it as an outage rather than a warm-up and confirm with /health. maxSessions is omitted rather than zeroed so a consumer computing maxSessions - sessionCount does not read an unknown cap as a full one.

Responses
200

Sessions and their subscriptions

application/json
sessionCountintegerRequired

Number of active sessions

maxSessionsintegerOptional

Configured maximum concurrent sessions, for headroom against sessionCount. Omitted when the OPC UA server is not running.

subscriptionCountintegerRequired

Total number of subscriptions across all sessions

get/subscriptions
GET /api/subscriptions HTTP/1.1
Host: device-ip:8092
Accept: */*
200

Sessions and their subscriptions

{
  "sessionCount": 1,
  "maxSessions": 1,
  "subscriptionCount": 1,
  "sessions": [
    {
      "sessionId": "text",
      "sessionName": "text",
      "clientDescription": "text",
      "connectedAt": "2026-01-01T00:00:00.000Z",
      "lastContactTime": "2026-01-01T00:00:00.000Z",
      "subscriptionCount": 1,
      "subscriptions": [
        {
          "subscriptionId": 1,
          "publishingInterval": 1,
          "monitoredItemCount": 1,
          "monitoredItems": [
            {
              "nodeId": "text",
              "displayName": "text",
              "samplingInterval": 1
            }
          ]
        }
      ]
    }
  ]
}

/subscriptions यदि spec में अनुपस्थित है, तो डिवाइस इसे पर परोसता है /api/openapi.json. रूट फिर भी सक्रिय रहता है, और यहाँ प्रलेखित है।

/health लौटाता है 200 चाहे OPC UA server चल रहा हो या नहीं। जाँचें status और opcuaServer status code के बजाय।

Health check

get

Returns the health status of the OPC UA server and API.

Responses
200

Health status. Returns 200 even when the OPC UA server is stopped, with status set to unhealthy.

application/json
statusstring · enumRequired

Overall server health status

Possible values:
opcuaServerstring · enumRequired

OPC UA server status

Possible values:
uptimeintegerRequired

Server uptime in seconds

tagCountintegerRequired

Number of configured tags

errorstringOptional

Why the OPC UA server is not running. Present only when opcuaServer is "stopped".

get/health
GET /api/health HTTP/1.1
Host: device-ip:8092
Accept: */*
200

Health status. Returns 200 even when the OPC UA server is stopped, with status set to unhealthy.

{
  "status": "healthy",
  "opcuaServer": "running",
  "uptime": 3600,
  "tagCount": 5
}

CLI

यह opcua-cli टूल डिबगिंग, scripting, और त्वरित टैग operations के लिए सर्वर तक terminal पहुँच देता है जब वेब UI उपलब्ध न हो।

कमांड
विवरण

सूची, ls

वर्तमान मानों के साथ सभी टैग सूचीबद्ध करें

read <tag>

किसी विशिष्ट टैग मान को पढ़ें

write <tag> <value>

किसी टैग में मान लिखें

status

सर्वर स्वास्थ्य और अपटाइम दिखाएँ

clients

जुड़े हुए OPC UA क्लाइंट्स की सूची बनाएं

clients --detailed

सब्सक्रिप्शन विवरण के साथ क्लाइंट्स की सूची बनाएं

export

कॉन्फ़िगरेशन को JSON के रूप में निर्यात करें

लॉगिंग

सेट करें LOG_LEVEL service पर verbosity नियंत्रित करने के लिए। देखें डिवाइस कॉन्फ़िगरेशन अपडेट करें कि सेवा environment variables कहाँ संपादित करने हैं, और डिवाइस लॉग देखें आउटपुट पढ़ने के लिए।

स्तर
विवरण

DEBUG

विस्तृत निदान जानकारी

INFO

सामान्य संचालन संदेश (डिफ़ॉल्ट)

WARN

संभावित समस्याएँ जो संचालन नहीं रोकतीं

ERROR

ऐसी त्रुटियाँ जो कार्यक्षमता को प्रभावित करती हैं

मान case-insensitive होते हैं, और कोई अपरिचित मान वापस गिरता है INFO.

अंतिम अपडेट

क्या यह उपयोगी था?