Backend do Robô
O servidor WebSocket é responsável por receber mensagens do robô e enviá-las para o backend, além de receber mensagens do backend e enviá-las para o robô. Ele é implementado em Python utilizando a biblioteca socketio.
Configuração do Servidor
O cliente Socket.IO é configurado para escutar eventos específicos, como connect, disconnect e medicine. Esses eventos são tratados por métodos que executam ações específicas, como conectar ao servidor, desconectar e processar dados relacionados à separação de medicamentos.
Eventos e Payloads
Um evento é uma mensagem enviada ou recebida pelo servidor ou cliente para indicar que algo aconteceu. O payload é o conteúdo da mensagem, geralmente em formato JSON, que contém os dados necessários para processar o evento.
connect:
- Descrição: Indica que o robô foi conectado ao servidor.
- Payload Enviado pelo Robô:
{
"data": "Robo conectado ao servidor"
}
disconnect:
- Descrição: Indica que o robô foi desconectado do servidor.
- Payload Enviado pelo Robô:
{
"data": "Robo desconectado do servidor"
}
medicine:
- Descrição: Contém informações sobre os bins e o ID da fita para separação de medicamentos.
- Payload Recebido:
{
"bins": {
"bin1": 2,
"bin2": 3
},
"idFita": "12345"
}
Métodos de Tratamento de Eventos
Os métodos connect(), disconnect() e medicine() são responsáveis por tratar os eventos connect, disconnect e medicine, respectivamente. Eles recebem o payload do evento e executam ações específicas, como imprimir mensagens no console, processar dados e emitir eventos de resposta.
@sio.event
def connect():
print('Conectado ao servidor!')
sio.emit('connectResponse', {'data': 'Robo conectado ao servidor'})
@sio.event
def disconnect():
print('Desconectado do servidor.')
sio.emit('disconnectResponse', {'data': 'Robo desconectado do servidor'})
@sio.event
def medicine(data):
print("medicine: ", str(data))
result = {
'action': 'collect', 'bins': data['bins'], 'idFita': data['idFita']
}
separateMedicine(result)
Separação de Medicamentos
O método separateMedicine() é responsável por gerenciar a separação de medicamentos. Ele utiliza o robô Dobot para realizar movimentos precisos até as posições das bins, desativar a sucção e retornar à posição inicial. Durante o processo, eventos são emitidos para o servidor para registrar logs e atualizar o status da operação.
Eventos e Respostas
Log de Separação:
- Evento Emitido:
log - Payload:
{
"acao": "Robot Log - Separar",
"detalhes": "Iniciando separação de fita de medicamentos, ID: 12345",
"usuario_id": 1
}
Status de Separação:
- Evento Emitido:
medicineResponse - Payload Inicial:
{
"status": "Separando",
"idFita": "12345"
} - Payload Final:
{
"status": "Completo",
"idFita": "12345"
}
Método de Separação de Medicamentos
O método separateMedicine() recebe o resultado da leitura do QR Code e executa a separação de medicamentos. Ele inicia a separação, emite eventos de log e status, movimenta o robô até as bins e retorna à posição inicial.
def separateMedicine(result):
device = InteliDobot(verbose=False) # Inicializa o robô Dobot com a porta detectada.
bins = result['bins']
print(result)
device.suck(False) # Desliga a sucção do robô.
return_home(device, positions) # Retorna o robô para a home.
sio.emit('log', {'acao': 'Robot Log - Separar', 'detalhes': 'Iniciando separação de fita de medicamentos, ID: ' + str(result['idFita']), 'usuario_id': 1})
sio.emit('medicineResponse', {'status': 'Separando', "idFita": str(result['idFita'])})
for bin in bins: # Percorre os bins e executa a movimentação para coleta.
move_to_bin(device, positions, bin, 0, bins[bin])
sio.emit('medicineResponse', {'status': 'Completo', "idFita": str(result['idFita'])})