erlang-百度雲推送Android服務端功能實現-erlang

來源:互聯網
上載者:User

標籤:android   des   style   http   java   color   

百度雲推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/push

簡單的介紹下原理:

  百度雲推送支援IOS和Android的雲推送。Android支援的還不錯,但是IOS一般很難調通。百度雲對於IOS的推送來說,他只是做了一個中間的代理,為使用者提供介面,優點是使用百度雲推送,Android和IOS可以統一管理;缺點是:調通不容易,使用者的IOS認證需要上傳驗證,會直接暴露給第三方,並且IOS的apns支援使用者自己構建provider伺服器,與apns直接通訊。

  個人建議:Android使用百度雲推送,IOS的使用自己構建的provider與IOS的apns直接通訊。與IOS的apns直接通訊有許多實現,Java、PHP、object-c、c++,在我的部落格中有一篇是使用erlang實現的,有興趣的可以看看。

  Android實現推送功能百度雲有自己的demo,大家可以根據官網(http://developer.baidu.com/wiki/index.php?title=docs/cplat/push)的步驟,首先註冊一個百度開發人員帳號,然後建立自己的一個應用,根據例子百度雲端服務器會自己生產一個用戶端的demo,可以運行在Android的手機上。然後在頁面進行推送實驗。當然也可以下載百度雲推送伺服器,然後通過運行使用伺服器推送,官網中有php、Java、Python、node.js、c#實現。

  鑒於需要,個人使用erlang實現的服務端推送功能。

  步驟:1、首先將上面你建立的工程中百度雲端服務器為你生產的例子demo安裝到手機上,然後以自己註冊的開發人員帳號登陸,裡面有一個userid和channelId,channelId記錄下來,UserId和開發人員上的對應一下,然後決定使用哪一個,如果一樣,那沒問題,不一樣的話一般採用註冊者頁面中的那個。也可以通過Android服務端擷取的資料分析出userid。

  2、擷取token也就是channelid,具體裝置的id,

  3、擷取使用者的apikey

  4、擷取使用者的secretekey

  給使用者發送訊息分幾種情況分別如下:給某個使用者的所有裝置發送資訊此時需要使用者的userid;給使用者的某個裝置發送資訊此時需要使用者的userid和channelid;給某類使用者發送資訊,需要tag分類,也就是給該類的所有使用者發送資訊。

  簡單樣本,給使用者某一裝置發送資訊

  start() ->

    inets:start(),

    {Mega,Sec,_} = now(),

    ApiKey = "apikey=aghjklpoikmnbhjklpoijnbfd",%%使用者的APIkey
    %% 我的裝置
    % Channel_Id = "channel_id=1234567890098765432",%% 使用者的某一裝置channelid,也就是用戶端demo安裝在的手機的channelid
    %% 模擬器
    Channel_Id = "channel_id=3959774938927755088",%%用戶端模擬器的channelid
    Device_Type = "device_type=3",%%類型,細節在官方文檔中查看,1:瀏覽器裝置;2:PC裝置;3:Android裝置;4:IOS裝置;5:Windows phone裝置
    Message_Type = "message_type=1",%% 0:訊息;1:通知;預設為0
    TitleStr = " :kkkk,嘎嘎嘎阿 達航空 件阿 斯頓,,,,哈哈哈,erlang",
    DescriptionStr = "行不:行啊!",
    Messages0 = "messages={\"title\":\"",
    Messages1 = TitleStr,
    Messages2 = "\",\"description\":\"",
    Messages3 = DescriptionStr,
    Messages4 = "\",\"notification_builder_id\":0,"
    ++ "\"notification_basic_style\":2,\"open_type\":2,\"url\":\"\",\"user_confirm\":0,\"pkg_content\":\"\",\"custom_content\":\"\"}",
    Messages = Messages0 ++ Messages1 ++ Messages2 ++ Messages3 ++ Messages4,
    Method = "method=push_msg",
    Msg_keys= "msg_keys=erlang_keys",
    Push_Type = "push_type=1",
    Time = "timestamp="++ integer_to_list((Mega * 1000000 + Sec)),
    User_Id = "user_id=213123123",%%使用者的userid
    Url = "http://channel.api.duapp.com/rest/2.0/channel/channel",
    Http_Method = "POST",
    SecretKey = "123weqwe12wq12eqweqweqwe",%%使用者的secretekey
    Str0 = Http_Method ++ Url ++ ApiKey ++ Channel_Id ++ Device_Type ++ Message_Type ++ Messages0,
    Str1 = Messages2,
    Str2 = Messages4 ++ Method ++ Msg_keys ++ Push_Type ++ Time ++ User_Id ++ SecretKey,
    TitleBin = list_to_binary(TitleStr),
    TIntegerU = unicode:characters_to_list(TitleBin,utf8),
    TChanges = utf8(TIntegerU,[]),
    Title_Utf8 =
      lists:foldl(fun(Change,Acc) ->
        case Change of
          [Term] when Term >= $a, Term =< $z ->
            Acc ++ Change;
          [Term] when Term >= $A, Term =< $Z ->
            Acc ++ Change;
          [Term] when Term >= $0, Term =< $9 ->
            Acc ++ Change;
          [Term] when Term =:= $. ->
            Acc ++ Change;
          [Term] when Term =:= $_ ->
            Acc ++ Change;
          [Term] when Term =:= $- ->
            Acc ++ Change;
          [Term] when Term =:= 32 ->
            Acc ++ [43];
          _ ->
            Acc ++ list_to_hex_s(Change)
        end
      end,[],TChanges),
    DesBin = list_to_binary(DescriptionStr),
    DIntegerU = unicode:characters_to_list(DesBin,utf8),
    DChanges = utf8(DIntegerU,[]),
    Des_Utf8 =
      lists:foldl(fun(Change,Acc) ->
        case Change of
          [Term] when Term >= $a, Term =< $z ->
            Acc ++ Change;
          [Term] when Term >= $A, Term =< $Z ->
            Acc ++ Change;
          [Term] when Term >= $0, Term =< $9 ->
            Acc ++ Change;
          [Term] when Term =:= $. ->
            Acc ++ Change;
          [Term] when Term =:= $_ ->
            Acc ++ Change;
          [Term] when Term =:= $- ->
            Acc ++ Change;
          _ ->
            Acc ++ list_to_hex_s(Change)
        end
      end,[],DChanges),
    StrValue = escape_uri(Str0) ++ Title_Utf8 ++ escape_uri(Str1) ++ Des_Utf8 ++ escape_uri(Str2),
    Md5Str = md5_hex(StrValue),
    Sign = "sign=" ++ Md5Str,
    PostInfo = ApiKey ++ "&" ++ Sign ++ "&" ++ User_Id ++ "&"
    ++ Channel_Id ++ "&" ++ Device_Type ++ "&" ++ Message_Type ++ "&" ++ Messages
    ++ "&" ++ Method ++ "&" ++ Msg_keys ++ "&" ++ Push_Type ++ "&" ++ Time,
    timer:sleep(30*1000),
    Result = httpc:request(post,{Url,[],"application/x-www-form-urlencoded",PostInfo},[],[]),
    case Result of
      {ok,{{"HTTP/1.1",200,"OK"},_,_}} ->
        nothing;
      _ ->
        io:format("Result:~p~n",[Result])
    end.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.