Devo usar caracteres especiais nos tópicos do MQTT?

7

Eu usei o MQTT para conectar todas as minhas unidades ESP8266, mas tenho uma pergunta geral sobre tópicos. De acordo com www.hivemq.com :

  • A "barra à frente" /deve ser evitada.
  • Espaços devem ser evitados.
  • Use apenas caracteres ASCII.
  • Incorpore um identificador exclusivo ou o ClientId ao tópico.
  • Etc.

Apliquei-me bastante a isso, mas uso alguns caracteres especiais (% e ° por exemplo). Por exemplo eu uso:

Garage_Sensor_001/Temperature/°C value

Livingroom_HID_002/Switch_001/Action value

Bedroom_Sensor_001/Motion_001/Detection value

Ou seja,

PLACEMENT_OF_NODE/TYPE_OF_SENSOR_UNIT_OR_ACTION/FUNDAMENTAL_UNIT_OF_VALUE_IF_ANY

Portanto, minha pergunta é: Devo usar caracteres especiais ao nomear tópicos do MQTT?

Jimmy Westberg
fonte

Respostas:

6

A Goufalite está totalmente correta sobre esse problema: não é um problema técnico, apenas um problema de nomeação; portanto, muitos conselhos são muito opinativos com base na idéia do autor de quais nomes são os melhores.

A especificação do MQTT 3.1 diz :

  • Os nomes de tópicos e os filtros de tópicos diferenciam maiúsculas de minúsculas
  • Nomes de tópicos e filtros de tópico podem incluir o caractere de espaço
  • Os nomes de tópico e os filtros de tópico são cadeias de caracteres UTF-8, NÃO DEVEM codificar para mais de 65535 bytes

Portanto, puramente falando por motivos técnicos, as regras somente ASCII e 'sem espaços' não são necessárias; todos os corretores MQTT compatíveis devem ser capazes de lidar com eles muito bem.

Eu realmente não concordo com alguns dos pontos que o HiveMQ faz de qualquer maneira:

Um espaço é o inimigo natural de cada programador; eles geralmente tornam muito mais difícil a leitura e a depuração de tópicos, quando as coisas não estão indo do jeito que deveriam. Tão semelhante ao primeiro, apenas porque algo é permitido não significa que ele deva ser usado. O UTF-8 conhece muitos tipos diferentes de espaços em branco, é bastante óbvio que caracteres tão incomuns devem ser evitados.

É altamente improvável que você use espaços de outra maneira que não seja apenas pressionar a SPACEtecla do teclado, então não acho que o uso acidental de homóglifos seja realmente um problema.

O uso de caracteres não ASCII UTF-8 torna muito difícil encontrar erros de digitação ou problemas relacionados ao conjunto de caracteres, porque geralmente eles não podem ser exibidos corretamente. A menos que seja realmente necessário, recomendamos evitar o uso de caracteres não ASCII em um tópico.

Ponto justo - digitar caracteres não ASCII pode ser um grande problema. Pessoalmente, eu evitaria Garage_Sensor_001/Temperature/°Csimplesmente porque muitos teclados não têm um símbolo de graus embutido (os teclados britânicos certamente não!). Essa decisão é realmente baseada na praticidade, e não no protocolo; se você é capaz de usar caracteres especiais sem muito barulho e tem certeza de que ninguém mais precisará digitar os caracteres, vá em frente!

Além disso, ficaria um pouco cético em relação a alguns dos conselhos do HiveMQ; mais adiante, na página que você vinculou, diz "Não se inscreva no #", que já foi disputado no site !

Aurora0001
fonte
8

Acho que a nomeação de tópicos é o mesmo problema que a nomeação de variáveis : design de aplicativo comum.

Vamos mudar de outra maneira: como sua linguagem de programação de implementação gerencia caracteres especiais? Espaços? Acentos? ... Especialmente quando você as divide, daí a regra "sem barra".

Se você tem um controle perfeito nas páginas de código UTF-8 / ASCII (confie em mim, não tem), então vá em frente! Coloque acentos, caracteres especiais!

Em seguida, pense no seguinte, e isso se aplica a todos os projetos:

  • Evolutividade: quem cuidará do seu projeto? Vocês? Uma comunidade de código aberto? Mantenha simples para qualquer pessoa (até você) não precisar digitar nomes de tópicos complexos / longos.
  • I18N: convenhamos, os projetos populares estão em inglês e, ei, o inglês não tem acentos!
Goufalite
fonte
2

Use apenas caracteres ASCII.

O formato ASCII do Network Interchange especifica que o intervalo ASCII se estende de 0 a 7F hexadecimal, ou seja, 128 caracteres. Eu acho que% deve ser suportado, mas não °.

soluço
fonte