Используя макро-версии функций как "макс." или "isupper". Макросы оценивают их аргументы дважды, таким образом, Вы получите неожиданные побочные эффекты, когда Вы будете звонить макс. (++ я, j), или isupper (*p ++)
, Вышеупомянутое для стандарта C. В C++ в основном исчезли эти проблемы. Макс. функция является теперь шаблонной функцией.
Для начала нет необходимости создавать список из одного двоичного файла и затем вызывать для него list_to_binary / 1
. Вы можете просто отправить сам двоичный файл.
Также убедитесь, что длина и значения полей соответствуют протоколу:
TokenLength = 32 = length(Token),
Packet = <<0:8, TokenLength:16/big, Token, PayloadLength:16/big, Payload>>,
ssl:send(Socket, Packet),
Теперь, когда мы зашли так далеко, мы увидим, что длина (токен) на самом деле равна 64 , а не 32: Вы забыли преобразовать шестнадцатеричную строку для токена в двоичный, поэтому вы отправляете 64-байтовую шестнадцатеричную строку символов вместо 32 двоичных байтов.
Итак ... сделав Payload двоичным кодом с самого начала, а токен - числовой константой , вы можете сделать что-то вроде следующего:
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),
Спасибо Кристиану за указание на ряд ошибок в предыдущих версиях этого ответа.
Я вижу две ошибки:
Для синтаксического анализа шестнадцатеричного числа до целого и затем до двоичного используйте что-то вроде этого:
Token = "dead",
TokenNum = erlang:list_to_integer(Token, 16),
TokenBin = <<TokenNum:32/integer-unit:8>>,
Создайте пакет протокола примерно так:
TokenBin = ...,
Payload = <<"Payload">>,
PayloadSize = byte_size(Payload),
Packet = <<0:8, 32:16, TokenBin/binary, PayloadSize:16, Payload/binary>>,