Как отправить использованию уведомления о нажатии Erlang?

Используя макро-версии функций как "макс." или "isupper". Макросы оценивают их аргументы дважды, таким образом, Вы получите неожиданные побочные эффекты, когда Вы будете звонить макс. (++ я, j), или isupper (*p ++)

, Вышеупомянутое для стандарта C. В C++ в основном исчезли эти проблемы. Макс. функция является теперь шаблонной функцией.

20
задан 18 November 2009 в 16:17
поделиться

2 ответа

Для начала нет необходимости создавать список из одного двоичного файла и затем вызывать для него 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),

Спасибо Кристиану за указание на ряд ошибок в предыдущих версиях этого ответа.

22
ответ дан 30 November 2019 в 00:55
поделиться

Я вижу две ошибки:

  • Токен следует передавать в двоичном формате, а не в шестнадцатеричном формате ascii.
  • Вы не можете использовать двоичный синтаксис для преобразования списков в двоичные файлы.

Для синтаксического анализа шестнадцатеричного числа до целого и затем до двоичного используйте что-то вроде этого:

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>>,
3
ответ дан 30 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: