1

J'essaye de créer un programme python3 très simple en utilisant sleekxmpp 1.3.1 qui pourrait connecter le serveur Firebase Cloud Messaging. J'ai un étrange problème Error reading from XML stream avec le code suivant. Comment puis-je le réparer?Erreur lors de la tentative de connexion du serveur FCM CCS avec sleekxmpp

Nous pouvons voir à partir de la sortie de la console que STARTTLS est activé. Je n'ai trouvé aucun autre moyen que de le désactiver from the sleekxmpp source code, mais cela n'a pas résolu le problème.

Le premier message envoyé semble valide selon le google documentation, toujours la "lecture d'erreur du flux XML" apparaît.

Le code python

FCM_SERVER_URL = "fcm-xmpp.googleapis.com" 
FCM_SERVER_PORT = 5236 
FCM_SECRET = "XXXXXXX" 
FCM_JID = "[email protected]" 

import logging, socket 
from sleekxmpp.clientxmpp import ClientXMPP 

class ClientComponent(ClientXMPP): 
    def __init__(self): 
     ClientXMPP.__init__(self, FCM_JID, FCM_SECRET) 
     self.auto_reconnect = False 

     server_ip = socket.gethostbyname(FCM_SERVER_URL) 
     if self.connect((server_ip, FCM_SERVER_PORT), use_tls = True, reattempt = False): 
      self.process(block=True) 

logging.basicConfig(level=logging.DEBUG, format='%(levelname)7s %(module)12s:%(lineno)-4s %(message)s') 
ClientComponent() 

La sortie de la console

DEBUG   base:328 Loaded Plugin: RFC 6120: Stream Feature: STARTTLS 
    DEBUG   base:328 Loaded Plugin: RFC 6120: Stream Feature: Resource Binding 
    DEBUG   base:328 Loaded Plugin: RFC 3920: Stream Feature: Start Session 
    DEBUG   base:328 Loaded Plugin: RFC 6121: Stream Feature: Roster Versioning 
    DEBUG   base:328 Loaded Plugin: RFC 6121: Stream Feature: Subscription Pre-Approval 
    DEBUG   base:328 Loaded Plugin: RFC 6120: Stream Feature: SASL 
    DEBUG xmlstream:546 Connecting to 66.102.1.188:5236 
    DEBUG xmlstream:1162 Event triggered: connected 
    DEBUG statemachine:118 ==== TRANSITION disconnected -> connected 
    DEBUG xmlstream:1444 Starting HANDLER THREAD 
    DEBUG xmlstream:1662 Loading event runner 
    DEBUG xmlstream:1309 SEND (IMMED): <stream:stream to="gcm.googleapis.com" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" xml:lang='en' version="1.0"> 
    ERROR xmlstream:1492 Error reading from XML stream. 
    DEBUG xmlstream:1162 Event triggered: session_end 
    DEBUG xmlstream:1309 SEND (IMMED): </stream:stream> 
    DEBUG xmlstream:1162 Event triggered: socket_error 
WARNING xmlstream:1342 Failed to send b'</stream:stream>' 
    DEBUG xmlstream:1162 Event triggered: session_end 
    DEBUG xmlstream:1397 Waiting for 3 threads to exit. 
    DEBUG xmlstream:1375 Stopped event runner thread. 2 threads remain. 
    DEBUG xmlstream:1375 Stopped send thread. 1 threads remain. 
    DEBUG scheduler:200 Quitting Scheduler thread 
    DEBUG xmlstream:1375 Stopped scheduler thread. 0 threads remain. 
    DEBUG xmlstream:1162 Event triggered: socket_error 
    DEBUG xmlstream:1162 Event triggered: disconnected 
    DEBUG statemachine:118 ==== TRANSITION connected -> disconnected 
    INFO xmlstream:720 Waiting for </stream:stream> from server 
    DEBUG xmlstream:1162 Event triggered: socket_error 
    DEBUG xmlstream:1162 Event triggered: disconnected 
    DEBUG statemachine:118 ==== TRANSITION disconnected -> disconnected 
+0

S'il vous plaît vérifier https://github.com/winster/xmppgcm – Winster

Répondre

2

Juste pour être complet, ce serait un exemple d'implémentation de travail:

from sleekxmpp.clientxmpp import ClientXMPP 
import logging 
import socket 
import json 
import uuid 

logging.basicConfig(level=logging.DEBUG, format="%(levelname)7s %(module)12s:%(lineno)-4s %(message)s") 

FCM_SERVER_URL = "fcm-xmpp.googleapis.com" 
FCM_SERVER_PORT = 5236 
FCM_SERVER_KEY = "XXXXXXXXXXX" # <- Your Server Key 
FCM_SENDER_ID = "XXXXXXXXXXX" # <- Your Sender ID 
FCM_JID = FCM_SENDER_ID + "@gcm.googleapis.com" 
FCM_SERVER_IP = socket.gethostbyname(FCM_SERVER_URL) 
TOPIC = "/topics/info" 

body = { 
    "to": TOPIC, 
    "message_id": uuid.uuid4().hex, 
    "data": { "msg": "This is the content"} 
} 
message = "<message><gcm xmlns='google:mobile:data'>"+json.dumps(body)+"</gcm></message>" 

class Client(ClientXMPP): 
    def __init__(self): 
     ClientXMPP.__init__(self, FCM_JID, FCM_SERVER_KEY, sasl_mech="PLAIN") 
     self.add_event_handler("session_start", self.start) 
     self.auto_reconnect = False 
     self.connect((FCM_SERVER_IP, FCM_SERVER_PORT), use_tls = True, use_ssl = True, reattempt = False) 
     self.process(block=True) 
    def start(self, event): 
     self.send_raw(message) 
     self.disconnect(wait=True) 


Client() 
+0

Vous avez juste besoin de régler use_ssl = True – azmeuk

0

J'ai trouvé une réponse on the google list. En remplaçant "use_tls = True" par "use_ssl = True", cela fonctionne mieux.