예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        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);
                }
            }
        }
예제 #3
0
        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);
                }
            }
        }