Exemple #1
0
        public static void StartMqttServer()
        {
            DeviceContext devices = new DeviceContext();

            if (mqttServer == null)
            {
                try
                {
                    var options = new MqttServerOptions
                    {
                        ConnectionValidator = p =>
                        {
                            DeviceModel device = devices.Devices.SingleOrDefault(x => x.DeviceKey == p.Password);
                            if ((device.Name == p.Username) || (device.User == p.Username))
                            {
                                return(MqttConnectReturnCode.ConnectionAccepted);
                            }

                            return(MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword);
                        }
                    };

                    mqttServer = new MqttServerFactory().CreateMqttServer(options) as MqttServer;
                    mqttServer.ApplicationMessageReceived += MqttServer_ApplicationMessageReceived;
                    mqttServer.ClientConnected            += MqttServer_ClientConnected;
                    mqttServer.ClientDisconnected         += MqttServer_ClientDisconnected;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return;
                }
            }

            mqttServer.StartAsync();
            Console.WriteLine("MQTT服务启动成功!");
        }
Exemple #2
0
        public static void MqttServer_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
        {
            DeviceContext devices = new DeviceContext();
            string        topic   = e.ApplicationMessage.Topic;
            string        message = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);

            Console.WriteLine($"客户端[{e.ClientId}]>> 主题:{e.ApplicationMessage.Topic} 负荷:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload)} Qos:{e.ApplicationMessage.QualityOfServiceLevel} 保留:{e.ApplicationMessage.Retain}");

            string[] _topic   = topic.Split(':');
            string[] _message = message.Split(',');

            if (_topic.Length < 2)
            {
                return;
            }
            if (_message[0] != null)
            {
                var         dbSet  = devices.Devices.Where(t => t.User == _topic[0]);
                int         count  = dbSet.Count();
                DeviceModel device = new DeviceModel();
                foreach (DeviceModel _device in dbSet)
                {
                    if (_device.Name == _message[0])
                    {
                        device = _device;
                    }
                }
                //var device = devices.Devices.SingleOrDefault(x => x.Name == _message[0]);//这个设备存在
                if (device == null)
                {
                    return;
                }
                if (device.User == _topic[0])//这个设备属于当前访问用户
                {
                    if (_message[1] != null)
                    {
                        if ((_message[1] == "true") || (_message[1] == "false"))
                        {
                            device.Switch = Convert.ToBoolean(_message[1]);
                        }
                        devices.SaveChanges();
                    }
                    if (_message.Length < 3)
                    {
                        return;
                    }
                    if ((_message[2] != null) && (_topic[1] == device.Name))//只有设备端发布的消息才进入数据库
                    {
                        device.Message = _message[2];
                        devices.SaveChanges();
                    }
                    if ((_message.Length > 3) && (_topic[1] == device.Name))
                    {
                        if (!Directory.Exists($"wwwroot\\images\\{ device.User}\\{device.Name}"))
                        {
                            Directory.CreateDirectory($"wwwroot\\images\\{ device.User}\\{device.Name}");
                        }
                        FileStream image = File.OpenWrite($"wwwroot\\images\\{device.User}\\{device.Name}\\1.jpg");
                        for (int i = 3; i < _message.Length; i++)
                        {
                            byte[] b = new byte[1];
                            b[0] = Convert.ToByte(_message[i]);
                            image.Seek(i - 3, SeekOrigin.Begin);
                            image.Write(b, 0, 1);
                        }
                        image.Close();
                    }//图片
                }
            }
        }