public ApiModule(MatrixSocketServer sos) { Get[""] = (_) => { return(Response.AsFile("ui/index.html")); }; Get["sessions"] = (_) => { return(Response.AsJson(sos.GetAllSessions().Select(s => { dynamic mock = new ExpandoObject(); mock.sid = s.SessionID; mock.imei = s.Imei; mock.lastActive = s.LastActiveTime; mock.ip = s.LocalEndPoint.Address.ToString(); return mock; }))); }; Get["poll/{matrixId}/{tubeId}"] = (arg) => { Guid matrixId = Guid.Parse(arg.matrixId); Guid tubeId = Guid.Parse(arg.tubeId); return("удалось ");// +(pm.Poll(matrixId, tubeId).Result.Success ? "да" : "нет"); }; }
public void Start() { var uc = new UnityContainer(); ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(uc)); hm = new HandlerManager(); bus = new Bus(); ss = new MatrixSocketServer(); uc.RegisterInstance(bus); uc.RegisterInstance(ss); bus.Start(); bus.OnMessageReceived += async(se, ea) => { try { logger.Debug("получено сообщение на опрос"); //при поступлениии сообщения из шины //ищем обработчик, если он есть //смотрим есть ли сессия, //запускаем опрос string what = ea.Message.head.what; var handler = hm.Get(what); if (handler == null) { logger.Warn("обработчик команды {0} не найден, команда проигнорирована", what); return; } //find session var ids = new List <Guid>(); foreach (var id in ea.Message.body.path) { ids.Add(Guid.Parse(id)); } var executor = ids.Skip(ids.Count() - 2).FirstOrDefault(); var target = ids.FirstOrDefault(); var session = ss.GetAllSessions().FirstOrDefault(s => s.Id == executor); if (session == null) { logger.Warn("сессия контроллера {0} не найдена", executor); bus.SendRejectPoll(target, "не на связи"); return; } if (!session.CurrentState.CanChange()) { logger.Warn("текущее состояние {0} не может быть заменено", session.CurrentState); bus.SendRejectPoll(target, "заблокирован"); return; } bus.SendBeginPoll(target, ""); session.ChangeState(handler); var result = await session.CurrentState.Start(ea.Message.body.path, ea.Message.body.details); bus.SendCompletePoll(target, 1, ""); //todo ans here session.ChangeState(hm.Get("idle")); }catch (Exception ex) { logger.Error(ex, "при получении заявки на опрос"); } //if (ea.Message.head.what == "poll") //{ // Guid matrixId = Guid.Parse(ea.Message.body.matrixId); // Guid tubeId = Guid.Parse(ea.Message.body.tubeId); // logger.Debug("опрос начался: {0}", result.Success ? "да" : "нет"); // if (result.Success) // { // var answer = bus.MakeMessageStub("", "poll-started"); // answer.body.taskId = ea.Message.body.taskId; // answer.body.reason = result.Reason; // answer.body.portName = ea.Message.body.portName; // bus.Send(answer); // } // else // { // var answer = bus.MakeMessageStub("", "poll-rejected"); // answer.body.taskId = ea.Message.body.taskId; // answer.body.reason = result.Reason; // answer.body.portName = ea.Message.body.portName; // bus.Send(answer); // } //} //ea.Message; }; ss.NewSessionConnected += (session) => { //todo notify task manager here logger.Debug("контроллер {0} вышел на связь ({1})", session.Imei, session.RemoteEndPoint.Address.ToString()); }; ss.SessionClosed += (session, reason) => { logger.Debug("соединение с {0} закрыто, причина {1}", session.Imei, reason); }; ss.NewRequestReceived += (session, info) => { logger.Debug("пришла посылка от {0} а именно {1}", session.Imei, string.Join(",", info.Body.Select(b => b.ToString("X2")))); session.CurrentState.AcceptFrame(info); }; var port = int.Parse(ConfigurationManager.AppSettings["port-port"]); if (!ss.Setup(port) || !ss.Start()) { logger.Warn("не удалось запустить порт матрикс на {0} порту", port); return; } logger.Info("сокет сервер запущен на порту {0}", port); var url = ConfigurationManager.AppSettings["url"]; host = WebApp.Start(url, app => { app.UseNancy(n => n.Bootstrapper = new Bootstrapper(uc)); }); logger.Info("сервис запущен, url: {0}", url); }