/// <summary> /// Método Web Service para colocar mensagens na fila de envio aos constroladores da rede /// </summary> public bool EnviaRequisicao(string CodigoControlador, string CodigoDispositivo, string NovoValor, out string Mensagem) { Mensagem = string.Empty; try { #region Monta Mensagem MensagemDispositivo objMensagem = new MensagemDispositivo(); // Monta Header objMensagem._Header = new MensagemDispositivo.Header(); objMensagem._Header.ID_Sender = Service._configuradorGeral.IdServidor; objMensagem._Header.ID_Receiver = CodigoControlador; // Monta Command objMensagem._Command = new MensagemDispositivo.Command(); objMensagem._Command.ID_Dispositivo = CodigoDispositivo; objMensagem._Command.Disp_Value = NovoValor; #endregion // Coloca na Fila para envio cqMsgEnvio.Enqueue(objMensagem); return(true); } catch (Exception exc) { Mensagem = "Erro ao montar requisição de envio ao controlador. Consulte o log para maiores detalhes."; controlLog.Insere(Biblioteca.Modelo.Log.LogTipo.Erro, "Erro ao montar requisição de envio ao controlador. (EnviaRequisicao)", exc); return(false); } }
public void LoopPrincipal() { try { // Inicia Filas de comunicação entre as threads cqMsgRecebidas = new System.Collections.Concurrent.ConcurrentQueue <MensagemDispositivo>(); cqMsgEnvio = new System.Collections.Concurrent.ConcurrentQueue <MensagemDispositivo>(); // Guarda status atual dos dispositivos conectados cdStatusDispositivos = new System.Collections.Concurrent.ConcurrentDictionary <string, string>(); // Ativa thread a parte para processar as requisições recebidas threadRecebimento = new Thread(LoopProcessamentoRequisicoesRecebidas); threadRecebimento.Start(); #region Porta Serial - Comunicação com a rede de sensores // Xbee conectado ao servidor portaXbeeServidor = new SerialPort(); ConfiguraPortaSerial(portaXbeeServidor); // Ativa porta portaXbeeServidor.Open(); #endregion // Inicia WebService // Recebe as requisições do gerenciador para envio aos dispositivos Uri objUri = new Uri(_UriServidor); using (ServiceHost Host = new ServiceHost(this.GetType(), objUri)) { #region configura o WebService // Habilita HTTP BasicHttpBinding bndng = new BasicHttpBinding(); bndng.MaxReceivedMessageSize = 10485760; bndng.ReceiveTimeout = new TimeSpan(0, 0, 10, 0, 0); System.ServiceModel.Description.ServiceMetadataBehavior smb = new System.ServiceModel.Description.ServiceMetadataBehavior(); smb.HttpGetEnabled = true; smb.HttpGetUrl = objUri; Host.Description.Behaviors.Find <System.ServiceModel.Description.ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true; Host.AddServiceEndpoint(typeof(IwsrvHomeOn), bndng, _UriServidor); Host.Description.Behaviors.Add(smb); // Ativa Service Host (Servidor WebService) Host.Open(); #endregion // Faz solicitação do status de todos os dispositivos conectados portaXbeeServidor.Write(MensagemDispositivo.StatusTodosDipositivos(Service._configuradorGeral.IdServidor)); portaXbeeServidor.BaseStream.Flush(); System.Threading.Thread.Sleep(3000); try { #region LOOP da Thread Principal while (Service._bAtivo) { try { int iSleep = 200; MensagemDispositivo objMsg; // Processa mensagem de envio if (cqMsgEnvio.TryDequeue(out objMsg)) { try { string sTextoEnvio = objMsg.TextoEnvio(); portaXbeeServidor.Write(sTextoEnvio); portaXbeeServidor.BaseStream.Flush(); iSleep = 1000; // Grava trace controlTrace.Insere(Biblioteca.Modelo.TraceComunicacao.ProcedenciaTrace.HomeOn, objMsg._Header.ID_Receiver, objMsg._Command.ID_Dispositivo, sTextoEnvio); } catch (Exception exc) { controlLog.Insere(Biblioteca.Modelo.Log.LogTipo.Erro, "Erro ao escrever mensagem na porta serial.", exc); } } System.Threading.Thread.Sleep(iSleep); } catch (Exception exc) { controlLog.Insere(Biblioteca.Modelo.Log.LogTipo.Erro, "Erro no Loop Principal do Serviço.", exc); System.Threading.Thread.Sleep(1000 * 30); } } #endregion } finally { // Fecha Webservice if (Host != null && Host.State != CommunicationState.Closed && Host.State != CommunicationState.Closing) { Host.Close(); } } } } catch (Exception exc) { controlLog.Insere(Biblioteca.Modelo.Log.LogTipo.Erro, string.Format("Erro ao inicializar o serviço (LoopPrincipal). Detalhes:\r\n{0}", exc.Message), exc); return; } finally { // Fecha conexão serial if (portaXbeeServidor != null) { if (portaXbeeServidor.IsOpen) { portaXbeeServidor.Close(); } portaXbeeServidor.Dispose(); } portaXbeeServidor = null; // Espera thread de Recebimento terminar Service._bAtivo = false; while (threadRecebimento.IsAlive) { System.Threading.Thread.Sleep(500); } } }
private void RecebeMensagem() { // Enquanto houver texto pendente no buffer // Enfileira as mensagens para processamento while (portaXbeeServidor.IsOpen && portaXbeeServidor.BytesToRead > 0) { List <byte> resposta = new List <byte>(); bool bFim = false; int carac = 0; int tempo = 0, espera = 20; int iTimeOut = 1000; // Lê stream até encontrar um Trailer + CR while (!bFim && tempo <= iTimeOut) { try { carac = portaXbeeServidor.ReadByte(); if ((char)carac == MensagemDispositivo._FimMensagem) { resposta.Add((byte)carac); bFim = true; continue; } // Nada recebido, espera mais um pouco if (carac == -1) { tempo += espera; System.Threading.Thread.Sleep(espera); } else { tempo = 0; resposta.Add((byte)carac); } } catch (Exception exc) { controlLog.Insere(Biblioteca.Modelo.Log.LogTipo.Erro, "Erro durante a leitura de dados da porta serial. (RecebeMensagem)", exc); bFim = true; } } string texto = Encoding.GetEncoding("ISO-8859-1").GetString(resposta.ToArray <byte>()); try { // Monta mensagem recebida MensagemDispositivo msgRecebida = new MensagemDispositivo(texto); // Grava Trace controlTrace.Insere(Biblioteca.Modelo.TraceComunicacao.ProcedenciaTrace.Controlador, msgRecebida._Header.ID_Sender, msgRecebida._Command.ID_Dispositivo, texto); // Adiciona na fila cqMsgRecebidas.Enqueue(msgRecebida); } catch (Exception exc) { controlLog.Insere(Biblioteca.Modelo.Log.LogTipo.Erro, string.Format("Erro ao instanciar objeto MensagemRecebida (portaXbeeServidor_DataReceived). Texto recebido: {0}", texto), exc); } } }