unity tutorial c# android networking unity3d

c# - unity3d networking tutorial



Los datos de incrustación de usuario+contraseña de UnityWebRequest para la autenticación básica HTTP no funcionan en Android (1)

Incrustar nombre de usuario y contraseña ( http://username:[email protected] ) en una url ya no se admite en algunas aplicaciones y sistemas operativos por razones de seguridad. Esto se debe a que esta no es la forma estándar de realizar la autenticación HTTP. Es muy probable que Unity o Android no hayan implementado esto de su lado.

Probé esto en el navegador Android integrado con http://Administrator:ZZh7y6dn@*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/ y no funcionó. Entonces, supongo que este problema es de Android.

Probé nuevamente sin nombre de usuario y contraseña http://*IP Address**:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/ luego apareció la ventana de inicio de sesión. Cuando ingresé el nombre de usuario y la contraseña, funcionó.

Todavía puede usar UnityWebRequest para resolver este problema al proporcionar el encabezado AUTHORIZATION a UnityWebRequest con la función SetRequestHeader . Esto solo funcionará si el tipo de autorización es Basic lugar de Digest . En su caso, es HTTP Basic .

Para solución general:

string authenticate(string username, string password) { string auth = username + ":" + password; auth = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(auth)); auth = "Basic " + auth; return auth; } IEnumerator makeRequest() { string authorization = authenticate("YourUserName", "YourPassWord"); string url = "yourUrlWithoutUsernameAndPassword"; UnityWebRequest www = UnityWebRequest.Get(url); www.SetRequestHeader("AUTHORIZATION", authorization); yield return www.Send(); ....... }

Para la solución en su pregunta:

public GameObject TempText; static string TempValue; void Start() { StartCoroutine(GetText()); } string authenticate(string username, string password) { string auth = username + ":" + password; auth = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(auth)); auth = "Basic " + auth; return auth; } IEnumerator GetText() { WaitForSeconds waitTime = new WaitForSeconds(2f); //Do the memory allocation once string authorization = authenticate("Administrator", "ZZh7y6dn"); while (true) { yield return waitTime; string url = "http://*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/"; UnityWebRequest www = UnityWebRequest.Get(url); www.SetRequestHeader("AUTHORIZATION", authorization); yield return www.Send(); if (www.isError) { Debug.Log("Error while Receiving: " + www.error); } else { string result = www.downloadHandler.text; Char delimiter = ''>''; String[] substrings = result.Split(delimiter); foreach (var substring in substrings) { if (substring.Contains("</TD")) { String[] Substrings1 = substring.Split(''<''); Debug.Log(Substrings1[0].ToString() + "Temp Value"); TempValue = Substrings1[0].ToString(); TempText.GetComponent<TextMesh>().text = TempValue + "''C"; } } } } }

El siguiente código se utiliza para obtener el valor de temperatura del servidor Thingworx que está alojado en uno de nuestros propios sistemas. Esto funciona perfectamente bien en la unidad . Pero no en general , una vez que se genera apk, no obtendrá ningún dato del servidor y se establecerá la conexión. Pero, simplemente no obtendrá los datos y los colocará en la malla de texto.

Estoy usando unity 5.4.1 32bit. Compruebe en Android: 5.0.2 y 6.

using UnityEngine; using System.Collections; using UnityEngine.Networking; using System.Text.RegularExpressions; using System; using UnityEngine.UI; public class GETTempValue : MonoBehaviour { public GameObject TempText; static string TempValue; void Start() { StartCoroutine(GetText()); } IEnumerator GetText() { Debug.Log("Inside Coroutine"); while (true) { yield return new WaitForSeconds(5f); string url = "http://Administrator:ZZh7y6dn@*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/"; Debug.Log("Before UnityWebRequest"); UnityWebRequest www = UnityWebRequest.Get (url); yield return www.Send(); Debug.Log("After UnityWebRequest"); if (www.isError) { Debug.Log ("Error while Receiving: "+www.error); } else { Debug.Log("Success. Received: "+www.downloadHandler.text); string result = www.downloadHandler.text; Char delimiter = ''>''; String[] substrings = result.Split(delimiter); foreach (var substring in substrings) { if (substring.Contains ("</TD")) { String[] Substrings1 = substring.Split (''<''); Debug.Log (Substrings1[0].ToString()+"Temp Value"); TempValue = Substrings1 [0].ToString (); TempText.GetComponent<TextMesh> ().text = TempValue+"''C"; } } } } } }

este es el permiso manifiesto de Android

uses-permission android:name="android.permission.INTERNET" uses-permission android:name="android.permission.CAMERA" uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"