O protocolo de comunicação da app ClipSync

Me bateu vontade de fazer meu próprio servidor para o ClipSync, por isso me armei com o Wireshark e um pouco de paciência e cheguei ao protocolo a seguir, que já usei com sucesso em meu programa. Por sorte o autor não tentou usar nenhum tipo de obfuscação, nem tentou dar “segurança” à comunicação. Qualquer das duas iria inviabilizar minha tarefa.

O servidor usa três portas:

  • TCP 22983 – Comunicação bidirecional
  • UDP 22984 – Localização. Direção: Windows -> Android
  • UDP 22985 – Localização. Direção: Android -> Windows

Quase todas as transmissões precisam ter prefixos e sufixos adicionados que são ligeiramente diferentes entre protocolos. Não sei dizer o motivo da diferença:

  • Prefixo UDP: $$898|@'(
  • Prefixo TCP: $$898|@*[
  • Sufixo UDP:  $$898|@’)
  • Sufixo TCP:  $$898|@*]

A busca de servidores

Se você precisa de uma introdução sobre como uma localização UDP funciona, leia meu texto no Automalabs.

A app envia repetidamente um Broadcast UDP local (para x.x.x.255), porta 22985, com o texto:
CLIPSYNC SERVER! WHERE ARE YOU!?

O servidor responde uma vez para cada broadcast que recebe com um broadcast UDP para 255.255.255.255, porta 22984 com:
$$898|@'(nome_da_maquina$$898|@’)

nome_da_maquina é o nome Windows da máquina e é o que vai aparecer na lista da app, mas pode ser qualquer texto. A app identifica o servidor pelo IP de quem enviou a resposta.

Eu não sei se há um motivo específico para a app fazer um broadcast restrito (x.x.x.255) e o servidor responder com um broadcast irrestrito (255.255.255.255). É bem possível que seja apenas um diferença entre os frameworks usados pelo programador no Android e no Windows.

Conexão com o servidor
Quando você seleciona o servidor na app, esta envia para a porta TCP 22983 do servidor:

Os primeiros dois bytes (00, 31) são o tamanho do resto da mensagem. O resto é puro texto:

E a resposta do servidor é:

Em puro texto:

Depois de receber essa resposta a app avisa que está conectada ao servidor selecionado.

 

Envio do texto da área de transferência do Android para o servidor

É importante observar que isso só ocorre se a app detectar que o conteúdo da área de transferência no Android mudou. Se você copiar o mesmo texto repetidas vezes, ClipSync não vai transmitir nada.
Digamos que ClipSync transmita “00142348”. O texto é transmitido na porta TCP 22983 e os dois primeiros bytes (00, 1A) tem o tamanho da mensagem:

A resposta é uma exata cópia da transmissão, menos os dois bytes de tamanho da mensagem

Envio do texto da área de transferência do Windows para a app

A determinar

2 comentários

Deixe um comentário para Jefferson Cancelar resposta

Você pode usar estas tags HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

  

  

  

:) :( ;) O_o B) :lol: :huh: :S :D :-P 8-O :yahoo: :rtfm: :dashhead1: :clapping: more »