Não é possível fazer o Google IoT Core funcionar

10

Alguém conseguiu o exemplo no início rápido para o trabalho? Eles fornecem código NodeJS para se conectar à ponte MQTT, mas para mim isso não funciona:

[root@centos7 google-iot-mqtt]# node cloudiot_mqtt_example_nodejs.js \
>     --project_id=curious-furnace-181313 \
>     --registry_id=my-registry \
>     --device_id=mimic1 \
>     --private_key_file=./rsa_private.pem \
>     --algorithm=RS256
Google Cloud IoT Core MQTT example.
connect { '0': {},
   '1': 
   { [Function: require]
 resolve: [Function: resolve],
 main: 
  Module {
    id: '.',
    exports: {},
    parent: null,
    filename: '/home/tmp/uwe/google-iot-mqtt/cloudiot_mqtt_example_nodejs.js',
    loaded: true,
    children: [Object],
    paths: [Object] },

(milhares de linhas a mais de rastreamento de pilha) e nenhuma atividade no painel do Google IoT Core, nem nenhuma mensagem em nenhuma assinatura pull.

Um mosquitto_pub retorna um erro estranho:

% ./mosquitto_pub -d -h mqtt.googleapis.com -p 8883 -i projects/curious-furnace-181313/locations/us-central1/registries/my-registry/devices/mimic1 -u unused --key ~/mimic/scripts/mqtt/google-iot/rsa_private.pem --cert ~/mimic/scripts/mqtt/google-iot/rsa_cert.pem -t /devices/mimic1/events -m hello --insecure
Client projects/curious-furnace-181313/locations/us-central1/registries/my-registry/devices/mimic1 sending CONNECT
Error: Unrecognised command 16

Error: A network protocol error occurred when communicating with the broker.
Suporte Gambit
fonte
Aparentemente, as mensagens geradas pelo aplicativo NODEJS demoraram um pouco para chegar às assinaturas. Mas o mosquitto_pub ainda não funciona.
Suporte Gambit
Adicionar o argumento -P ao mosquitto_pub com uma senha JWT, como a criada por seus aplicativos NODEJS, não ajuda.
Suporte Gambit

Respostas:

5

Este erro ocorre quando há uma incompatibilidade de protocolo na solicitação enviada à API do Google MQTT.

Você usa a porta 8883 que é para MQTT sobre SSL. No meu olho, o endereço que você chama é o endereço http normal (sem https nem http, o padrão cai para ser http), que usaria 1883, a porta do MQTT comum.

Se você pretende usar 8883 e SSL, faça a chamada para o endereço usando https. Se você não quis dizer MQTT sobre SSL, corrija a porta para 1883.

mico
fonte
Isso não ajuda. REQUEREM a porta 8883, que é o que o exemplo NODEJS usa.
Suporte Gambit
Bem, esse é o motivo mais óbvio para incompatibilidade de protocolo, mas também pode ocorrer erro nas mensagens mqtt, por exemplo, mensagem muito longa em comparação com o que está especificado. Difícil dizer o que gera problema no seu caso.
Mico
11
A resposta certa é olhar para o wireshark. Eu descobri que o mosquitto_pub não envia mensagem criptografada mesmo quando --tls-version é adicionada à linha de comando original, porque a mensagem de texto sem formatação está no PCAP.
Gambit Support