2017-07-21 2 views
0

Cela fait partie du code que j'utilise pour envoyer des notifications.Envoi d'appels via erlang

Options = case Password of 
     undefined -> 
      [{certfile, Cert}, {keyfile, Keyfile}, {mode, binary}]; 
     _ -> 
     [{certfile, Cert}, {keyfile, Keyfile}, {password, Password}, {mode, binary}] 
    end, 
    case ssl:connect(Address, Port, Options, ?Timeout) of 
     {ok, Socket} -> 
      PayloadBin = list_to_binary(Payload), 
      PayloadLength = size(PayloadBin), 
      TokenNum = erlang:binary_to_integer(Token, 16), 
      TokenBin = <<TokenNum:32/integer-unit:8>>, 
      Packet = << 
       0:8, 
       32:16/big, 
       TokenBin/binary, 
       PayloadLength:16/big, 
       PayloadBin/binary 
      >>, 
      ssl:send(Socket, Packet), 
      ssl:close(Socket), 
      ?DEBUG("mod_apns: Successfully sent payload to the APNS server", []), 
      ok; 
     {error, Reason} -> 
      ?ERROR_MSG("mod_apns: Unable to connect:~p to the APNS server ~p: ~p", [Options, Address, Reason]), 
      Reason 
    end 

Mais je reçois cette erreur:

Unable to connect:[{certfile,<<"/etc/certificates/myCer.pem">>},{keyfile,<<"/etc/certificates/myKey.pem">>},{mode,binary}] to the APNS server <<"gateway.push.apple.com">>: {options,{socket_options,[{mode,binary}]}} 

C'est un module ejabberd et même code fonctionne dans ejabberd 17.04, mais pas dans 17,06.
Les certificats et les clés sont valides et, comme je l'ai dit, je peux obtenir des apns en utilisant le même module erlang avec une ancienne version d'ejabberd.
Je suis nouveau à erlang et je ne comprends pas le message d'erreur ({options,{socket_options,[{mode,binary}]}})

Toute aide est appréciée.

+0

J'ai ajouté plus de code .. Quand je change {mode, binaire} pour {mode, mode :: binaire | liste} J'obtiens une erreur de syntaxe – Besat

+0

Eventuellement: '{mode, Mode :: binary | list} => Le paquet reçu est livré comme défini par Mode.' Donc ... le paquet reçu est un type binaire erlang ou une liste. – 7stud

+0

L'option serait spécifiée comme '{mode, binaire}' ou '{mode, liste}'. Dans la _specification_ que j'ai posté, le nom de la variable d'espace réservé est Mode, et il peut avoir les valeurs 'binary | liste » – 7stud

Répondre

0

Le problème était que j'envoyais binaire au lieu de la liste:

mod_opt_type(address) -> fun binary_to_list/1; 
mod_opt_type(port) -> fun(I) when is_integer(I) -> I end; 
mod_opt_type(certfile) -> fun binary_to_list/1; 
mod_opt_type(keyfile) -> fun binary_to_list/1;