public static async Task <LocationFromIPAddress> GetLocationFromIP() { HttpClient httpClient = new HttpClient(); try { HttpResponseMessage response = await httpClient.GetAsync("https://freegeoip.app/json/").ConfigureAwait(false); string responseBodyStr = response.Content.ReadAsStringAsync().Result; LocationFromIPAddress location = Messaging <LocationFromIPAddress> .Deserialize(responseBodyStr); return(location); } catch (Exception) { return(new LocationFromIPAddress() { latitude = 37.3382f, longitude = 121.8863f }); } }
/// <summary> /// Wrapper for FindCloudlet. Will find the "nearest" cloudlet hosting the application backend /// To use Performance mode. Call UseFindCloudletPerformanceMode(true) /// </summary> /// <returns>FindCloudletReply Task</returns> public async Task <bool> FindCloudlet(string dmeHost = null, uint dmePort = 0) { latestFindCloudletReply = null; if (!latestRegisterStatus) { throw new FindCloudletException("Last RegisterClient was unsuccessful. Call RegisterClient again before FindCloudlet"); } try { if (fallbackLocation.Longitude == 0 && fallbackLocation.Latitude == 0) { LocationFromIPAddress locationFromIP = await GetLocationFromIP(); fallbackLocation = new Location(locationFromIP.longitude, locationFromIP.latitude); } await UpdateLocationAndCarrierInfo(); } catch (CarrierInfoException cie) { Debug.LogError("MobiledgeX: FindCloudlet CarrierInfoException: " + cie.Message); throw new FindCloudletException(cie.Message); } FindCloudletReply reply = null; try { if (location == null) { throw new FindCloudletException("Location must not be null!"); } Logger.Log("FindCloudlet Location: " + location.longitude + ", lat: " + location.latitude); FindCloudletRequest req = matchingEngine.CreateFindCloudletRequest(location, ""); if (dmeHost != null && dmePort != 0) { Logger.Log("Doing FindCloudlet with DME: " + dmeHost + ", p: " + dmePort + " with req: " + req); reply = await matchingEngine.FindCloudlet(dmeHost, dmePort, req, mode); } else { if (!useSelectedRegionInProduction) { #if UNITY_EDITOR Logger.Log("Doing FindCloudlet with DME: " + region + ", p: " + MatchingEngine.defaultDmeRestPort + " with req: " + req); Logger.LogWarning("Region Selection will work only in UnityEditor not on Mobile Devices"); reply = await matchingEngine.FindCloudlet(region, MatchingEngine.defaultDmeRestPort, req); #else Logger.Log("Doing FindCloudlet, with req: " + req); reply = await matchingEngine.FindCloudlet(req, mode); #endif } else { Logger.Log("Doing FindCloudlet with DME: " + region + ", p: " + MatchingEngine.defaultDmeRestPort + " with req: " + req); reply = await matchingEngine.FindCloudlet(region, MatchingEngine.defaultDmeRestPort, req, mode); } } } catch (HttpException httpe) { throw new FindCloudletException("FindCloudlet Exception: " + httpe.Message + ", HTTP StatusCode: " + httpe.HttpStatusCode + ", API ErrorCode: " + httpe.ErrorCode + "\nStack: " + httpe.StackTrace); } catch (Exception e) { throw new FindCloudletException("FindCloudletException Type: " + e.GetType() + ", Message: " + e.Message + ", InnerException : " + e.InnerException + "\nStack: " + e.StackTrace); } finally { if (reply == null) { throw new FindCloudletException("FindCloudletReply returned null. Make Sure you created App Instances for your Application and they are deployed in the correct region."); } if (reply.status != FindCloudletReply.FindStatus.FIND_FOUND) { throw new FindCloudletException("Unable to findCloudlet. Status is " + reply.status); } } Logger.Log("FindCloudlet with DME result: " + reply.status); latestFindCloudletReply = reply; latestAppPortList = reply.ports; return(reply.status == FindCloudletReply.FindStatus.FIND_FOUND); }