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

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

簡單的介紹下原理:node

  百度雲推送支持IOS和Android的雲推送。Android支持的還不錯,可是IOS通常很難調通。百度雲對於IOS的推送來講,他只是作了一箇中間的代理,爲用戶提供接口,優勢是使用百度雲推送,Android和IOS能夠統一管理;缺點是:調通不容易,用戶的IOS證書須要上傳驗證,會直接暴露給第三方,而且IOS的apns支持用戶本身構建provider服務器,與apns直接通訊。c++

  我的建議:Android使用百度雲推送,IOS的使用本身構建的provider與IOS的apns直接通訊。與IOS的apns直接通訊有許多實現,Java、PHP、object-c、c++,在個人博客中有一篇是使用erlang實現的,有興趣的能夠看看。c#

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

  鑑於須要,我的使用erlang實現的服務端推送功能。瀏覽器

  步驟:一、首先將上面你創建的工程中百度雲服務器爲你生產的例子demo安裝到手機上,而後以本身註冊的開發者帳號登錄,裏面有一個userid和channelId,channelId記錄下來,UserId和開發者上的對應一下,而後決定使用哪個,若是同樣,那沒問題,不同的話通常採用註冊者頁面中的那個。也能夠經過Android服務端獲取的數據分析出userid。服務器

  二、獲取token也就是channelid,具體設備的id,app

  三、獲取用戶的apikeyide

  四、獲取用戶的secretekeypost

  給用戶發送消息分幾種狀況分別以下:給某個用戶的全部設備發送信息此時須要用戶的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.

相關文章
相關標籤/搜索