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服务启动成功!"); }
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(); }//图片 } } }