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"