簡體   English   中英

無法通過 websockets 發布到 aws mqtt 代理

[英]Cant publish to aws mqtt broker over websockets

我正在關注aws api通過 websockets 連接到 mqtt。 下面是我的代碼:

credentials_provider = AwsCredentialsProvider.new_static(
            access_key_id = auth_response_dictionary['user']['accessKeyId'],
            secret_access_key = auth_response_dictionary['user']['secretKey'],
            session_token = auth_response_dictionary['user']['sessionToken']
            )
       
    
    event_loop_group = io.EventLoopGroup(1)
    host_resolver = io.DefaultHostResolver(event_loop_group)
    client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver)    
    
    mqtt_connection = mqtt_connection_builder.websockets_with_default_aws_signing(
            endpoint=auth_response_dictionary['user']['iotEndpoint'],
            region=auth_response_dictionary['user']['region'],
            credentials_provider=credentials_provider,
            client_bootstrap=client_bootstrap,
            client_id=clientId
            )

    print("Connecting to aws")
    # Make the connect() call
    connect_future = mqtt_connection.connect()
    # Future.result() waits until a result is available
    print('connect_future ' + str(connect_future))
    x= connect_future.result()
    print('connect_future ' + str(x))
    print("Connected!")
    
    future, packet_id = mqtt_connection.publish(topic=TOPIC, payload=json.dumps(message), qos=mqtt.QoS.AT_LEAST_ONCE)
    future, packet_id = mqtt_connection.publish(topic='test/po', payload=json.dumps(message), qos=mqtt.QoS.AT_LEAST_ONCE)
    print('future ' + str(future))
    print('future ' + str(packet_id))
    print('Publish End')

我在連接和發布時沒有收到任何錯誤,但是當我在“測試”部分訂閱該主題時,我沒有在我的 aws mqtt 代理上收到任何消息。 我認為我在credentials_providerclient_bootstrap或兩者中配置了錯誤但不知道是什么。

這是打印的日志

Connecting to aws
connect_future<Future at 0x7f605f942af0 state=pending>
connect_future{'session_present': False}
Connected!
future <Future at 0x7f605f8e54f0 state=pending>
future 3
Publish End

有人可以幫忙嗎?

mqtt_connection.subscribe(...)用於訂閱 AWS IoT 消息的 MQTT 主題,我在您的代碼中看不到它。

mqtt_connection.subscribe的調用方式如下,接收主題名稱、服務質量級別和回調

received_count = 0
received_all_event = threading.Event()
...
topic='test/po'
print("Subscribing to topic '{}'...".format(topic))
subscribe_future, packet_id = mqtt_connection.subscribe(
        topic=topic,
        qos=mqtt.QoS.AT_LEAST_ONCE,
        callback=on_message_received)
subscribe_result = subscribe_future.result()
print("Subscribed with {}".format(str(subscribe_result['qos'])))

on_message_received看起來像這樣:

def on_message_received(topic, payload, dup, qos, retain, **kwargs):
    print("Received message from topic '{}': {}".format(topic, payload))
    global received_count
    received_count += 1
    # Number of messages to wait for
    if received_count = 10:
        received_all_event.set()

然后在您的主要方法中,您可以等到收到 10 條消息:

# Wait for all messages to be received.
# This waits forever if count was set to 0.
if not received_all_event.is_set():
    print("Waiting for all messages to be received...")

received_all_event.wait()
print("{} message(s) received.".format(received_count))

AWS 提供了非常好的示例代碼,我建議您檢查一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM