如何使用Erlang的发送推送通知? [英] How to send a push notification using Erlang?
问题描述
我尝试推送通知发送给使用二郎的APN。
这是code,我想出了迄今:
I'm trying to send a push notification to APNs using Erlang. This is the code I came up with so far:
-module(apnstest2).
-export([connect/0]).
connect() ->
application:start(ssl),
ssl:seed("someseedstring"),
Address = "gateway.sandbox.push.apple.com",
Port = 2195,
Cert = "/path/to/Certificate.pem",
Key = "/path/to/Key.unenc.pem",
Options = [{certfile, Cert}, {keyfile, Key}, {mode, binary}],
Timeout = 1000,
{ok, Socket} = ssl:connect(Address, Port, Options, Timeout),
Token = "195ec05a962b24954693c0b638b6216579a0d1d74b3e1c6f534c6f8fd0d50d03",
Payload = "{\"aps\":{\"alert\":\"Just testing.\",\"sound\":\"chime\", \"badge\":10}}",
TokenLength = length(Token),
PayloadLength = length(Payload),
Packet = [<<0:8, TokenLength, Token, PayloadLength, Payload>>],
ssl:send(Socket, list_to_binary(Packet)),
ssl:close(Socket).
在code没有利用Erlang的并发性,但仅仅是一个雏形。我只是想测试一下,如果我能以最简单的方式发送推。
The code doesn't take advantage of Erlang's concurrency but is just a prototype. I only want to test if I can send the push in the most simple way.
我认为这个问题是在数据包被发送到的APN。
这是一个推送通知的二进制格式:
I think the problem is in the packet being sent to the APNs. This is the binary format of a push notification:
我应该如何创建二郎这样的包?
可能有人请看看我的code,告诉我问题出在哪里?
此外,我用Erlang的SSL应用程序来创建连接并发送数据,我不知道这是否是问题或数据包。
谢谢!
How should I create such a packet in Erlang?
Could someone please take a look at my code and tell me where the problem is?
Also I used Erlang's SSL application to create the connection and send the data and I don't know if this is the problem or the packet.
Thanks!
推荐答案
首先,有没有必要创建一个单一的二进制文件的列表,然后调用 list_to_binary / 1
就可以了。你可以只发送二进制文件本身。
To start with, there is no need for creating a list of a single binary and then calling list_to_binary/1
on it. You can just send the binary itself.
另外,确保字段长度和值根据该协议是适当的:
Also, make sure the field lengths and values are appropriate according to the protocol:
TokenLength = 32 = length(Token),
Packet = <<0:8, TokenLength:16/big, Token, PayloadLength:16/big, Payload>>,
ssl:send(Socket, Packet),
现在,我们已经得到了这一步,我们将看到的长度(令牌)实际上是64,不是32:
你忘了十六进制字符串转换为令牌为二进制,所以你要发送64字节十六进制字符串,而不是32个二进制字节。
Now that we have gotten this far, we will see that length(Token) is in fact 64, not 32: You forgot to convert the hex string for Token to a binary, so you are sending a 64 byte hex character string instead of 32 binary bytes.
所以...使有效载荷从一开始的二进制,并使令牌的数字常量,你可以做类似如下:
So... making Payload a binary from the start, and making Token a numeric constant, you can do something like the following:
Payload = <<"{\"aps\":{\"alert\":\"Just testing.\",\"sound\":\"chime\", \"badge\":10}}">>,
PayloadLength = size(Payload),
Packet = <<0:8, 32:16/big,
16#195ec05a962b24954693c0b638b6216579a0d1d74b3e1c6f534c6f8fd0d50d03:256/big,
PayloadLength:16/big, Payload/binary>>,
ssl:send(Socket, Packet),
这篇关于如何使用Erlang的发送推送通知?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!