ட்ரேஸ்லெட் ஒத்திசைவு: நெட்வொர்க் கதை
தரவு உங்கள் சர்வர்களை அடையவில்லை என்றால் இருப்பிட கண்காணிப்பு என்பது ஒன்றுமில்லை. எலிவேட்டர்களுக்குள் நுழையும் போது, பள்ளத்தாக்குகள் வழியாக வாகனம் ஓட்டும்போது அல்லது Wi-Fi இலிருந்து செல்லுலருக்கு மாறும்போது மொபைல் சாதனங்கள் தொடர்ந்து இணைப்பைக் குறைக்கின்றன. ட்ரேஸ்லெட் ஒத்திசைவு என்பது ஆஃப்லைன்-முதல், பேட்டரி-விழிப்புணர்வு நெட்வொர்க்கிங் இன்ஜின் ஆகும், இது UI ஐ எழுப்பாமல் தரவு விநியோகத்தை உறுதிசெய்ய வடிவமைக்கப்பட்டுள்ளது.
டிரேஸ்லெட் 3.2.0 புதுப்பிப்பு: HTTP ஒத்திசைவு தர்க்கம் tracelet_sync தொகுதிக்கு நகர்த்தப்பட்டது. உங்களுக்கு பிணைய ஒத்திசைவு தேவைப்பட்டால் இந்த தொகுதியைச் சேர்க்க வேண்டும்.
நெட்வொர்க்குடன் எவ்வாறு ஒத்திசைப்பது
ட்ரேஸ்லெட் கோர் இருப்பிடங்களைப் பிடிக்கும் போது, **tracelet_sync** என்பது பின்னணி HTTP இன்ஜின் ஆகும், அது அவற்றை உங்கள் சேவையகத்திற்கு வழங்குகிறது. அதை இயக்க, நீங்கள் கண்காணிக்கத் தொடங்கும் முன் TraceletSync.ready() ஐ துவக்கவும்:
import 'package:tracelet_sync/tracelet_sync.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 1. Configure the Sync Engine
await TraceletSync.ready(SyncConfig(
url: 'https://your-api.com/locations',
method: 'POST',
autoSyncThreshold: 10, // Sync every 10 locations
autoSyncDelay: 10000, // Wait 10s before pushing
syncInterval: 0, // (Optional) Seconds between repeating queue flushes; 0 = off
batchSync: true, // Send as a JSON array
maxBatchSize: 250, // Up to 250 locations per request
headers: {
'Authorization': 'Bearer YOUR_TOKEN'
},
));
// 2. Configure and start Tracelet Core as usual
await Tracelet.ready(Config.balanced());
await Tracelet.start();
}கட்டமைத்தவுடன், இயந்திரம் கீழே உள்ள அனைத்து காட்சிகளையும் தானாகவே கையாளும்!
காட்சி 1: மலை ஏற்றம்
கருத்துகள் ஆராயப்பட்டன: ஆஃப்லைன் க்யூயிங், பேட்ச் சின்க், டிபவுன்ஸ்
பிரச்சனை
மலைகள் வழியாக 3 மணிநேர நடைபயணத்தைக் கண்காணிக்க மார்க் உங்கள் உடற்பயிற்சி பயன்பாட்டைப் பயன்படுத்துகிறார். அவரிடம் ஜீரோ செல்லுலார் சேவை உள்ளது. உங்கள் ஆப்ஸ் ஒரு அடி எடுத்து வைக்கும் ஒவ்வொரு முறையும் HTTP POSTஐ முயற்சித்தால், அது தோல்வியடையும், சிக்னலைத் தேடும் பேட்டரி வீணாகும், மேலும் இருப்பிடப் புள்ளிகளை நிரந்தரமாக இழக்க நேரிடும். இறுதியாக அவர் தனது காரில் திரும்பும்போது, அவரது பாதை ஒரு வெற்று வரைபடம் போல இருக்கும்.
ட்ரேஸ்லெட் ஒத்திசைவு அதை எவ்வாறு தீர்க்கிறது
-
ஆஃப்லைன் SQLite நிலைத்தன்மை (
autoSyncThreshold) மார்க் சிக்னல் இல்லாததால், HTTP கோரிக்கைகளை அனுப்பும் முயற்சியை Tracelet உடனடியாக நிறுத்துகிறது. மாறாக, ஒவ்வொரு இடமும் உள்ளூர் SQLite தரவுத்தளத்தில் பாதுகாப்பாக சேமிக்கப்படும். நாங்கள்autoSyncThreshold: 100ஐ அமைத்துள்ளோம், அதாவது தரவுத்தளத்தில் குறைந்தது 100 புள்ளிகள் வரிசையாக இருக்கும் வரை ட்ரேஸ்லெட் நெட்வொர்க் ரேடியோவை எழுப்ப முயற்சிக்காது. -
Debounced Syncing (
autoSyncDelay) மார்க் இறுதியாக மலையிலிருந்து கீழே இறங்கி 4G ஐ மீண்டும் பெறும்போது, திடீரென்று 500 வரிசை இடங்களை அவர் பெற்றுள்ளார். 500 உடனடி HTTP கோரிக்கைகளை நீக்குவதற்குப் பதிலாக (அவரது மொபைலை முடக்கிவிடும்),autoSyncDelay: 10000ட்ரேஸ்லெட்டிடம் 10 வினாடிகள் காத்திருக்கச் சொல்கிறது. இது தரவின் விரைவான வருகையைத் தடுக்கிறது, இணைப்பை உறுதிப்படுத்த அனுமதிக்கிறது. -
தொகுப்பு ஒத்திசைவு (
batchSync&maxBatchSize) 500 தனிப்பட்டPOSTகோரிக்கைகளுக்குப் பதிலாக,batchSync: trueமற்றும்maxBatchSize: 250ஆகியவை இருப்பிடங்களை இரண்டு பெரிய JSON வரிசைகளாக இணைக்கின்றன. இது முதல் 250 புள்ளிகளை அனுப்புகிறது, உங்கள் சர்வர்HTTP 200 OKஐத் திருப்பித் தரும் வரை காத்திருக்கிறது, SQLite இலிருந்து அந்த புள்ளிகளை நீக்குகிறது, பின்னர் அடுத்த தொகுதியை அனுப்புகிறது. -
இடைவெளி அடிப்படையிலான ஒத்திசைவு (
syncInterval)autoSyncDelayபுதிய இருப்பிடங்களுக்கு எதிர்வினையாற்றுகிறது. உங்களுக்கு நேரத்தால் இயக்கப்படும் ஃப்ளஷ் தேவையென்றால் - எத்தனை புள்ளிகள் குவிந்திருந்தாலும், நிலையான கேடன்ஸில் வரிசைப்படுத்தப்பட்ட அனைத்தையும் பதிவேற்றலாம் - ஃப்ளஷ்களுக்கு இடையே உள்ள வினாடிகளின் எண்ணிக்கைக்குsyncIntervalஐ அமைக்கவும் (எ.கா.syncInterval: 60ஆஃப்லைன் வரிசையை நிமிடத்திற்கு ஒருமுறை ஃப்ளஷ் செய்யும்). இது debounce உடன் இயங்குகிறது மற்றும் இயல்பாகவே முடக்கப்பட்டுள்ளது (0).
காட்சி 2: Cafe Wi-Fi உடன் இணைக்கிறது
கருத்துகள் ஆராயப்பட்டன: செல்லுலார் கட்டுப்பாடுகள், டெல்டா சுருக்கம்
பிரச்சனை
மார்க் தனது பயணத்தை முடித்துவிட்டு ஒரு ஓட்டலுக்குச் செல்கிறார். அவர் சர்வதேச அளவில் பயணம் செய்கிறார், எனவே அவரது செல்லுலார் தரவுத் திட்டம் மிகவும் விலை உயர்ந்தது. உங்கள் ஆப்ஸ் JSON இருப்பிடத் தரவின் மெகாபைட்களை வரிசைப்படுத்தியுள்ளது, மேலும் அதை அவரது ரோமிங் 4G இணைப்பு மூலம் அனுப்பினால் அவருக்கு பணம் செலவாகும்.
ட்ரேஸ்லெட் ஒத்திசைவு அதை எவ்வாறு தீர்க்கிறது
-
செல்லுலார் கட்டுப்பாடு (
disableAutoSyncOnCellular)disableAutoSyncOnCellular: trueஐ அமைப்பதன் மூலம், மார்க் 4G இல் இருக்கும்போது டிராஸ்லெட் ஒத்திசைவு இயந்திரத்தை முழுவதுமாகத் தடுக்கிறது. SQLite இல் இருப்பிடங்கள் பாதுகாப்பாக இருக்கும். அவர் ஓட்டலின் வைஃபையுடன் இணைக்கும் தருணத்தில், OS ட்ரேஸ்லெட்டை எழுப்புகிறது, மேலும் ஒத்திசைவு இயந்திரம் தானாக வரிசையை சுத்தப்படுத்துகிறது. -
டெல்டா குறியாக்க சுருக்கம் (
enableDeltaCompression) Wi-Fi இல் கூட, மிகப்பெரிய JSON வரிசைகளை அனுப்புவது மெதுவாக உள்ளது. தொகுப்பை அனுப்புவதற்கு முன் ட்ரேஸ்லெட் டெல்டா சுருக்கத்தை பயன்படுத்துகிறது. மார்க் நேர்கோட்டில் நடந்தால், அவரது அட்சரேகை பெரிதாக மாறவில்லை. ஒவ்வொரு புள்ளிக்கும் முழு ஆயங்களை அனுப்புவதற்குப் பதிலாக, ட்ரேஸ்லெட் முதல் புள்ளியை முழுமையாக அனுப்புகிறது, பின்னர் அடுத்த புள்ளிகளுக்கு வேறுபாடு (டெல்டா) மட்டுமே அனுப்புகிறது.deltaCoordinatePrecision: 5(~1.1 மீட்டர் வரை துல்லியமானது), இது HTTP பேலோட் அளவை 60% முதல் 80% வரை குறைக்கிறது.
நிலையான பேலோட் (அழுத்தம் இல்லை):
[
{"lat": 37.774900, "lng": -122.419400},
{"lat": 37.774910, "lng": -122.419410},
{"lat": 37.774920, "lng": -122.419420}
]டெல்டா குறியிடப்பட்ட பேலோட் (உங்கள் சர்வர் என்ன பெறுகிறது):
[
{"lat": 37.774900, "lng": -122.419400},
{"dLat": 10, "dLng": 10},
{"dLat": 10, "dLng": 10}
]காட்சி 3: காலாவதியான அமர்வு
கருத்துகள் ஆராயப்பட்டன: 401 முயற்சிகள், தலையில்லாத அழைப்புகள், அதிவேக பின்னடைவு
பிரச்சனை
அவர் நடைபயணம் மேற்கொண்டபோது மார்க்கின் அங்கீகார டோக்கன் (JWT) காலாவதியானது. Tracelet இறுதியாக உங்கள் சர்வரில் தொகுப்பை ஒத்திசைக்க முயற்சிக்கும் போது, உங்கள் API ஆனது HTTP 401 Unauthorized ஐ வழங்கும். ஒரு அப்பாவி ஒத்திசைவு இயந்திரம், தரவு தோல்வியடைந்ததாக நினைத்து அதை நீக்கும் அல்லது 401s இன் எல்லையற்ற சுழற்சியில் சிக்கி, பேட்டரியை வடிகட்டிவிடும். திரை அணைக்கப்பட்ட நிலையில் மார்க்கின் ஃபோன் பாக்கெட்டில் உள்ளது—அவரால் இப்போது உள்நுழைய முடியாது.
ட்ரேஸ்லெட் ஒத்திசைவு அதை எவ்வாறு தீர்க்கிறது
- டைனமிக் ஹெடர் கால்பேக்குகள் ட்ரேஸ்லெட் 401ஐப் பெறும்போது, மீண்டும் முயற்சிக்கும் முன் அது புதிய டோக்கனைப் பெற வேண்டும். முன்புறம் மற்றும் பின்புலம் (தலையில்லாத) நிலைகள் இரண்டிலும் இதைக் கையாள நீங்கள் அழைப்புகளைப் பதிவு செய்கிறீர்கள்.
முன்புற அழைப்பு:
tl.Tracelet.setHeadersCallback(() async {
final newJwt = await AuthAPI.refreshToken();
return {'Authorization': 'Bearer $newJwt'};
});பின்னணி (ஹெட்லெஸ்) கால்பேக்: இது உங்கள் UI ஐ எழுப்பாமலேயே தனிமைப்படுத்தப்பட்ட டார்ட் எஞ்சினில் இயங்கும், பயனர் கட்டாயப்படுத்தி பயன்பாட்டை விட்டு வெளியேறினாலும் ஒத்திசைவு செயல்படுவதை உறுதி செய்கிறது.
@pragma('vm:entry-point')
void headlessHeadersCallback(tl.HeadlessEvent event) async {
final newJwt = await AuthAPI.refreshToken();
tl.Tracelet.setDynamicHeaders({'Authorization': 'Bearer $newJwt'});
}
// Register it before runApp()
tl.Tracelet.registerHeadlessHeadersCallback(headlessHeadersCallback);- அதிவேக பின்னடைவு (
maxRetries&retryBackoffCap) உங்கள் அங்கீகாரச் சேவையகம் செயலிழந்து 503ஐக் கொடுத்தால் என்ன செய்வது? ட்ரேஸ்லெட் இதை அழகாக கையாளுகிறது. இது மீண்டும் முயற்சிக்கிறது. அது தோல்வியடைகிறது. இது 1 வினாடி (retryBackoffBase), பிறகு 2 வினாடிகள், பிறகு 4 வினாடிகள் காத்திருக்கிறது. அதிவேக பேக்ஆஃப் 60 வினாடிகள் (retryBackoffCap) ஆக உள்ளது. 3 முயற்சிகளுக்குப் பிறகு (maxRetries), அது முழுவதுமாக கைவிட்டு, டேட்டாவை SQLite இல் பாதுகாப்பாக விட்டுவிட்டு நாளை மீண்டும் முயற்சிக்கவும்.
காட்சி 4: தனிப்பயன் சர்வர் திட்டம்
கருத்துகள் ஆராயப்பட்டன: தனிப்பயன் ஒத்திசைவு பாடி பில்டர்கள், ஸ்கீமா மேப்பிங்
பிரச்சனை
மார்க்கின் நிறுவனம் ஒரு பாரம்பரிய பின்தளத்தைக் கொண்டுள்ளது, இது இருப்பிடத் தரவை மிகவும் குறிப்பிட்ட, தரமற்ற வடிவத்தில் எதிர்பார்க்கிறது. ட்ரேஸ்லெட்டின் இயல்புநிலை JSON பேலோட் அவர்களின் சேவையகத்தின் தேவையான திட்டத்துடன் பொருந்தவில்லை, மேலும் இந்தப் பயன்பாட்டிற்காக மட்டும் பின்தள API ஐ மாற்ற முடியாது.
ட்ரேஸ்லெட் ஒத்திசைவு அதை எவ்வாறு தீர்க்கிறது
- தனிப்பயன் ஒத்திசைவு பாடி பில்டர் (
setSyncBodyBuilder) இயல்புநிலை JSON ரேப்பரைப் பயன்படுத்துவதற்குப் பதிலாக, ட்ரேஸ்லெட், நெட்வொர்க்கில் அனுப்பப்படுவதற்கு முன்பே, இருப்பிடங்களின் தொகுப்பை இடைமறித்து, உங்கள் சர்வர் விரும்பும் எந்த வடிவத்திலும் அவற்றை வரைபடமாக்க அனுமதிக்கிறது.
டிரேஸ்லெட் 3.2.8 இலிருந்து தொடங்கி, இந்த பில்டருக்கு அனுப்பப்பட்ட இடங்கள் வலுவான உள்ளமைக்கப்பட்ட திட்டத்தை பயன்படுத்துகின்றன (இங்கு ஆயத்தொலைவுகள் coords இன் கீழ் மற்றும் செயல்பாட்டுத் தரவு activity இன் கீழ் பாதுகாப்பாக தொகுக்கப்படும்).
Tracelet.setSyncBodyBuilder((context) async {
// Map Tracelet's nested schema to your legacy server's flat schema
final mappedPoints = context.locations.map((loc) {
final coords = loc['coords'] as Map;
final activity = loc['activity'] as Map;
return {
'lat': coords['latitude'],
'lng': coords['longitude'],
'time': loc['timestamp'],
'moving': loc['is_moving'],
'action': activity['type'],
};
}).toList();
// Return the exact JSON structure your server expects
return {
'device_id': myDeviceId,
'payload': mappedPoints,
};
});- தலை இல்லாத மரணதண்டனை
டோக்கன் புதுப்பிப்புகளைப் போலவே, இந்தப் பிரத்தியேக பாடி பில்டிங்கையும்
registerHeadlessSyncBodyBuilder()மூலம் பின்னணியில் முற்றிலும் தலையில்லாமல் செயல்படுத்தலாம், பயன்பாடு முற்றிலும் நிறுத்தப்பட்டாலும் உங்கள் தனிப்பயன் ஸ்கீமா கட்டமைக்கப்பட்டு அனுப்பப்படுவதை உறுதிசெய்கிறது.
காட்சி 5: டெலிவரி டிரைவர்
கருத்துகள் ஆராயப்பட்டன: பாதை சூழல் & வணிக லாஜிக் ஊசி
பிரச்சனை
உங்கள் பின்தளம் ஆயிரக்கணக்கான மூல ஆயங்களை பெறுகிறது. ஆனால் ஒரு ஒருங்கிணைப்பு மட்டும் உங்களுக்கு ஏன் பயனர் அங்கு இருந்தார் என்று சொல்லாது. ஓட்டுநர் டெலிவரி பணியில் இருந்தாரா? அவர்கள் எந்த ஆர்டரை வழங்குகிறார்கள்? பிசினஸ் லாஜிக்கை நேரடியாக பின்னணி இருப்பிட பேலோடில் இணைக்க உங்களுக்கு ஒரு வழி தேவை, எனவே அதை உங்கள் தரவுத்தளத்தில் எளிதாக வினவலாம்.
ட்ரேஸ்லெட் ஒத்திசைவு அதை எவ்வாறு தீர்க்கிறது
-
வழிச் சூழலை அமைத்தல் தனிப்பயன் மெட்டாடேட்டாவை ட்ரேஸ்லெட்டில் செலுத்தலாம். நீங்கள்
setRouteContext()ஐ அழைத்த பிறகு பதிவுசெய்யப்பட்ட ஒவ்வொரு இடமும் தானாகவே SQLite தரவுத்தளத்தில் இந்தத் தரவுடன் நிரந்தரமாகக் குறிக்கப்படும்.await tl.Tracelet.setRouteContext( const tl.RouteContext( taskId: 'delivery-1234', driverId: 'john_doe', custom: {'shift_id': 'morning-shift-001'}, ), ); -
விளைவான JSON பேலோட் ட்ரேஸ்லெட் உங்கள் பின்தளத்தில் ஒத்திசைக்கும்போது, வரிசையில் உள்ள ஒவ்வொரு இடமும்
contextஆப்ஜெக்ட்டை உள்ளடக்கும், இந்த இடம் எந்தப் பணியைச் சார்ந்தது என்பதை உங்கள் பின்தளத்திற்குத் தெரியும்.{ "locations": [ { "coords": { "latitude": 37.7749, "longitude": -122.4194 }, "battery": { "level": 0.85, "isCharging": true }, "extras": { "your_custom_key": "your_value" }, "context": { "taskId": "delivery-1234", "driverId": "john_doe", "custom": { "shift_id": "morning-shift-001" } } } ] }
பேட்டரி நிலை கண்காணிப்பு
ட்ரேஸ்லெட் கடினமான, ஆஃப்லைன் சூழல்களுக்காக வடிவமைக்கப்பட்டுள்ளது, அங்கு ஒரு இருப்பிடம் பதிவுசெய்யப்பட்ட சில மணிநேரங்களுக்குப் பிறகு சாதனங்கள் ஒத்திசைக்கப்படலாம். புலத்தில் சாதனத்தின் ஆரோக்கியத்தைப் புரிந்துகொள்ள உங்களுக்கு உதவ, ஒவ்வொரு இருப்பிடமும் பதிவுசெய்யப்படும் தருணத்தில் ட்ரேஸ்லெட் தானாகவே சரியான பேட்டரி நிலையைப் பிடிக்கும்.
இதற்கு பூஜ்ஜிய கட்டமைப்பு தேவை:
- இயந்திரம்
level(எ.கா. 85%க்கு 0.85) மற்றும்isChargingநிலையைப் பிடிக்கிறது. - இந்த நிலை GPS ஆயத்தொலைவுகளுடன் ஆஃப்லைன் SQLite தரவுத்தளத்தில் பாதுகாப்பாகச் சேமிக்கப்படுகிறது.
- சாதனம் மீண்டும் ஆன்லைனில் வரும்போது, ஒத்திசைவு இயந்திரம் தற்போதைய பேட்டரி நிலையை அல்ல, சரியான வரலாற்று பேட்டரி நிலையை அனுப்பும்.
இது உங்கள் பின்தளத்தை ஒரு பாதையில் பேட்டரி வடிகட்டுவதைத் துல்லியமாகக் காட்சிப்படுத்த அனுமதிக்கிறது அல்லது ஷிப்ட்களின் போது இயக்கிகள் தொடர்ந்து தங்கள் சாதனங்களைத் துண்டிக்கிறார்களா என்பதைக் கண்டறியவும்.
-
சூழலை அழித்தல் ஓட்டுநர் டெலிவரியை முடித்ததும், சூழலை அழிக்கவும். அடுத்தடுத்த இடங்கள் இனி குறியிடப்படாது.
await tl.Tracelet.clearRouteContext();
ஒத்திசைப்பதற்கு முன் இந்த சூழலின் அடிப்படையில் உள் SQLite தரவுத்தளத்தை நீங்கள் வினவலாம்:
// Get all locations belonging to a specific delivery task
final locations = await tl.Tracelet.getLocations(
tl.SQLQuery(where: "context_task_id = 'delivery-1234'")
);