20 binary erlang push apple-push-notifications
我正在尝试使用Erlang向APN发送推送通知.这是我到目前为止提出的代码:
-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).
Run Code Online (Sandbox Code Playgroud)
代码没有利用Erlang的并发性,但只是一个原型.我只想测试是否可以以最简单的方式发送推送.
我认为问题在于发送到APN的数据包.这是推送通知的二进制格式:
我应该如何在Erlang中创建这样的数据包?有人可以看看我的代码并告诉我问题出在哪里?
我还使用Erlang的SSL应用程序来创建连接并发送数据,我不知道这是问题还是数据包.
谢谢!
ndi*_*dim 22
首先,不需要创建单个二进制文件的列表然后调用list_to_binary/1它.您只需发送二进制文件即可.
另外,根据协议确保字段长度和值是合适的:
TokenLength = 32 = length(Token),
Packet = <<0:8, TokenLength:16/big, Token, PayloadLength:16/big, Payload>>,
ssl:send(Socket, Packet),
Run Code Online (Sandbox Code Playgroud)
既然我们已经走到这一步,我们将看到长度(令牌)实际上是64而不是32:你忘了将令牌的十六进制字符串转换为二进制,所以你发送一个64字节的十六进制字符串而不是32二进制字节.
因此......从一开始就使Payload成为二进制文件,并使Token成为数字常量,您可以执行以下操作:
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),
Run Code Online (Sandbox Code Playgroud)
感谢Christian在这个答案的前修订中指出了一些错误.
| 归档时间: |
|
| 查看次数: |
4026 次 |
| 最近记录: |