توسعه برای شبکه های ماهواره ای محدود

شبکه‌های ماهواره‌ای روزی به اندازه کافی قوی خواهند شد تا مانند شبکه‌های معمولی عمل کنند و به طور یکپارچه با همه موارد استفاده از برنامه‌ها کار کنند؛ اما در حال حاضر، داده‌ها در این شبکه‌ها منبع کمیابی هستند. یک شبکه مبتنی بر ماهواره با محدودیت‌هایی در استفاده از داده‌ها ، شبکه ماهواره‌ای محدود نامیده می‌شود.

به دلیل این محدودیت‌ها، برنامه‌های اندروید به طور پیش‌فرض از این شبکه‌ها استفاده نمی‌کنند. اگر می‌خواهید برنامه شما روی شبکه‌های ماهواره‌ای محدود کار کند، باید برنامه خود را به عنوان برنامه‌ای که برای استفاده از داده‌های ماهواره‌ای بهینه شده است، شناسایی کنید و موارد استفاده برنامه خود را برای صرفه‌جویی در منابع هنگام اتصال به یک شبکه ماهواره‌ای محدود تطبیق دهید .

موارد استفاده برنامه خود را تطبیق دهید

تنها کاری که باید انجام دهید تا به برنامه خود اجازه دسترسی به شبکه‌های ماهواره‌ای محدود را بدهید، این است که آن را فعال کنید، اما ممکن است لازم باشد تغییرات بیشتری ایجاد کنید تا رفتار برنامه خود را بهینه کنید تا از منابع محدود شبکه به طور مسئولانه استفاده کند. در اینجا مواردی وجود دارد که باید هنگام بهینه‌سازی برای استفاده از داده‌های محدود در نظر بگیرید:

  • شبکه‌های ماهواره‌ای در شرایط بسیار محدودتری نسبت به شبکه‌های LTE/5G زمینی کار می‌کنند که با توان عملیاتی پایین‌تر و تأخیر بالاتر مشخص می‌شوند. اگرچه ما عموماً به دلایل قابلیت اطمینان، به حداقل رساندن استفاده از داده‌ها را توصیه می‌کنیم، اما هر برنامه منحصر به فرد است. شما باید موارد استفاده خاص خود را ارزیابی کنید تا مشخص شود که آیا استراتژی‌های بهینه‌سازی داده‌های فعلی شما، تجربه کاربری قابل قبولی را در این محیط‌های محدود ارائه می‌دهند یا خیر.
  • تصمیم بگیرید که آیا برنامه شما برای استفاده در شبکه‌های محدود مناسب است یا خیر. برخی از برنامه‌ها تحت هیچ شرایطی برای شبکه‌های محدود داده مناسب نیستند. به عنوان مثال، برنامه‌هایی که به پهنای باند بالا نیاز دارند، مانند پخش ویدئو، باید فشرده‌سازی داده‌ها و مکانیسم‌های تحویل محتوا را ارزیابی کنند تا از یک تجربه کاربری کارآمد اطمینان حاصل شود. اگر به دلیل محدودیت‌های داده، تجربه کاربری ضعیف اجتناب‌ناپذیر باشد، برنامه باید اقدامات زیر را انجام دهد:
    1. ممکن است برنامه‌ها اصلاً از شبکه‌های ماهواره‌ای استفاده نکنند ، هرچند که همچنان می‌توانند وجود یک شبکه ماهواره‌ای را شناسایی کرده و به کاربر اطلاع دهند که در شبکه محدود موجود کار نخواهند کرد.
    2. موارد استفاده خاص را برای محدود کردن یا اصلاح شناسایی کنید. برخی از ویژگی‌های برنامه شما ممکن است برای شرایط داده محدود مناسب‌تر از سایرین باشند. به عنوان مثال، عملیات پهنای باند کم مانند ارسال پیام‌های متنی بسیار قابل اعتماد هستند. با این حال، عملیات پهنای باند بالا، مانند آپلود ویدیوی HD فشرده نشده، ممکن است بافر یا خرابی قابل توجهی را تجربه کنند. ما توصیه می‌کنیم برای این ویژگی‌های دشوار، پخش تطبیقی ​​بیت ریت یا فشرده‌سازی قوی را پیاده‌سازی کنید. این مشابه روشی است که بسیاری از برنامه‌ها هنگام رومینگ رفتار خود را تغییر می‌دهند.
    3. نحوه استفاده برنامه خود از منابع شبکه را تنظیم کنید. شبکه‌های محدود زمانی بهترین عملکرد را دارند که برنامه‌ها عملیات شبکه را به صورت پشت سر هم انجام دهند و بیشتر زمان را بدون استفاده از شبکه بگذرانند. تأخیر متغیر می‌تواند ارتباط همزمان در زمان واقعی را چالش برانگیز کند.

همچنین اگر برنامه شما از منطق شبکه پیچیده یا Firebase Cloud Messaging استفاده می‌کند، باید تغییرات خاصی ایجاد کنید.

خود را به عنوان بهینه شده برای شبکه‌های محدود معرفی کنید

برای شناسایی برنامه خود به عنوان برنامه‌ای بهینه شده برای شبکه‌های محدود و انتخاب استفاده از آنها، فایل مانیفست برنامه خود را با یک عنصر <meta-data> به صورت زیر به‌روزرسانی کنید:

<meta-data android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
          android:value="PACKAGE_NAME" />

این عنصر به برنامه شما اجازه می‌دهد تا از یک شبکه ماهواره‌ای محدود، زمانی که تنها شبکه موجود است، استفاده کند. همچنین به سیستم اطلاع می‌دهد که برنامه شما برای شبکه‌های محدود بهینه شده است و با فهرست کردن آن در میان برنامه‌های دارای قابلیت ماهواره در برنامه تنظیمات، به شناسایی کاربر کمک می‌کند.

تغییر رفتار تحت شرایط داده محدود

اگر نیاز دارید رفتار برنامه خود را هنگام استفاده از یک شبکه محدود تغییر دهید، یا اگر برنامه شما منطق از پیش موجودی دارد که ConnectivityManager برای مدیریت استفاده از شبکه استفاده می‌کند، باید تغییراتی در جریان شبکه خود ایجاد کنید.

تشخیص شرایط داده محدود

شیء NetworkCapabilities که برای درخواست‌های شبکه استفاده می‌شود، شامل یک بیت NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED است که به طور پیش‌فرض در همه شبکه‌ها تنظیم شده و در شبکه‌هایی که از نظر پهنای باند محدود هستند، حذف می‌شود. می‌توانید با بررسی اینکه آیا یک شبکه قابلیت NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED را دارد یا خیر، تعیین کنید که آیا پهنای باند محدود دارد یا خیر.

کار با شبکه‌های محدود

اشیاء NetworkRequest همچنین به طور پیش‌فرض شامل قابلیت NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED هستند. این قابلیت را حذف کنید تا نشان دهید که شبکه‌های محدود قابل قبول هستند.

وقتی تشخیص دادید که به یک شبکه محدود متصل شده‌اید، می‌توانید ویژگی‌های برنامه خود را در صورت لزوم تطبیق دهید:

کاتلین

val HandlerThread = HandlerThread("SatelliteNetworkMonitor"
handlerThread.start()
val handler = Handler(handlerThread.getLooper())

// Make the network request.
val request = NetworkRequest.Builder()
    .addCapability(NET_CAPABILITY_INTERNET
    .removeCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)
    .build()

// Register for the callback.
val callback = NetworkCallback() {
    override fun onCapabilitiesChanged(net: Network, nc: NetWorkCapabilities) {
        updateAppUseCases(net, nc)
    }

    fun updateAppUseCases(net: Network, nc: NetworkCapabilities) {
        if (!nc.hasCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) ||
             nc.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) {
            // Adapt to constrained network or disable heavy data usage features.
            ...
        } else {
            // Revert to unconstrained behavior.
            ...
        }
    }
}
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler)

جاوا

HandlerThread handlerThread = new HandlerThread("SatelliteNetworkMonitor");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());

// Make the network request.
NetworkRequest request = new NetworkRequest.Builder()
    .addCapability(NET_CAPABILITY_INTERNET)
    .removeCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)
    .build();

// Register for the callback.
NetworkCallback callback = new NetworkCallback() {
    @Override
    public void onCapabilitiesChanged(Network net, NetworkCapabilities nc) {
        updateAppUsecases(net, nc);
    }
    private void updateAppUsecases(Network net, NetworkCapabilities nc) {
        if (!nc.hasCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) || nc.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) {
            // Adapt to constrained network or disable heavy data usage features.
            ...
        } else {
            // Revert to unconstrained behavior.
            ...
        }
    }
};
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler);

دریافت پیام‌های FCM در شبکه‌های محدود

اگر برنامه شما از Firebase Cloud Messaging (FCM) برای دریافت پیام از سرور برنامه استفاده می‌کند، می‌توانید با اضافه کردن پرچم bandwidth_constrained_ok هنگام ارسال پیام به سرور FCM، مشخص کنید که یک پیام خاص حتی در شبکه‌های محدود نیز باید تحویل داده شود:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
    "android": {
       "bandwidth_constrained_ok": true
    }
  }
}

اگر پیامی شامل این پرچم نباشد، سرور FCM فقط زمانی آن را ارسال می‌کند که دستگاه از طریق یک شبکه بدون محدودیت متصل باشد.