示例#1
0
 // 启动前环境检查
 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);
 }
示例#2
0
        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;
        }
示例#3
0
 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);
 }
示例#4
0
        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);
        }