C2DM Third part app

Diskussion i 'Frågor, support och diskussion' startad av Gothian, 10 sept 2010.

  1. Gothian

    Gothian Baby Droid Medlem

    Blev medlem:
    22 apr 2010
    Inlägg:
    19
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej jag försöker att göra en sever app till min N1 i C# och har fastnat.
    jag har läst API dokumentet http://code.google.com/intl/sv-SE/android/c2dm/index.html men fattar fortfarande inte hur jag sa göra

    min kod ser ut ungefär såhär:

    // this is what we are sending
    string post_data="accountType=HOSTED_OR_GOOGLE&[email protected]&Passwd=mypass&service=ac2dm&source=sda-xcon-1.00";

    // this is where we will send it
    string uri = "https://android.apis.google.com/c2dm/send";

    // create a request
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.KeepAlive = false;
    //request.ProtocolVersion = HttpVersion.Version10;
    request.Method = "POST";

    // turn our request string into a byte stream
    byte[] postBytes = Encoding.ASCII.GetBytes(post_data);

    // this is important - make sure you specify type this way
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = postBytes.Length;
    Stream requestStream = request.GetRequestStream();

    // now send it
    requestStream.Write(postBytes, 0, postBytes.Length);
    requestStream.Close();

    // grab te response and print it out to the console along with the status code
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
    Console.WriteLine(response.StatusCode);

    det jag får är error 401 på raden "HttpWebResponse response = (HttpWebResponse)request.GetResponse();"
    är det nån som har pillat med c2dm och fått de att funka?
    skulle va tacksam för exempel hitta väldigt lite just med C#

    /Adam
     
  2. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 jun 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Hej,

    Om du är i stockholm så kommer jag ha en kort dragning om c2dm i nästa vecka på gtug. Kom gärna föbi om du kan så kan vi dela lite erfarenhet.

    Vad som hjälpte mig att komma igång var att göra det så enkelt som möjligt.

    Jag antar att du har signat upp för en invite redan. Dubbelkolla gärna att du fyllt i formuläret korrekt för jag lyckades med att skriva mitt username istället för email under role account. Det här gav mig också 401. Finns även rapporter om att c2dm inte fungerar med google apps konton om du har registrerat ett sådant som role account.

    Antar även att du har implementerat den kod som behövs till Android för att få tag på ett registration id. Tänk på att den email du registrerar med där måste vara samma som du satte för role account. Det har dock inget att göra med vilket konto man är inloggad med på telefonen.

    Efter det borde följande curl script ge dig möjlighet att skicka meddelanden.

    Det här ger tillbaka en auth token;

    Kod:
    curl https://www.google.com/accounts/ClientLogin \ 
    -d Email=ACCOUNT_EMAIL -d Passwd=PASSWORD \ 
    -d accountType=HOSTED_OR_GOOGLE \ 
    -d source=Google-cURL-Example \ 
    -d service=ac2dm 
    Responsen ser ut så här, ngt kortat;

    Kod:
    SID=DQAAA....
    LSID=DQAAA....
    Auth=DQAAAJsAA...
    Här tar du värdet från Auth och använder i curl scriptet nedan för att skicka ett meddelande under AUTH_TOKEN. REGISTRATION_ID ersätter du med det registration id du fick från androiden.

    Kod:
    curl https://android.apis.google.com/c2dm/send \ 
    -d "registration_id=REGISTRATION_ID&collapse_key=foo&data.key1=bar&delay_while_idle=1" \
    -H "Authorization: GoogleLogin auth=AUTH_TOKEN" 
     
  3. Gothian

    Gothian Baby Droid Medlem

    Blev medlem:
    22 apr 2010
    Inlägg:
    19
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej johan tack för ditt svar
    tyvärr så bor jag rätt långt bort från stockholm så jag kan tyvärr inte komma på gtug, fast jag skulle vilja.

    Jag har fortfarande inte kommit till rätta med mitt problem men jag har kommit en bra bit på vägen tack vare ditt inlägg.

    för det första så har jag inte registrerat mig på labs hemsida vilket kan ha bidragit till misslyckande loginförsök. Sen så har jag inte loggat in på ClientLogin korrekt.

    I daxläget så kan jag logga in på Google ClientLogin och få ut en Auth_token men när jag försöker att skicka så får jag fortfarande error 401.

    Du skriver alla dina meddelanden i curl script och jag använder enbart c# httprequest de lär säkert ara nån missmatch i min kod.

    "Authorization: GoogleLogin auth=AUTH_TOKEN" ska den ligga i headern och resten av meddelandet i Streamen?
     
  4. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 jun 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Hej,

    kul att kunna vara till lite hjälp. Det konto du sätter som "role account" måste vara ett Google-konto, apps-konton fungerar ej. Det finns en annan bugg i C2DM som jag sprang på som uppenbarar sig om du är inloggad med ditt role account på telefonen samtidigt som du skickar ett meddelande till den. Alltså man gör bäst i att sätta upp ett role account på helt nytt google konto. Det här har dock inget att göra med att du får 401 när du skickar.

    Jag har ingen färdig kod för att skicka med C#, min implementation på servern bygger mer eller mindre på den Java kod som backar chrome to phone. Borde dock vara hyfsat lätt att porta till C#. Gjorde curl scripten för att det skulle vara enklare att förstå mekaniken och se hur det hängde ihop. Docsen är ganska omfattande och nämner en hel del saker som inte är relevanta för att få det att snurra till en början.

    I curl scripten som jag postade så är det som följs efter -d POST parametrar. När du skapar din token till en början så är det viktigt att du sätter service till ac2dm för att indikera för vilken tjänst du begär en token för. App Engine har t.ex. ah om jag minns rätt.

    I det andra scriptet så är registration_id och collapse_key de enda parametrar som _måste_ sättas. Authorization är som du säger en header, den måste också sättas. Tänk även på att din token kan expira, du måste ha kod på din server för att kunna hantera detta. Det här indikeras av en headern "Update-Client-Auth" när du skickar ett meddelande.

    När du hämtar registraion id, så måste du begära denna med ditt role account, alltså samma konto som du begär en token för senare när du ska skicka.

    Om du fortfarande får 401 så har du antagligen inte hamnat på Googles vitlista ännu, svara på mailet du fick från Google och be dem dubbelkolla så att du är inlagd. Jag fick göra detta när jag skrev fel uppgifter från början. De är även hyfsat snabba på att svara på maillistan.

    Lycka till och det är extremt kul när det väl fungerar.
     
  5. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 jun 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Om någon annan är intresserad av C2DM så kommer här mina slides från min presentation på GTUG.

    <div style="width:425px" id="__ss_5227880"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/johannilsson/android-cloud-to-device-messaging-framework-at-gtug-stockholm" title="Android Cloud to Device Messaging Framework at GTUG Stockholm">Android Cloud to Device Messaging Framework at GTUG Stockholm</a></strong><object id="__sse5227880" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gtugc2dm-100918020704-phpapp02&stripped_title=android-cloud-to-device-messaging-framework-at-gtug-stockholm&userName=johannilsson" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5227880" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gtugc2dm-100918020704-phpapp02&stripped_title=android-cloud-to-device-messaging-framework-at-gtug-stockholm&userName=johannilsson" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/johannilsson">johannilsson</a>.</div></div>