उद्यम सुविधाएँ
ट्रैसलेट सैन्य ट्रैकिंग, एचआईपीएए-अनुपालक रोगी निगरानी और क्रिप्टोग्राफ़िक रूप से सत्यापित लॉजिस्टिक्स जैसे उद्यम उपयोग के मामलों के लिए डिज़ाइन की गई कई उच्च-सुरक्षा सुविधाओं से सुसज्जित है।
1. डेटा एन्क्रिप्शन (SQLCipher)
जब ट्रैसलेट पृष्ठभूमि में किसी स्थान को रिकॉर्ड करता है, तो यह आपके सर्वर से समन्वयित करने से पहले इसे अस्थायी रूप से आंतरिक SQLite डेटाबेस में संग्रहीत करता है। यदि कोई उपकरण चोरी हो जाता है, तो भौतिक पहुंच संभावित रूप से हमलावर को इन ऐतिहासिक मार्गों को पढ़ने की अनुमति दे सकती है।
ट्रेसलेट SQLCipher का उपयोग करके एट-रेस्ट डेटाबेस एन्क्रिप्शन की पेशकश करके इसे हल करता है।
डेटा एन्क्रिप्शन कैसे काम करता है
- जब आप
encryptDatabaseफ़्लैग को सक्षम करते हैं, तो अंतर्निहित रस्ट SQLite डेटाबेस SQLCipher के माध्यम से AES-256 के साथ तुरंत एन्क्रिप्ट हो जाता है। - डिफ़ॉल्ट रूप से, ट्रैसलेट स्वचालित रूप से एक सुरक्षित 256-बिट कुंजी उत्पन्न करता है और इसे प्लेटफ़ॉर्म के मूल सुरक्षित स्टोरेज (एंड्रॉइड कीस्टोर / आईओएस किचेन) में सुरक्षित रूप से संग्रहीत करता है। आपको कुंजी को मैन्युअल रूप से प्रबंधित करने की आवश्यकता नहीं है!
- डिस्क पर लिखा गया सारा डेटा कुंजी के बिना पूरी तरह से अपठनीय हो जाता है।
- फ़्लैग सक्षम होने पर मौजूदा अनएन्क्रिप्टेड डेटाबेस स्वचालित रूप से एन्क्रिप्टेड में स्थानांतरित हो जाते हैं।
कार्यान्वयन
प्लेटफ़ॉर्म-प्रबंधित सुरक्षित कुंजी (अनुशंसित) का उपयोग करके एन्क्रिप्शन सक्षम करने के लिए:
final config = Config.balanced(
security: tl.SecurityConfig(
encryptDatabase: true, // This MUST be true to enable encryption
),
);कस्टम कुंजी प्रबंधन (उन्नत)
यदि आपका ऐप अपनी मुख्य सामग्री को प्रबंधित करना पसंद करता है (उदाहरण के लिए, flutter_secure_storage का उपयोग करके), तो आप एक कस्टम encryptionKey प्रदान कर सकते हैं। ध्यान दें कि encryptDatabase अभी भी सत्य होना चाहिए।
// Generate a secure random key
final customKey = await tl.Tracelet.generateEncryptionKey();
await secureStorage.write(key: 'my_db_key', value: customKey);
// Pass it to Tracelet
final config = Config.balanced(
security: tl.SecurityConfig(
encryptDatabase: true,
encryptionKey: await secureStorage.read(key: 'my_db_key'),
),
);2. ऑडिट ट्रेल प्रबंधन एवं सत्यापन
संवेदनशील लॉजिस्टिक्स या कानून प्रवर्तन में, आपको गणितीय रूप से यह साबित करने में सक्षम होना चाहिए कि तथ्य के बाद किसी स्थान रिकॉर्ड के साथ छेड़छाड़, धोखा या बदलाव नहीं किया गया था। ट्रेसलेट कस्टडी की क्रिप्टोग्राफ़िक श्रृंखला बनाने के लिए एक ऑडिट ट्रेल सुविधा प्रदान करता है।
ऑडिट ट्रेल प्रबंधन कैसे काम करता है
जब AuditConfig.enabled को true पर सेट किया जाता है, तो ट्रैसलेट केवल अक्षांश और देशांतर को सहेजता नहीं है। यह प्रत्येक स्थान के लिए “ब्लॉकचैन-जैसा” रिकॉर्ड बनाता है। अंतर्निहित रस्ट इंजन यह सुनिश्चित करता है कि यह प्रक्रिया परमाणु और फुलप्रूफ है:
- जेनेसिस ब्लॉक: जब इंजन पहली बार किसी नए डिवाइस पर शुरू होता है, तो यह जेनेसिस हैश की गणना करता है:
SHA-256("tracelet:genesis:{device_id}")। - कैनोनिकल स्ट्रिंग जेनरेशन: प्रत्येक स्थान के लिए, ट्रैसलेट पिछले हैश और नए स्थान के सटीक डेटा को मिलाकर एक सख्त, नियतात्मक स्ट्रिंग प्रारूप उत्पन्न करता है।
- हैशिंग: यह कैनोनिकल स्ट्रिंग हैशेड है (डिफ़ॉल्ट रूप से SHA-256 का उपयोग करके), वर्तमान स्थान के लिए
hashका उत्पादन करती है। - श्रृंखला: यह हैश अगले स्थान के लिए
previous_hashबन जाता है, जिससे एक अटूट श्रृंखला बनती है। यदि कोई हमलावर डेटाबेस में पिछले स्थान के एक भी समन्वय को संशोधित करता है, तो उस स्थान का हैश बदल जाएगा, जिससे बाद के हैश की पूरी श्रृंखला टूट जाएगी।
विन्यास
final config = Config.highAccuracy(
audit: tl.AuditConfig(
enabled: true,
hashAlgorithm: tl.HashAlgorithm.sha256,
),
);JSON पेलोड
जब ट्रैसलेट इन स्थानों को आपके बैकएंड में सिंक करता है, तो प्रत्येक स्थान के लिए JSON पेलोड में सीधे ऑडिट फ़ील्ड शामिल होंगे।
{
"device": "tracelet-example",
"locationCount": 1,
"locations": [
{
"uuid": "loc-1234-abcd",
"timestamp": "2024-01-01T00:00:00Z",
"is_moving": true,
"coords": {
"latitude": 37.774900,
"longitude": -122.419400,
"accuracy": 10.0,
"speed": 15.5,
"heading": 90.0,
"altitude": 100.0
},
"audit_hash": "a1b2c3d4e5f6...",
"audit_previous_hash": "f6e5d4c3b2a1...",
"audit_chain_index": 42
}
]
}सर्वर-साइड सत्यापन (कोड कैसे सत्यापित करें)
अपने सर्वर पर डेटा की अखंडता को सत्यापित करने के लिए, आपको ट्रैसलेट रस्ट कोर द्वारा उपयोग की जाने वाली सटीक कैनोनिकल स्ट्रिंग को फिर से बनाना होगा और परिणामी हैश की तुलना पेलोड में audit_hash फ़ील्ड से करनी होगी।
1. कैनोनिकल स्ट्रिंग बनाएं
स्ट्रिंग को बिल्कुल इस तरह स्वरूपित किया जाना चाहिए, जिसे पाइप | वर्ण द्वारा अलग किया गया हो:
देर से अनुवाद न करें
महत्वपूर्ण फ़ॉर्मेटिंग नियम (ट्रेसलेट के रस्ट कोर पर आधारित):
latitudeऔरlongitude: बिल्कुल 6 दशमलव स्थानों पर स्वरूपित (जैसे,37.774900)।accuracy,speed,heading,altitude: बिल्कुल 2 दशमलव स्थानों पर स्वरूपित (जैसे,10.00)।is_moving:1(सही) या0(गलत) के रूप में स्वरूपित।
उदाहरण कैनोनिकल स्ट्रिंग:
f6e5d4c3b2a1...|TRACELET_AUDIT|42|loc-1234-abcd|37.774900|-122.419400|2024-01-01T00:00:00Z|10.00|15.50|90.00|100.00|12. हैश करें और तुलना करें
निर्मित कैनोनिकल स्ट्रिंग को मानक SHA-256 हैशिंग फ़ंक्शन के माध्यम से पास करें और इसे लोअरकेस हेक्साडेसिमल स्ट्रिंग में परिवर्तित करें।
- यदि आपका परिकलित हैश
audit_hashफ़ील्ड से मेल खाता है: स्थान गणितीय रूप से अछूता साबित हुआ है। - यदि यह मेल नहीं खाता: स्थान डेटा बदल दिया गया है। आपको तुरंत इस रिकॉर्ड को चिह्नित करना चाहिए और डिवाइस की जांच करनी चाहिए।
3. स्थान सटीकता प्रोफ़ाइल (एचएफ/एलएफ)
ट्रैसलेट उदाहरण ऐप की समीक्षा करते समय, आपको एलएफ सटीकता और एचएफ सटीकता के लिए बटन दिखाई देंगे। ये सीधे ट्रैसलेट की पूर्व-निर्मित कॉन्फ़िगरेशन प्रोफ़ाइल पर मैप होते हैं।
- एलएफ (कम आवृत्ति / कम सटीकता): यह
Config.lowPower()प्रोफ़ाइल पर मैप होता है। यह इंजन को केवल सेल-टावर और वाई-फाई ट्रायंगुलेशन (कोई जीपीएस नहीं) का उपयोग करने के लिए प्रतिबंधित करता है। यह अत्यधिक बैटरी कुशल है लेकिन व्यापक सटीकता त्रिज्या प्रदान करता है। - HF (उच्च आवृत्ति/उच्च सटीकता): यह
Config.highAccuracy()प्रोफ़ाइल पर मैप होता है। यह भौतिक जीपीएस चिप को चालू करता है, जिससे उच्च बैटरी खपत की कीमत पर 1-5 मीटर की सटीकता मिलती है।
4. कार्बन पदचिह्न अनुमानक और यात्रा रिपोर्ट
ट्रैसलेट में एक अंतर्निहित CarbonEstimator उपयोगिता शामिल है। यह किसी यात्रा के लिए अनुमानित CO₂ उत्सर्जन की गणना करने के लिए सटीक भौगोलिक दूरी के साथ गतिविधि पहचान (यह पता लगाना कि उपयोगकर्ता गाड़ी चला रहा है, पैदल चल रहा है या साइकिल चला रहा है) को फ़्यूज़ करता है। यह स्थिरता रिपोर्टिंग, कार्बन-ऑफसेट कार्यक्रम या ईएसजी (पर्यावरण, सामाजिक और शासन) अनुपालन के लिए महत्वपूर्ण है।
यह काम किस प्रकार करता है
- आप
CarbonEstimatorको इंस्टेंट करते हैं। - जब उपयोगकर्ता चलना शुरू करता है (
isMoving == true), तो आपstartTrip()को कॉल करते हैं। - आप अनुमानक में वास्तविक समय गतिविधि परिवर्तन (उदाहरण के लिए, पैदल चलने से ड्राइविंग पर स्विच करना) और स्थान फ़ीड करते हैं।
- जब उपयोगकर्ता चलना बंद कर देता है (
isMoving == false), तो आपTripCarbonSummaryउत्पन्न करने के लिएendTrip()को कॉल करते हैं।
कार्यान्वयन उदाहरण
final carbonEstimator = tl.CarbonEstimator();
// 1. Listen for motion changes to start and end trips
Tracelet.onMotionChange((loc) {
if (loc.isMoving) {
carbonEstimator.startTrip();
} else {
final summary = carbonEstimator.endTrip();
if (summary != null) {
print('Trip ended: \${summary.totalCarbonGrams}g CO2');
print('Total Distance: \${summary.totalDistanceMeters}m');
print('Dominant Mode: \${summary.dominantMode}'); // e.g. "driving"
}
}
});
// 2. Feed Activity Recognition data to detect the transport mode
Tracelet.onActivityChange((evt) {
// Activity names map to emissions factors internally (e.g., driving vs walking)
carbonEstimator.setActivity(evt.activity.name);
});
// 3. Feed location coordinates to accumulate distance accurately
Tracelet.onLocation((loc) {
carbonEstimator.onLocationReceived(
loc.coords.latitude,
loc.coords.longitude,
);
});परिणामी TripCarbonSummary को फिर आपके सर्वर से सिंक किया जा सकता है या पर्यावरण-अनुकूल परिवहन विकल्पों को प्रोत्साहित करने के लिए सीधे उपयोगकर्ता को प्रदर्शित किया जा सकता है।
5. दूरस्थ विन्यास
3.6.2 से आईओएस और एंड्रॉइड दोनों पर मूल रूप से लाया और लागू किया गया। पहले के संस्करणों ने remoteConfigUrl को स्वीकार किया था लेकिन इसे कभी प्राप्त नहीं किया था - मूल पक्ष चुपचाप स्थानीय कॉन्फ़िगरेशन पर वापस आ गया।
बेड़े और बड़ी तैनाती के लिए आपको अक्सर ट्रैकिंग व्यवहार बदलने की आवश्यकता होती है - सटीकता, सिंक ताल, जियोफेंस त्रिज्या, बैटरी बजट - ऐप अपडेट शिपिंग के बिना। ट्रैसलेट का रिमोट कॉन्फ़िगरेशन SDK को आपके स्वयं के HTTPS एंडपॉइंट से एक कॉन्फ़िगरेशन दस्तावेज़ खींचने देता है और इसे रनटाइम पर स्थानीय कॉन्फ़िगरेशन के शीर्ष पर लागू करने देता है।
रिमोट कॉन्फ़िगरेशन कैसे काम करता है
- आप अपने
AppConfigमेंremoteConfigUrl(और वैकल्पिक हेडर) सेट करें। ready()पर, SDK सबसे पहले ऑन-डिवाइस कैश से अंतिम सफलतापूर्वक प्राप्त कॉन्फ़िगरेशन को लागू करता है - इसलिए किसी भी नेटवर्क कॉल से पहले, औरready()को अवरुद्ध किए बिना, आपकी नवीनतम प्रकाशित सेटिंग्स पर तुरंत और ऑफ़लाइन पुन: लॉन्च शुरू हो जाता है।- इसके बाद यह बैकग्राउंड में आपके एंडपॉइंट से एक नई प्रतिलिपि प्राप्त करता है और इसे
setConfig()के समान रनटाइम पथ के माध्यम से लागू करता है - सक्रिय ट्रैकिंग पाइपलाइन को केवल तभी पुनरारंभ करना जब ट्रैकिंग-प्रासंगिक कुंजी वास्तव में बदल जाती है। - यह
remoteConfigRefreshIntervalताल (मिनटों में) पर पुनः प्राप्त करके कॉन्फ़िगरेशन को ताज़ा रखता है।
केवल HTTPS यूआरएल को सम्मानित किया जाता है - एक http:// यूआरएल को अस्वीकार कर दिया जाता है और लॉग किया जाता है, क्योंकि कॉन्फ़िगरेशन ट्रैकिंग व्यवहार को नियंत्रित करता है और पारगमन में छेड़छाड़ योग्य नहीं होना चाहिए।
समापन बिंदु अनुबंध
आपका समापन बिंदु एक JSON ऑब्जेक्ट के साथ GET का उत्तर देता है जिसका आकार ट्रैसलेट कॉन्फिग मैप जैसा होता है - या तो फ्लैट, या नेस्टेड { "geo": {…}, "app": {…}, "http": {…} } फॉर्म जो Config.toMap() उत्पन्न करता है। केवल आपके द्वारा शामिल की गई कुंजियाँ ओवरराइड की गई हैं; प्रत्येक अन्य सेटिंग अपना स्थानीय मान रखती है।
{
"geo": { "distanceFilter": 25.0, "desiredAccuracy": 0 },
"app": { "heartbeatInterval": 120 },
"http": { "autoSync": true }
}विन्यास
final config = Config.balanced().copyWith(
app: tl.AppConfig(
remoteConfigUrl: 'https://config.mycompany.com/tracelet/fleet-a.json',
remoteConfigHeaders: {'Authorization': 'Bearer $token'},
remoteConfigTimeout: 15000, // milliseconds
remoteConfigRefreshInterval: 60, // minutes
),
);| फ़ील्ड | प्रकार | डिफ़ॉल्ट | विवरण |
|---|---|---|---|
remoteConfigUrl | String? | null | HTTPS एंडपॉइंट JSON कॉन्फिग मैप लौटा रहा है। null रिमोट कॉन्फ़िगरेशन को अक्षम कर देता है। |
remoteConfigHeaders | Map<String, String>? | null | हेडर फ़ेच के साथ भेजे गए (उदाहरण के लिए ऑथ टोकन)। |
remoteConfigTimeout | int | 60000 | मिलीसेकेंड में टाइमआउट प्राप्त करें. |
remoteConfigRefreshInterval | int | 1440 | बैकग्राउंड रिफ्रेश के बीच मिनट (मूल रूप से 15 मिनट पर फ़्लोर)। 0 एक बार प्राप्त होता है और दोबारा कभी नहीं आता। |
लागू किए गए रिमोट मानों को डिवाइस के स्थायी कॉन्फ़िगरेशन में मर्ज कर दिया जाता है, और रिमोट ओवरराइड स्थानीय मानों पर जीत हासिल करते हैं। केवल वे मान प्रकाशित करें जिनका आप इरादा रखते हैं हर डिवाइस उस यूआरएल को अपनाने के लिए - प्रत्येक बिल्ड को एक अलग यूआरएल पर इंगित करके प्रति-बेड़े या प्रति-समूह का दायरा।
डार्ट से लागू रिमोट कॉन्फ़िगरेशन का अवलोकन करना
रिमोट कॉन्फिगरेशन लाया जाता है और मूल पक्ष पर लागू किया जाता है। 3.6.10 के बाद से, हर बार जब एक रिमोट ओवरराइड लागू किया जाता है - दोनों कैश्ड कॉपी ready() पर पुनर्स्थापित होती हैं और प्रत्येक पृष्ठभूमि ताज़ा होती है - एसडीके इसे डार्ट पर वापस भेज देता है:
Tracelet.activeConfig(और इसलिएtracelet_doctorऔर डार्ट-साइड बैटरी-बजट इंजन) अब आपके द्वारा स्थानीय रूप से सेट किए गए अंतिम कॉन्फ़िगरेशन के बजाय, प्राप्त मूल्यों को दर्शाता है।- सर्वर-संचालित परिवर्तन आने पर प्रतिक्रिया देने के लिए सदस्यता लें:
// Callback — fires after a remote override is applied.
// Tracelet.activeConfig already reflects the new values when this fires.
Tracelet.onRemoteConfig((Config config) {
print('Remote battery budget: ${config.geo.batteryBudgetPerHour}%/hr');
});
// …or listen to the broadcast stream directly.
final sub = Tracelet.remoteConfigStream.listen((config) {
// react to the merged, now-active config
});3.6.10 से पहले, दूरस्थ मानों को मूल ट्रैकिंग पर लागू किया गया था, लेकिन Tracelet.activeConfig में प्रतिबिंबित नहीं किया गया था, इसलिए डायग्नोस्टिक्स अभी भी अंतिम स्थानीय रूप से निर्धारित मान दिखा सकता था, भले ही ट्रैकिंग पहले से ही रिमोट का उपयोग कर रही हो।