platform_comm.h 9.3 KB
//
//  platform_comm.h
//  BBAAPIRequest
//
//  Created by Liu,Muye on 2018/11/14.
//

#ifndef platform_comm_h
#define platform_comm_h

#include <string>

#ifdef ANDROID
#include "mars/comm/thread/mutex.h"
#endif


#ifndef __cplusplus
#error "C++ only"
#endif

namespace apirequest {
namespace sdt {

enum NetType {
    kNoNet = -1,
    kWifi = 1,
    kMobile = 2,
    kOtherNet = 3
};
int getNetInfo();

bool getCurRadioAccessNetworkInfo(struct RadioAccessNetworkInfo& _info);

struct WifiInfo {
    std::string ssid;
    std::string bssid;
};
bool getCurWifiInfo(WifiInfo& _wifi_info);

struct SIMInfo {
    std::string isp_code;
    std::string isp_name;
};
bool getCurSIMInfo(SIMInfo& _sim_info);

struct APNInfo {
    APNInfo(): nettype(kNoNet-1), sub_nettype(0), extra_info("") {}
    int nettype;
    int sub_nettype;
    std::string extra_info;
};
bool getAPNInfo(APNInfo& info);

bool getIsIPV4Reachable();
bool getIsIPV6Reachable();
#if __cplusplus >= 201103L
#  define __CXX11_CONSTEXPR__ constexpr
#else
#  define __CXX11_CONSTEXPR__
#endif

__CXX11_CONSTEXPR__ static const char* const GPRS = "GPRS";
__CXX11_CONSTEXPR__ static const char* const Edge = "Edge";
__CXX11_CONSTEXPR__ static const char* const WCDMA = "WCDMA";
__CXX11_CONSTEXPR__ static const char* const HSDPA = "HSDPA";
__CXX11_CONSTEXPR__ static const char* const HSUPA = "HSUPA";
__CXX11_CONSTEXPR__ static const char* const CDMA1x = "CDMA1x";
__CXX11_CONSTEXPR__ static const char* const CDMAEVDORev0 = "CDMAEVDORev0";
__CXX11_CONSTEXPR__ static const char* const CDMAEVDORevA = "CDMAEVDORevA";
__CXX11_CONSTEXPR__ static const char* const CDMAEVDORevB = "CDMAEVDORevB";
__CXX11_CONSTEXPR__ static const char* const eHRPD = "eHRPD";
__CXX11_CONSTEXPR__ static const char* const LTE  = "LTE";
__CXX11_CONSTEXPR__ static const char* const UMTS  = "UMTS";
__CXX11_CONSTEXPR__ static const char* const CDMA  = "CDMA";
__CXX11_CONSTEXPR__ static const char* const HSPA = "HSPA";
__CXX11_CONSTEXPR__ static const char* const IDEN = "IDEN";
__CXX11_CONSTEXPR__ static const char* const HSPAP = "HSPA+";
__CXX11_CONSTEXPR__ static const char* const NR = "NR";
__CXX11_CONSTEXPR__ static const char* const NRNSA = "NRNSA";


struct RadioAccessNetworkInfo {
    /***
     一、制式演进路线
     
     1.GSM - WCDMA R99 - LTE FDD路线
     2G       GSM
     2.5G    GPRS
     2.75G  EDGE
     3G       WCDMA R99
     3.5G    HSPA(分HSUPA和HSDPA)
     3.75G  HSPA+(分HSUPA+和HSDPA+)
     3.9G    LTE FDD
     
     2.CDMA IS 95 - CDMA 2000 EV-DO Rev.A - LTE FDD路线
     2G       CDMA IS 95
     2.5G    CDMA 1X
     2.75G  CDMA 2000 EV-DO Rev.0
     3G       CDMA 2000 EV-DO Rev.A
     3.5G    跳过
     3.75G  跳过
     3.9G    LTE FDD
     
     3.CDMA IS 95 - CDMA 2000 EV-DO Rev.A - UMB路线
     2G       CDMA IS 95
     2.5G    CDMA 1X
     2.75G  CDMA 2000 EV-DO Rev.0
     3G       CDMA 2000 EV-DO Rev.A
     3.5G    CDMA 2000 EV-DO Rev.B
     3.75G  跳过
     3.9G    UMB
     
     4.GSM - TD-SCDMA - LTE TDD路线
     2G       GSM
     2.5G    跳过
     2.75G  跳过
     3G       TD-SCDMA
     3.5G    TD-HSPA(分TD-HSUPA和TD-HSDPA)
     3.75G  TD-HSPA+(分TD-HSUPA+和TD-HSDPA+)
     3.9G    LTE TDD
     
     
     二、路线点评
     1.GSM - WCDMA R99 - LTE FDD路线
     iPhone以及大部分主流手机的支持制式路线,使用率高达70%,现中国联通路线,技术成熟。为欧洲提议,全球流行。
     
     2.CDMA IS 95 - CDMA 2000 EV-DO Rev.A - LTE FDD/UMB路线
     由2G非主流CDMA演变而来,技术稳定,使用率高达20%,现中国电信路线。美国高通提议,LTE FDD转接部分为摩托罗拉公司提议。美日韩流行。
     
     3.GSM - TD-SCDMA - LTE TDD路线
     与第一个路线相反,它采用了TD时分技术,不可能和FD频分技术融合。技术新兴,使用率高达10%,兼容终端不多,现中国移动路线,中国大唐提议,中国流行,受Govements看好,支持。
     
     三、各制式点评介绍
     2G:
     GSM:最基本、主流的技术,无话可说。(中国除133、153、180、189号段外使用的技术)
     CDMA IS 95:最基本、辐射低的技术,无话可说。(中国133、153、180、189号段使用的技术)
     
     2.5G:
     GPRS:GSM演进走出的中央的一步。(中国除133、153、180、189号段外使用的技术)
     CDMA 1X:CDMA提供数据服务重要的一步。(中国133、153、180、189号段使用的技术)
     
     2.75G:
     EDGE:被人们无视的一种重要技术,90%机油没用gprs服务,而是这个服务。(中国除133、153、180、189号段外使用的技术)
     CDMA 2000 EV-DO Rev.0:被电信强烈无视的一种技术。(中国133、153、180、189号段使用的技术)
     
     3G:
     WCDMA:传说中最强的技术,上下行皆是其它3G技术的2倍多!(中国185、186号段使用的技术)
     CDMA 2000 EV-DO Rev.A:电信寄予它便宜的资本,用便宜的价格售出,无疑性价比超高!(中国189、180号段使用的技术)
     TD-SCDMA:国货,外货(基本除了国产和移动定制很少终端支持)的来支持它吧,移动服务值得肯定!(中国187、188号段使用的技术)
     
     3.5G:
     HSDPA:WCDMA的加速技术,主要增加下载速度,可与HSUPA自由调节。(中国未发展)
     HSUPA:WCDMA的加速技术,主要增加上传速度,可与HSDPA自由调节。(中国未发展)
     TD-HSDPA:TD-SCDMA的加速技术,主要增加下载速度,可与TD-HSUPA自由调节。(中国未发展,移动想跳过)
     TD-HSUPA:TD-SCDMA的加速技术,主要增加上传速度,可与TD-HSDPA自由调节。(中国未发展,移动想跳过)
     CDMA 2000 EV-DO Rev.B:CDMA终结技术,稳定+高速,曾经WCDMA的挑衅对象。(中国未发展)
     
     3.75G:
     HSDPA+:WCDMA的高级加速技术,主要增加下载速度,可与HSUPA(+)自由调节。(中国未发展)
     HSUPA+:WCDMA的高级加速技术,主要增加上传速度,可与HSDPA(+)自由调节。(中国未发展)
     TD-HSDPA+:TD-SCDMA的高级加速技术,主要增加下载速度,可与TD-HSUPA(+)自由调节。(中国未发展,移动想跳过)
     TD-HSUPA+:TD-SCDMA的高级加速技术,主要增加上传速度,可与TD-HSDPA(+)自由调节。(中国未发展,移动想跳过)
     
     3.9G:
     LTE FDD:Wi-Fi终结者,拥有比WLAN快10倍的能力,估速将达到4M/S以上,兼容性强!是CDMA2000和WCDMA歧路同归的重要制式!(中国未发展)
     LTE TDD:世b0会展出对象,尖端技术,比FDD早发展一年,网速和FDD差不多,但不成熟,兼容性弱!(湖北移动、上海移动已启动试运营,国家大力推广)
     ***/
    
    std::string  radio_access_network;
    
    bool Is2G() const { return radio_access_network == GPRS || radio_access_network == CDMA1x || radio_access_network == Edge || radio_access_network == CDMAEVDORev0 || radio_access_network == UMTS || radio_access_network == CDMA;}
    bool Is3G() const { return radio_access_network == WCDMA || radio_access_network == CDMAEVDORevA || radio_access_network == HSDPA || radio_access_network == HSUPA || radio_access_network == CDMAEVDORevB || radio_access_network == eHRPD || radio_access_network == HSPAP || radio_access_network == HSPA;}
    bool Is4G() const { return radio_access_network == LTE;}
    bool Is5G() const { return radio_access_network == NR || radio_access_network == NRNSA;}
    bool IsUnknown() const { return !Is2G() && !Is3G() && !Is4G() && !Is5G();}
};

bool getCurRadioAccessNetworkInfo(RadioAccessNetworkInfo& _raninfo);

unsigned int getSignal(bool isWifi);
bool isNetworkConnected();

bool getifaddrs_ipv4_hotspot(std::string& _ifname, std::string& _ifip);

inline int getCurrNetLabel(std::string& netInfo) {
    netInfo = "defalut";
    int netId = getNetInfo();
    
    if (netId == kNoNet) {
        netInfo = "";
        return netId;
    }
    
    switch (netId) {
        case kWifi: {
            WifiInfo wifiInfo;
            
            if (getCurWifiInfo(wifiInfo)) {
                netInfo = wifiInfo.ssid;
            } else {
                netInfo = "no_ssid_wifi";
            }
            
            break;
        }
            
        case kMobile: {
            SIMInfo simInfo;
            
            if (getCurSIMInfo(simInfo)) {
                netInfo = simInfo.isp_code;
            } else {
                netInfo = "no_ispCode_mobile";
            }
            
            break;
        }
            
        case kOtherNet: {
            netInfo = "other";
            break;
        }
            
        default: {
            break;
        }
    }
    
    return netId;
}

#ifdef __APPLE__
float publiccomponent_GetSystemVersion();
#endif

#ifdef ANDROID
bool startAlarm(int64_t id, int after);
bool stopAlarm(int64_t id);

void* wakeupLock_new();
void  wakeupLock_delete(void* _object);
void  wakeupLock_Lock(void* _object);
void  wakeupLock_Lock_Timeout(void* _object, int64_t _timeout);
void  wakeupLock_Unlock(void* _object);
bool  wakeupLock_IsLocking(void* _object);
#endif

#ifdef ANDROID
extern int g_NetInfo;
extern WifiInfo g_wifi_info;
extern SIMInfo g_sim_info;
extern APNInfo g_apn_info;
extern Mutex g_net_mutex;
#endif

}
}

#endif /* platform_comm_h */