Forma adequada para distinguir entre vários serviços, utilizando zeroconf
Pergunta
Eu estou escrevendo uma peça de software que será executado em computadores assim como os telefones.
O serviço utiliza uma API de HTTP para a comunicação e, será publicado através de uma rede local usando Zeroconf.
Inicialmente eu publiquei o meu serviço usando _http._tcp.
como o tipo de serviço, mas rapidamente descobri que a minha NAS e meu receptor de música(!) também difunde-se com esse exato tipo de serviço.
Assim, a questão que agora se coloca como diferenciar entre o meu serviço e outros serviços que estão usando HTTP.
Alternativas
Usando um diferente tipo de serviço
O é certamente o mais, certamente, a maneira mais fácil e (quase) garantias de nenhum outro serviço vai ser pego.
No entanto, de acordo com a Apple1 novos serviços deve ser registrados com IANA.Esta é, obviamente, não é necessário, mas vendo como eles recomendam que ela sente como seria a forma errada de fazê-lo
Usando o registro de TXT
Apple2 descreve o registro TXT como este:
Quando um serviço é registrado, três registros DNS são criados:um serviço (SRV), um ponteiro (PTR), e um texto (TXT) grave.O registro TXT que contém dados adicionais necessários para resolver ou usar o serviço, embora ele também está sempre vazia.
Certamente se sente como se pudesse ser o caminho certo para fazê-lo, mas ainda não tenho certeza e é difícil encontrar uma descrição do que o campo deve conter.
Meu primeiro seria colocar algo como <service_name>-<version>
que será, então, ser analisada para ver qual o serviço que ele realmente é.
Meu NAS parece utilizar isto para a identificação do modelo e números de versão.
Tente falar com o serviço de
Depois de encontrar um serviço, pode-se sempre realizar uma HEAD
pedido em um conhecido ponto de extremidade e olhar para um conhecido cabeçalho definido pelo serviço.
Este se sente como um bastante lento, abordagem e quem sabe o que fazer uma HEAD
pedido para o meu receptor irá fazer.
E só para deixar claro, essa pergunta não tem nada a ver com uma linguagem específica ou quadro, é sobre os conceitos de zeroconf.
Eu poderia mostrar algum código, mas não vejo como isso iria ajudar.
Solução
Primeiro, faz o serviço que está a anunciar, na verdade, atender as qualificações para _http
conforme definido pela RFC 2782.Especificamente - é não apenas usando HTTP para um transporte, mas também é:
- pode ser apresentado por "típico" cliente de navegador da web de software, e
- é destinado principalmente para ser visualizado por um usuário humano.
Se nenhum, registe o seu próprio tipo de serviço (há um par de outros serviços que usam o HTTP como transporte, mas não atender as qualificações para que eles tenham -http
como um sufixo para o nome de serviço, consulte pgpkey-http
, senteo-http
, xul-http
).
Se sim, há um par de maneiras de ir, dependendo de como estrita uma interpretação da RFC é.A menos rigorosa, sendo apenas a adição de um TXT registro como você já anotou na sua pergunta.o iTunes regista-se com um TXT gravado no formato iTSh Version=196618
.
Se você está se sentindo um pouco mais rigorosa, a RFC apenas afirma explicitamente que o u=
, p=
e path=
Registros TXT existem para HTTP.Talvez alguém possa dialogar sobre isso, mas eu não vi muita discussão sobre se a adição de registros TXT para as já existentes entradas é desaprovado ou não.Então, com isso, a outra forma é apenas uma algorítmico nome de instância.Por exemplo, adicionando o sufixo "-NicklasAService" para o nome do dispositivo.Esperamos que, dando-lhe um nome exclusivo para a rede local, mas ainda fazendo com que o serviço pode ser facilmente recolhida pelo registro PTR apenas olhando para o sufixo.