// 启动前环境检查 public bool EnvCheckForBeforeRun(out string projectConfigPath, out string errMsg) { errMsg = ""; projectConfigPath = ""; // 选择加载的需要项目名称 if (!XMLHelper.LoadSolutionInfo(solutionFilePath, out string solutionName, out errMsg)) { return(false); } // 找到该项目配置文件 if (!XMLHelper.LoadProjectConfigPath(solutionFilePath, solutionName, out projectConfigPath, out errMsg)) { return(false); } // 找到日志的端口 if (!XMLHelper.LoadLogPort(projectConfigPath, out int logPort, out errMsg)) { return(false); } // 判断日志端口 if (!IPTool.IsValidPort(logPort)) { errMsg = "日志服务器的发布端口被占用,请更换端口号,端口:" + logPort; return(false); } return(true); }
public void Start(out string errMsg) { errMsg = ""; if (IsRuning) { return; } // 加载日志数据发布服务所需配置文件信息 this.mqttParam = new MQTTParam(); if (!LoadConfig(out errMsg)) { return; } // 检查端口是否空闲 if (!IPTool.IsValidPort(this.mqttParam.port)) { errMsg = "日志服务器的发布端口被占用,请更换端口号"; return; } // 开启MQTT服务当做发布器 mqttServer = new MQTTServer(mqttParam); mqttServer.Start(out errMsg); if (!mqttServer.IsRuning || !string.IsNullOrWhiteSpace(errMsg)) { Stop(); return; } // 开启消息队列的消费器 queue = new BlockingCollection <TraceItem>(); task = new Task(() => { foreach (TraceItem item in queue.GetConsumingEnumerable()) { try { ActionTimeout <TraceItem> timeout = new ActionTimeout <TraceItem>(); timeout.Do = Excute; bool isTimeout = timeout.DoWithTimeout(item, TimeSpan.FromSeconds(5)); //只等待5秒 if (isTimeout) // 超时 { GC.Collect(); } } catch { } } }, TaskCreationOptions.LongRunning); task.Start(); IsRuning = true; }
public bool Check(out string err) { err = ""; if (!string.IsNullOrWhiteSpace(errMsg)) { err = errMsg; return(false); } if (string.IsNullOrWhiteSpace(commandIP)) { err = "配置文件物联控制主机不是有效的IP地址"; return(false); } if (!IPTool.PingIP(commandIP)) { err = "配置文件物联控制主机网络不通"; return(false); } if (port == 0) { err = "配置文件物联控制主机端口不能为0"; return(false); } if (IPTool.IsValidPort(port)) { err = "配置文件物联控制主机端口为空闲端口,请检查物联网服务是否启动"; return(false); } if (timeoutSeconds == 0) { err = "配置文件物联控制主机缺少服务超时时间数配置"; return(false); } if (string.IsNullOrWhiteSpace(DBUtil.dbConnectString)) { err = "数据库连接字符串未配置"; return(false); } return(true); }
public void Start(out string errMsg) { errMsg = ""; if (IsRuning) { return; } if (this.mqttParam == null) { errMsg = "MQTT服务启动失败,没有指明服务所需参数"; return; } // 检查端口是否空闲 if (!IPTool.IsValidPort(this.mqttParam.port)) { errMsg = "数据发布服务器的监听端口被占用,请更换端口号"; return; } if (mqttServer == null) { try { mqttServer.StopAsync(); mqttServer = null; } catch { } } // MQTT 动态库本身已经实现异步启动,这里不用在用异步调用了 try { var optionsBuilder = new MqttServerOptionsBuilder(); // //在 MqttServerOptions 选项中,你可以使用 ConnectionValidator 来对客户端连接进行验证。 // //比如客户端ID标识 ClientId,用户名 Username 和密码 Password 等。 optionsBuilder.WithConnectionValidator(ClientCheck); //指定 ip地址,默认为本地 if (string.IsNullOrWhiteSpace(this.mqttParam.ip)) { optionsBuilder.WithDefaultEndpointBoundIPAddress(IPAddress.Parse(this.mqttParam.ip)); } else { optionsBuilder.WithDefaultEndpointBoundIPAddress(IPAddress.Any); } //指定端口 optionsBuilder.WithDefaultEndpointPort(this.mqttParam.port); // // optionsBuilder.WithConnectionBacklog(100).WithEncryptedEndpointBoundIPAddress(IPAddress.Any).WithEncryptedEndpointPort(9323); // var certificate = new X509Certificate(@"D:\ddd.cer", ""); //var options = optionsBuilder.Build(); // options.TlsEndpointOptions.Certificate = certificate.Export(X509ContentType.Cert); // //ssl //var certificate = new X509Certificate(@"D:\ddd.cer", ""); //MqttServerOptions certifOption = new MqttServerOptions(); //certifOption.TlsEndpointOptions.Certificate = certificate.Export(X509ContentType.Cert); //certifOption.TlsEndpointOptions.IsEnabled = true; //optionsBuilder.WithEncryptionCertificate(certifOption.TlsEndpointOptions.Certificate); // var optionsBuilder = new MqttServerOptionsBuilder() //.WithConnectionBacklog(100) //.WithEncryptedEndpointPort(1884) //.WithoutDefaultEndpoint(); var mqttServer = new MqttFactory().CreateMqttServer(); //连接记录数,默认 一般为2000 //optionsBuilder.WithConnectionBacklog(2000); mqttServer = new MqttFactory().CreateMqttServer() as MqttServer; // 客户端支持 Connected、Disconnected 和 ApplicationMessageReceived 事件, //用来处理客户端与服务端连接、客户端从服务端断开以及客户端收到消息的事情。 //其中 ClientConnected 和 ClientDisconnected 事件的事件参数一个客户端连接对象 ConnectedMqttClient, //通过该对象可以获取客户端ID标识 ClientId 和 MQTT 版本 ProtocolVersion。 mqttServer.ClientConnected += MqttServer_ClientConnected; mqttServer.ClientDisconnected += MqttServer_ClientDisconnected; //ApplicationMessageReceived 的事件参数包含了客户端ID标识 ClientId 和 MQTT 应用消息 MqttApplicationMessage 对象, //通过该对象可以获取主题 Topic、QoS QualityOfServiceLevel 和消息内容 Payload 等信息。 mqttServer.ApplicationMessageReceived += MqttServer_ApplicationMessageReceived; // Task task = mqttServer.StartAsync(options); Task task = mqttServer.StartAsync(optionsBuilder.Build()); task.Wait(5000); IsRuning = task.IsCompleted; } catch (Exception ex) { // log.Info("创建Mqtt服务,连接客户端的Id长度过短(不得小于5),或不是指定的合法客户端(以Eohi_开头)"); errMsg = "创建MQTT服务失败:" + ex.Message + "堆栈:" + ex.StackTrace; return; } //Task task = mqttServer.StartAsync(options); //// Task task = mqttServer.StartAsync(optionsBuilder.Build()); //task.Wait(5000); }