Push-сообщение в Android - PullRequest
       21

Push-сообщение в Android

0 голосов
/ 09 ноября 2010

Мне удалось получить токен авторизации от Google, и теперь я пытаюсь отправить сообщение на мое устройство Android.

//code to fetch auth Token
<?php

$url = "https://www.google.com/accounts/ClientLogin";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
echo $url;
$post_fields = "accountType=" . urlencode('HOSTED_OR_GOOGLE'). "&Email=" . urlencode('mail@gmail.com'). "&Passwd=" . urlencode('xxx'). "&service=" . urlencode('ac2dm');
echo $post_fields; echo "<br/>";
$data = array('accountType' => 'GOOGLE', 'Email' => 'mail@gmail.com', 'Passwd' => 'xxx', 'source'=>'PHI-cUrl-Example', 'service'=>'ac2dm');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLINFO_HEADER_OUT, true); // for debugging the request
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT)); //for debugging the request
$response = curl_exec($ch);
var_dump($response);
curl_close($ch);
echo "<br/><br/>";
?>

Я получаю AuthToken от Google.Теперь мне нужно отправить свое сообщение на устройство Android. Это код php для этого ...

(second.php)

<?php
$wannasay = array (
"registration_id" => "APA91bH9SYn9Iru4Ddr87neqEh3OWaUhT8k_UUpxUZj7ORMLwFCiZ3qKm1yKWGFro47DNsk6CynvureInynXFqs1zEZ9xUwUlw",
"collapse_key" => "abcdef"
);
$dataels = array();
foreach (array_keys($wannasay) as $thiskey) {
array_push($dataels,urlencode($thiskey) ."=".
urlencode($wannasay[$thiskey]));
}
$data = implode("&",$dataels);

// work out the request
//auth token below is the one i got from above script


$authToken="DQAAAK0AAAABGiOYfUQfp_ZiDyZqErKOacSmgZCFvnogDUaVzSX9a6qh079XJblM63Z12JwOdRv8gDNCqLj80olSbFeqZFJpqXQDvmmW_PcyHUZPyDZIpZ0G0FRkV_sgqy06YM7r5zUnAggHA8hlmVM3AQBYNGcP_A2Ddq_pjm6cqaQBQH_dFaJgK6UfxNaNDK2jl78VWSU-ZMb-Q2zU1xMLbwYcWXuYIRqRxSlEN68N2M2u4Ub_AA";
$header =
"POST http://android.apis.google.com/c2dm/send HTTP/1.1\n" .
"Host: yourhost\n" .
"Content-Type: application/x-www-form-urlencoded\n" .
"Authorization: GoogleLogin auth=" . $authToken . "\n" .
"Content-Length: " . strlen($data) . "\n\n" .
$data . "\n";


// establish the connection and send the request

$s = socket_create(AF_INET, SOCK_DGRAM, 0);//AF_INET ipv4 internet based protocol
$z = socket_connect($s, gethostbyname("yourhost"), 80);
socket_write ($s, $header, strlen($header));

$header = "";

while (true) {   
if (strlen($c = socket_read($s, 1))) {  //this is line 20
$header .= $c; 
}
}

socket_close($s);
print nl2br(htmlspecialchars($header));

?> 

Я запускаю оба кода с localhost.Я думаю, у меня проблема с сокетом.Либо страница продолжает загружаться вечно, либо я выдаю мне фатальную ошибку: максимальное время превысило 60 секунд в строке 20 или около того.

Когда я пробую код на сервере, я получаю ошибку как

Warning: socket_read() [function.socket-read]: unable to read from socket [111]: Connection refused in second.php on line 20

Я не знаю, что здесь не так.Может кто-нибудь сказать мне, почему я получаю эту ошибку.Я понятия не имею, как работает сокет на Android.

1 Ответ

0 голосов
/ 09 ноября 2010

Вы сказали, что запускаете его на локальном хосте (я полагаю, вы имеете в виду на компьютере, а не на телефоне)

Если вы используете эмулятор, у него фактически есть собственный IP, поэтому localhost указывает на ваш эмулятор, а не на ваш компьютер. Вам придется использовать IP-адрес вашего компьютера (обычно 192.168.x.x, если вы находитесь за маршрутизатором).

Если вы работаете по телефону, вам также придется использовать IP-адрес вашего компьютера, но вам придется использовать внешний IP-адрес, а не тот, который находится за маршрутизатором (телефон не находится в вашей локальной сети) .

При этом я заметил, что у вас есть эта строка (без цифр, но в конце)

socket_connect($s, gethostbyname("yourhost"), 80);

Полагаю, под "yourhost" вы имели в виду "localhost", и под этим вы имели в виду IP-адрес вашего компьютера:)

На самом деле, я заметил, что вы "yourhost" использовали несколько раз, было ли это просто ошибкой при копировании со страницы учебника или документации?

...