初始化

This commit is contained in:
2025-11-20 16:20:04 +08:00
commit 4230fa4d27
777 changed files with 232488 additions and 0 deletions

View File

@@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using CSRedis;
namespace Common
{
/// <summary>
/// Redis缓存辅助类
/// </summary>
public class CSRedisCacheHelper
{
public static CSRedisClient redis;
private static int SessionExpireMinutes = 60;
private const string ip = "127.0.0.1";
private const string port = "7555";
public static string password = "cw_oy_lsh";
static CSRedisCacheHelper()
{
var redisHostStr = string.Format("{0}:{1}",ip,port);
if (!string.IsNullOrEmpty(redisHostStr))
{
//redis = new CSRedisClient(redisHostStr);//+ ",password=,defaultDatabase=0,poolsize=500,ssl=false,writeBuffer=10240,prefix=");
//RedisHelper.Initialization(redis);
//redis = new CSRedisClient[2];
redis = new CSRedisClient(redisHostStr + string.Format(",password={0},defaultDatabase=1",password));
//redis[1] = new CSRedisClient(redisHostStr + ",password=,defaultDatabase=1");
}
}
/// <summary>
/// 添加缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
public static void Set<T>(string key, T value)
{
redis.Set(key, value, SessionExpireMinutes * 60);
}
public static T Get<T>(string key)
{
return redis.Get<T>(key);
}
public static void Forever<T>(string key, T value)
{
redis.Set(key, value, -1);
}
public static void Del(string key)
{
redis.Del(key);
}
/// <summary>
/// 判断是否存在
/// </summary>
/// <param name="key"></param>
/// <param name="mac"></param>
/// <returns></returns>
public static bool Contains(string key, string mac)
{
bool result = redis.Exists(mac);
if (!result)
{
result = redis.Exists(key);
}
return result;
}
public static bool Contains(string key)
{
bool result = redis.Exists(key);
return result;
}
/// <summary>
/// 添加Hash缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
public static void HMSet<T>(string key, T value)
{
redis.HMSet(key, value);
}
/// <summary>
/// 获取Hash缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public static T[] HMGet<T>(string key)
{
return redis.HMGet<T>(key);
}
/// <summary>
/// 删除Hash缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public static long HDel<T>(string key)
{
return redis.HDel(key);
}
}
}

40
MQTTSub/MQTTSub.csproj Normal file
View File

@@ -0,0 +1,40 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Content Include="nlog.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="MQTTnet" Version="5.0.1.1416" />
<PackageReference Include="MQTTnet.Extensions.ManagedClient" Version="4.3.7.1207" />
<PackageReference Include="NetMQ" Version="4.0.2.1" />
<PackageReference Include="NLog" Version="5.3.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Commonlib\Commonlib.csproj" />
<ProjectReference Include="..\Common\Common.csproj" />
<ProjectReference Include="..\DAL\DAL.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<_LastSelectedProfileId>E:\tian\BLWLogMonitor\MQTTSub\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId>
</PropertyGroup>
</Project>

734
MQTTSub/Program.cs Normal file
View File

@@ -0,0 +1,734 @@
using System.Net;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Channels;
using Common;
using Commonlib;
using DAL.PGModels;
using ICSharpCode.SharpZipLib.Zip;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.VisualBasic;
using MQTTnet;
using MQTTnet.Packets;
using MQTTnet.Protocol;
using NetMQ;
using NetMQ.Sockets;
using NLog;
using NPOI.OpenXmlFormats;
using RestSharp;
namespace MQTTSub
{
internal class Program
{
public static IMqttClient MqttClient { get; set; }
public static MemoryCache _memoryCache = new MemoryCache(new MemoryCacheOptions { });
public static int Connecting = 0;
private static IServiceProvider _serviceProvider; // 需在程序初始化时赋值
private static Channel<string> _messageChannel;
private static Channel<string> _messageChannel_1;
public static IConfiguration Configuration;
static void Main(string[] args)
{
//PostWebRequestToTianMao("0EC0", "4979cf8db1ec46f48404e0d907b84719");
//PostWebRequestToTianMao("0006", "4979cf8db1ec46f48404e0d907b84719");
//PostWebRequestToTianMao("8088", "c3272aafc4224e27b023f1ea60478d61");
//PostWebRequestToTianMaoOld("PushWelcome",
//Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId ="4979cf8db1ec46f48404e0d907b84719", RoomNo = "0EC0", WelcomeText = "你好,欢迎你入住" }));//通知天猫精灵播放欢迎词
//return;
//string AAA = "AA 55 20 00 54 33 53 41 0E 5F DF 1F 08 77 A1 00 00 00 00 00 00 00 01 04 00 11 00 01 00 00 2E BE";
//AAA = AAA.Replace(" ", "");
//byte[] buffer = Tools.HEXString2ByteArray(AAA);
//int offset = 15;
//int length = buffer.Length - offset - 2;
//if (length > 0)
//{
// using (MemoryStream stream = new MemoryStream(buffer, offset, length))
// {
// string NNN = DecodeRoomStatus(stream, "1001", "2079", buffer).Result;
// }
//}
//return;
// 构建配置
Configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var Services = new ServiceCollection();
var ddda = Configuration["TianMaoCUID:1018"];
//var options = new DbContextOptionsBuilder<PostgresContext>()
//.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")).Options;
////AddDbContext默认已经将DbContext注册为Scoped生命周期再次显式注册会导致冲突
Services.AddDbContext<PostgresContext>(options =>
{
options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"));
});
_serviceProvider = Services.BuildServiceProvider();
// 创建无界Channel
_messageChannel = Channel.CreateUnbounded<string>();
//另外的Channel
_messageChannel_1 = Channel.CreateUnbounded<string>();
_ = Start_MqttClient();
Task.Factory.StartNew(async () =>
{
await ConsumeMessagesAsync();
}, TaskCreationOptions.LongRunning);
Task.Factory.StartNew(async () =>
{
await ConsumeMessagesAsync_1();
}, TaskCreationOptions.LongRunning);
Console.WriteLine("启动了");
Console.ReadLine();
}
public static async Task ConsumeMessagesAsync_1()
{
while (true)
{
if (_messageChannel_1.Reader.TryRead(out var nnn))
{
try
{
using var scope = _serviceProvider.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<PostgresContext>();
if (string.IsNullOrEmpty(nnn))
{
return;
}
MonitorLog? igs = System.Text.Json.JsonSerializer.Deserialize<MonitorLog>(nnn);
DAL.PGModels.DevMonitorlog ddd = new DAL.PGModels.DevMonitorlog();
ddd.HostId = igs.HostID;
ddd.HotelId = igs.HotelID;
ddd.HotelCode = igs.HotelCode.ToString();
ddd.RoomNo = igs.RoomNo;
ddd.HostNumber = igs.HostNumber;
ddd.Mac = igs.MAC;
ddd.LanIp = igs.LanIP;
ddd.LanPort = igs.LanPort;
ddd.WwwIp = igs.WWW_IP;
ddd.WwwPort = igs.WWW_Port;
DateTime dt = DateTime.Parse(igs.CreateTime);
ddd.CreateTime = dt;
long lllgs = Tools.ToUnixTimestampByMilliseconds(DateTime.Parse(igs.CreateTime));
ddd.CreateTimeToUnixTime = lllgs;
ddd.Data = igs.Data;
ddd.CommandType = igs.CommandType;
ddd.SendOrReceive = igs.SendOrReceive;
dbContext.DevMonitorlogs.Add(ddd);
await dbContext.SaveChangesAsync();
}
catch (Exception ex)
{
}
}
}
}
// 消费者方法
public static async Task ConsumeMessagesAsync()
{
while (true)
{
if (_messageChannel.Reader.TryRead(out var nnn))
{
try
{
using var scope = _serviceProvider.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<PostgresContext>();
if (string.IsNullOrEmpty(nnn))
{
return;
}
MonitorLog? igs = System.Text.Json.JsonSerializer.Deserialize<MonitorLog>(nnn);
DAL.PGModels.DevMonitorlog ddd = new DAL.PGModels.DevMonitorlog();
string MYTianMaoCUID = igs.TiaoMaoCUID;
string XiaoDuCUID = igs.XiaoDuCUID;
ddd.HostId = igs.HostID;
ddd.HotelId = igs.HotelID;
ddd.HotelCode = igs.HotelCode.ToString();
ddd.RoomNo = igs.RoomNo;
ddd.HostNumber = igs.HostNumber;
ddd.Mac = igs.MAC;
ddd.LanIp = igs.LanIP;
ddd.LanPort = igs.LanPort;
ddd.WwwIp = igs.WWW_IP;
ddd.WwwPort = igs.WWW_Port;
DateTime dt = DateTime.Parse(igs.CreateTime);
//DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
ddd.CreateTime = dt;
long lllgs = Tools.ToUnixTimestampByMilliseconds(DateTime.Parse(igs.CreateTime));
ddd.CreateTimeToUnixTime = lllgs;
string hexstring = igs.Data;
hexstring = hexstring.Replace(" ", "");
byte[] buffer = Tools.HEXString2ByteArray(hexstring);
#region
//下面是心跳包
//AA 55
//17 00
//54 33 53 41
//02
//D6 92
//E4 07 67 18
//34 D0 B8 11 67 18
//1C E7
//下面是这个状态同步
//AA 55 38 00
//54 33 53 41
//0E
//EC 8C
//E4 07
//67 B4
//00 00 00 00 00 00 00
//05
//04 00 01 00 02 00
//04 00 03 00 02 00
//04 00 02 00 02 00
//04 00 08 00 02 00
//04 00 0D 00 02 00 00
//E6 90
#endregion
var CommandType = buffer[8];
if (igs.CommandType.Equals("客房状态同步"))
{
int offset = 15;
int length = buffer.Length - offset - 2;
if (length > 0)
{
using (MemoryStream stream = new MemoryStream(buffer, offset, length))
{
string NNN = await DecodeRoomStatus(stream, ddd.RoomNo, ddd.HotelCode, buffer, ddd.HotelId, MYTianMaoCUID, XiaoDuCUID, dbContext);
if (ddd.HotelCode.Equals("1197"))
{
_logger.Error("1197解析出的数据为" + NNN);
}
ddd.AnalysisData = NNN;
}
}
}
//不是青奥酒店 的数据才处理
//if (!ddd.HotelCode.Equals("1197"))
if (true)
{
ddd.Data = igs.Data;
ddd.CommandType = igs.CommandType;
ddd.SendOrReceive = igs.SendOrReceive;
dbContext.DevMonitorlogs.Add(ddd);
//这里的MAC可能有重复所以 使用First不使用Single
var ccc = dbContext.StatisticsTotals.FirstOrDefault(A => A.Mac.Equals(igs.MAC));
if (ccc != null)
{
if (igs.SendOrReceive.Equals(ConstKey.Receive_RX))
{
ccc.RxCount += 1;
}
else if (igs.SendOrReceive.Equals(ConstKey.Send_TX))
{
ccc.TxCount += 1;
}
ccc.UpdateTime = igs.CreateTime;
dbContext.StatisticsTotals.Update(ccc);
await dbContext.SaveChangesAsync();
}
else
{
DAL.PGModels.StatisticsTotal ccc1 = new DAL.PGModels.StatisticsTotal();
ccc1.Mac = igs.MAC;
ccc1.RxCount = 1;
ccc1.TxCount = 1;
ccc1.UpdateTime = igs.CreateTime;
ccc1.HotelCode = igs.HotelCode.ToString();
ccc1.HostNumber = igs.HostNumber;
dbContext.StatisticsTotals.Add(ccc1);
await dbContext.SaveChangesAsync();
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Publish failed: {ex.Message}");
Console.WriteLine(ex.StackTrace);
}
}
}
}
async private static Task Start_MqttClient()
{
try
{
var mqttFactory = new MqttClientFactory();
string? ip = "120.24.73.62";
int? port = 1883;
string? username = "blw";
string? pwd = "blw@1234";
long lid = Tools.ToUnixTimestampBySeconds(DateTime.Now);
string ID = $"logmonitor_sub_{lid}";
MqttClient = mqttFactory.CreateMqttClient();
var mqttClientOptions = new MqttClientOptionsBuilder()
.WithClientId(ID)
.WithTcpServer(ip, port)
.WithCredentials(username, pwd)
.WithWillQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce)
.WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V500)
.Build();
MqttClient.ApplicationMessageReceivedAsync -= MqttClient_ApplicationMessageReceivedAsync;
MqttClient.DisconnectedAsync -= MqttClient_DisconnectedAsync;
MqttClient.ApplicationMessageReceivedAsync += MqttClient_ApplicationMessageReceivedAsync;
MqttClient.DisconnectedAsync += MqttClient_DisconnectedAsync;
await MqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
var subscribeOptions = new MqttClientSubscribeOptions();
var topicFilter = new MqttTopicFilter
{
Topic = "blw/log/report"
};
var topicFilter1 = new MqttTopicFilter
{
Topic = "blw/rcu/monitor/endpoint"
};
subscribeOptions.TopicFilters.Add(topicFilter);
subscribeOptions.TopicFilters.Add(topicFilter1);
await MqttClient.SubscribeAsync(subscribeOptions, CancellationToken.None);
}
catch (Exception ex)
{
Console.WriteLine("Start_MqttClient: " + ex.Message);
}
}
async private static Task MqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg)
{
try
{
Console.WriteLine("断线重连了");
await Task.Delay(10000);
await Start_MqttClient();
}
catch (Exception)
{
}
}
async private static Task MqttClient_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
{
string topic = arg.ApplicationMessage.Topic;
var str = arg.ApplicationMessage.Payload;
string nnn = Encoding.UTF8.GetString(str);
try
{
if (topic.Equals("blw/rcu/monitor/endpoint"))
{
}
else
{
await _messageChannel.Writer.WriteAsync(nnn);
}
}
catch (Exception ex)
{
//Console.WriteLine("错误数据为:"+nnn);
Console.WriteLine("MqttClient_ApplicationMessageReceivedAsync: " + ex.Message);
}
await Task.CompletedTask;
}
async private static Task<string> (string RoomNumber, string HotelCode)
{
string Key = "QueryRoomType_" + RoomNumber + "_" + HotelCode;
string MyData = "";
var Data = _memoryCache.Get<string>(Key);
if (Data != null)
{
MyData = Data;
}
else
{
//第一步先查出是什么房型
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("roomnumber", RoomNumber);
dic.Add("hotelcode", HotelCode);
//返回的是var G = new { RoomTypeId = AA.ID, RoomTypeName = AA.Name };
var GGG = await Http.HttpPostFormSendData(dic, "/api/GetRoomTypeInfo");
var GGG1 = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(GGG.response.ToString());
string jieguo = GGG1["resDesc"].ToString();
if (jieguo.Equals("查询成功"))
{
var DDD1 = System.Text.Json.JsonSerializer.Deserialize<TempResult>(GGG.response.ToString());
string RoomTypeID = DDD1.Result.RoomTypeId.ToString();
_memoryCache.Set<string>(Key, RoomTypeID, new TimeSpan(0, 30, 0));
MyData = RoomTypeID;
}
}
return MyData;
}
async private static Task<List<DeviceInfo>> (string HotelCode, string RoomTypeID)
{
string Key = "HuoQuHuoLuXinXi_" + HotelCode;
int RoomTypeIDInt = 0;
int.TryParse(RoomTypeID, out RoomTypeIDInt);
HotelInfo data = new HotelInfo() { code = HotelCode };
WebAPIData MyWeb = null;
var Data = _memoryCache.Get<WebAPIData>(Key);
if (Data != null)
{
MyWeb = Data;
}
else
{
//第二步查询出所属房型的回路数据
var QQQ = await Http.HttpGetSendData(data, "/api/GetRoomTypeAndModalsListLog");
var QQQ1 = System.Text.Json.JsonSerializer.Deserialize<WebAPIData>(QQQ.response.ToString());
_memoryCache.Set<WebAPIData>(Key, QQQ1, new TimeSpan(0, 20, 0));
MyWeb = QQQ1;
}
var QQQ2 = MyWeb.Result.FirstOrDefault(A => A.ID == RoomTypeIDInt);
var QQQ3 = QQQ2.Modals;
return QQQ3;
}
/// <summary>
/// 分析数据
/// </summary>
/// <param name="stream"></param>
/// <param name="RoomNumber"></param>
/// <param name="HotelCode"></param>
/// <returns></returns>
async private static Task<string> DecodeRoomStatus(Stream stream, string RoomNumber, string HotelCode, byte[] bbbfff, int? hotelid, string WoDeTianMao, string XiaoDu, PostgresContext dbcontext)
{
Dictionary<string, DeviceStatusData> l = new Dictionary<string, DeviceStatusData>();
try
{
using (BinaryReader reader = new BinaryReader(stream))
{
var SysLock = reader.ReadBoolean(); //RCU是否锁定0/否1/是
var CardType = reader.ReadByte(); //房卡类型0/无人1/有人2/客人3/经理4/服务员
var Door = reader.ReadBoolean(); //门磁开关1/开2/关
var ElecQty = reader.ReadUInt16(); //门锁电量单位MV
var HostTemp = reader.ReadByte(); //主机温度
//空调数量现在不关心
//空调数量默认0新的回路方式此处无用兼容老版本
int airConditionNumber = reader.ReadByte();
for (int i = 0; i < airConditionNumber; i++)
{
byte airNo = reader.ReadByte();
}
//现在设备数量只关心
//门磁
//红外 雷达 取电 断电 离线 在线
//设备状态数量,包含所有回路状态
int deviceNumber = reader.ReadByte();
List<DeviceTemp> DevicetempList = new List<DeviceTemp>();
List<string> = new List<string>();
.Add("服务信息");
long originalPosition = reader.BaseStream.Position;
//那究竟哪些是门磁,哪些是红外
for (int i = 0; i < deviceNumber; i++)
{
try
{
var deviceAddress = reader.ReadBytes(4);
var Status = reader.ReadUInt16();
originalPosition = reader.BaseStream.Position;
string RoomTypeID = await (RoomNumber, HotelCode);
List<DeviceInfo> QQQ3 = await (HotelCode, RoomTypeID);
string AddressStr = "";
if (deviceAddress[0] == 0x00)//指令场景地址
{
AddressStr = string.Format("{0}.{1}.{2}", deviceAddress[1], deviceAddress[2], deviceAddress[3]);
}
else
{
ushort type = BitConverter.ToUInt16(deviceAddress, 2);
AddressStr = string.Format("{0:000}{1:000}{2:000}", deviceAddress[0], deviceAddress[1], type);
}
DeviceTemp d = new DeviceTemp();
d.Address = AddressStr;
d.Status = Status;
DevicetempList.Add(d);
//获取监控的列表
foreach (string item in )
{
//从房型回路信息中查找
var LLL1 = QQQ3.Where(A => A.TypeName.Equals(item)).Select(A => new { A.ModalAddress, A.Name });
var bf = LLL1.Where(A => A.ModalAddress.Equals(AddressStr)).ToList();
if (bf.Count > 0)
{
var dname = bf.FirstOrDefault()?.Name;
DeviceStatusData n = new DeviceStatusData() { Address = AddressStr, Status = Status, DeviceType = item, DeviceName = dname };
if (l.TryGetValue(AddressStr, out DeviceStatusData VVV))
{
l[AddressStr] = n;
}
else
{
l.Add(AddressStr, n);
}
}
}
}
catch (Exception)
{
// 发生异常时回退到原始位置
reader.BaseStream.Position = originalPosition;
}
}
////故障数量默认0
//int faultNumber = reader.ReadByte();
//for (int i = 0; i < faultNumber; i++)
//{
//}
if (HotelCode.Equals("1197"))
{
string UKey = string.Format("TianMaoCUID:{0}", RoomNumber);
//WoDeTianMao = "2a54da28396f4b6fb280f6a7f2d0dc25&1018";
WoDeTianMao = Configuration[UKey];
Qingao q1 = new Qingao();
q1.CurrentTime = DateTime.Now;
q1.HotelCode = HotelCode;
q1.RoomNumber = RoomNumber;
//Console.WriteLine("TianMaoCUID:" + WoDeTianMao);
if (DevicetempList.All(A => A.Address.StartsWith("004000")))
{
//这个是定期上报,触发数据读写,但是不触发欢迎词
if (deviceNumber == 5 || deviceNumber == 6)
{
var QQQ = DevicetempList.FirstOrDefault(A => A.Address.Equals("004000001"));
q1.IsTriggerWelcomeMsg = false;
if (QQQ != null)
{
q1.TakeCardStatus = QQQ.Status.ToString();
}
_logger.Error("1197收到定期上报的数据:" + RoomNumber);
}
}
else
{
_logger.Error("1197收到上报的数据:" + RoomNumber + " 天猫CUID: " + WoDeTianMao);
if (!string.IsNullOrEmpty(WoDeTianMao))
{
string ReallyCUID = WoDeTianMao.Split('&')[0];
string RoomNo_T = WoDeTianMao.Split('&')[1];
var QQQ = DevicetempList.FirstOrDefault(A => A.Address.Equals("004000001"));
//这个是取电开关数据
if (QQQ != null)
{
_logger.Error("收到取电上报数据:" + RoomNumber + " 地址:" + QQQ.Address + " 状态:" + QQQ.Status);
q1.TakeCardStatus = QQQ.Status.ToString();
if (QQQ.Status == 1)
{
q1.IsTriggerWelcomeMsg = true;
PostWebRequestToTianMao(RoomNo_T, ReallyCUID);
}
//string KKK = HotelCode + "_" + RoomNumber + "_" + QQQ.Address;
//var PPP = CSRedisCacheHelper.Get<DeviceTemp>(KKK);
//if (PPP != null)
//{
// ushort TakeOutStatus = PPP.Status;
// //如果原来是2现在是1 就触发欢迎词
// if (TakeOutStatus == 2)
// {
// if (QQQ.Status == 1)
// {
// PostWebRequestToTianMao(RoomNumber, t.TianMao);
// }
// }
// CSRedisCacheHelper.Set<DeviceTemp>(KKK, QQQ);
//}
//else
//{
// CSRedisCacheHelper.Set<DeviceTemp>(KKK, QQQ);
//}
}
}
}
if (!string.IsNullOrEmpty(q1.TakeCardStatus))
{
dbcontext.Qingaos.Add(q1);
await dbcontext.SaveChangesAsync();
}
}
}
}
catch (Exception ex)
{
var G = Tools.ByteToString(bbbfff);
Console.WriteLine("解析数据出错了: " + System.Text.Json.JsonSerializer.Serialize(G));
Console.WriteLine(ex.StackTrace);
}
var ll = l.Values.ToList();
return System.Text.Json.JsonSerializer.Serialize(ll);
}
private const string apiURL = "http://pms.boonlive-rcu.com:90";
private const string accessKeyId = "5d36d736c7866d47600d87d6a881adaa";
private const string accessKeySecret = "b4f94f725b2417dfbc4703dd457087f9";
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
public static void PostWebRequestToTianMao(string roomNumber, string tiaomaocuid)
{
//2a54da28396f4b6fb280f6a7f2d0dc25&7001
try
{
var options = new RestClientOptions(apiURL);
var client = new RestClient(options);
Dictionary<string, string> d1 = new Dictionary<string, string>();
d1.Add("HotelId", tiaomaocuid);
d1.Add("RoomNo", roomNumber);
d1.Add("WelcomeText", "贵宾,您好! 欢迎光临青澳国际酒店,我是您的智能语音助手:天猫精灵。调节房间开关是我的特长,您只需要呼叫:天猫精灵,并发出指令,我就可以为您调节室内温度、开关空调、电视、灯光、窗帘等,我很乐意为您提供帮助,期待与您一起度过一段美妙的时光,再见!");
string jsonData = System.Text.Json.JsonSerializer.Serialize(d1);
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("accessKeyId", accessKeyId);
dic.Add("accessKeySecret", accessKeySecret);
dic.Add("jsonData", jsonData);
var request = new RestRequest("/home/PushWelcome");
//request.AddHeader("Content-Type", "application/json");
var data = System.Text.Json.JsonSerializer.Serialize(dic);
request.AddJsonBody(dic);
//request.AddStringBody(data, DataFormat.Json);
RestResponse response = client.Post(request);
string? hotellist = response.Content;
Console.WriteLine(hotellist);
}
catch (Exception ex)
{
_logger.Error("");
}
}
public static void PostWebRequestToTianMaoOld(string method, string jsonData)
{
try
{
string result = PostWebRequest(apiURL + method,
Newtonsoft.Json.JsonConvert.SerializeObject(new
{
accessKeyId = accessKeyId,
accessKeySecret = accessKeySecret,
jsonData = jsonData
}));
}
catch (Exception ex)
{
}
}
public static string PostWebRequest(string url, string postData)
{
string result = string.Empty;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/json";
byte[] data = Encoding.UTF8.GetBytes(postData);
req.ContentLength = data.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
}
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
using (Stream stream = resp.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();//获取响应内容
}
}
return result;
}
}
public record DeviceTemp
{
public string Address { get; set; }
public ushort Status { get; set; }
}
}

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<PublishDir>bin\Release\net8.0\publish\win-x64\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<_TargetId>Folder</_TargetId>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>
<PublishReadyToRun>false</PublishReadyToRun>
<PublishTrimmed>false</PublishTrimmed>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<History>True|2025-11-04T11:06:18.9002195Z||;True|2025-11-04T19:05:51.2405850+08:00||;True|2025-11-03T20:13:22.1932631+08:00||;True|2025-09-11T14:20:42.1302268+08:00||;True|2025-09-10T17:17:09.2739326+08:00||;True|2025-09-10T17:08:31.5569167+08:00||;True|2025-09-10T16:41:46.9112811+08:00||;True|2025-09-10T16:20:40.1009846+08:00||;True|2025-09-10T16:11:12.1433165+08:00||;True|2025-09-10T16:10:48.6038183+08:00||;True|2025-09-10T16:07:28.3396370+08:00||;True|2025-09-10T16:00:05.7526799+08:00||;True|2025-09-10T15:58:09.8746067+08:00||;True|2025-09-10T15:57:56.8297653+08:00||;True|2025-07-28T16:21:10.8649644+08:00||;True|2025-07-16T14:12:27.9930991+08:00||;True|2025-07-16T13:46:08.4970137+08:00||;True|2025-07-16T10:37:44.2475360+08:00||;True|2025-07-16T10:24:29.2909172+08:00||;True|2025-07-16T10:21:25.9594513+08:00||;True|2025-07-16T10:11:20.7388389+08:00||;True|2025-07-16T10:03:48.3582870+08:00||;True|2025-07-16T10:00:21.9834347+08:00||;True|2025-07-16T09:59:56.7051258+08:00||;True|2025-07-16T09:59:34.5912181+08:00||;True|2025-07-16T09:57:23.0363480+08:00||;True|2025-07-16T09:48:31.2376825+08:00||;True|2025-07-16T09:14:24.2060906+08:00||;True|2025-07-16T09:14:11.1880969+08:00||;True|2025-07-16T09:10:09.8120587+08:00||;True|2025-07-16T09:06:54.3118239+08:00||;True|2025-07-16T09:06:46.1084131+08:00||;True|2025-07-16T09:01:49.5359062+08:00||;True|2025-07-16T09:00:55.6730546+08:00||;True|2025-07-16T08:58:14.9295082+08:00||;True|2025-07-09T16:13:41.0527242+08:00||;True|2025-06-18T14:30:55.2321064+08:00||;True|2025-06-17T19:57:50.2381939+08:00||;True|2025-06-17T19:55:28.1677076+08:00||;True|2025-06-17T19:54:36.2060636+08:00||;True|2025-06-17T19:51:56.9458374+08:00||;True|2025-06-17T19:48:39.1709895+08:00||;True|2025-06-17T17:27:38.0304812+08:00||;True|2025-06-17T17:26:35.4642304+08:00||;True|2025-06-17T17:21:58.1428000+08:00||;True|2025-06-17T16:22:14.4953962+08:00||;True|2025-06-17T16:20:42.1308664+08:00||;True|2025-06-17T16:09:47.0298574+08:00||;True|2025-06-17T16:08:17.5346187+08:00||;True|2025-06-17T16:05:06.3188068+08:00||;True|2025-06-17T15:56:12.6355499+08:00||;True|2025-06-17T15:54:47.1204334+08:00||;True|2025-06-17T15:50:06.6208615+08:00||;True|2025-06-17T15:44:40.6005489+08:00||;True|2025-06-17T15:39:18.1282195+08:00||;True|2025-06-17T15:32:44.0369092+08:00||;True|2025-06-17T15:25:47.1770835+08:00||;True|2025-06-17T15:20:37.2930604+08:00||;True|2025-06-17T15:14:55.2290167+08:00||;True|2025-06-16T18:00:44.7869573+08:00||;True|2025-06-16T16:29:10.6770377+08:00||;True|2025-06-16T13:43:53.7959568+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

114
MQTTSub/appsettings.json Normal file
View File

@@ -0,0 +1,114 @@
{
"WelComeMessage": {
},
"TianMaoCUID": {
"1018": "2a54da28396f4b6fb280f6a7f2d0dc25&1018",
"1588": "2a54da28396f4b6fb280f6a7f2d0dc25&1588",
"1566": "2a54da28396f4b6fb280f6a7f2d0dc25&1566",
"1526": "2a54da28396f4b6fb280f6a7f2d0dc25&1526",
"1522": "2a54da28396f4b6fb280f6a7f2d0dc25&1522",
"1520": "2a54da28396f4b6fb280f6a7f2d0dc25&1520",
"1518": "2a54da28396f4b6fb280f6a7f2d0dc25&1518",
"1516": "2a54da28396f4b6fb280f6a7f2d0dc25&1516",
"1512": "2a54da28396f4b6fb280f6a7f2d0dc25&1512",
"1510": "2a54da28396f4b6fb280f6a7f2d0dc25&1510",
"1508": "2a54da28396f4b6fb280f6a7f2d0dc25&1508",
"1506": "2a54da28396f4b6fb280f6a7f2d0dc25&1506",
"1502": "2a54da28396f4b6fb280f6a7f2d0dc25&1502",
"3333": "2a54da28396f4b6fb280f6a7f2d0dc25&3333",
"1320": "2a54da28396f4b6fb280f6a7f2d0dc25&1320",
"1318": "2a54da28396f4b6fb280f6a7f2d0dc25&1318",
"1316": "2a54da28396f4b6fb280f6a7f2d0dc25&1316",
"1315": "2a54da28396f4b6fb280f6a7f2d0dc25&1315",
"1313": "2a54da28396f4b6fb280f6a7f2d0dc25&1313",
"1312": "2a54da28396f4b6fb280f6a7f2d0dc25&1312",
"1311": "2a54da28396f4b6fb280f6a7f2d0dc25&1311",
"1309": "2a54da28396f4b6fb280f6a7f2d0dc25&1309",
"1307": "2a54da28396f4b6fb280f6a7f2d0dc25&1307",
"1305": "2a54da28396f4b6fb280f6a7f2d0dc25&1305",
"1303": "2a54da28396f4b6fb280f6a7f2d0dc25&1303",
"1301": "2a54da28396f4b6fb280f6a7f2d0dc25&1301",
"5555": "2a54da28396f4b6fb280f6a7f2d0dc25&5555",
"1220": "2a54da28396f4b6fb280f6a7f2d0dc25&1220",
"1218": "2a54da28396f4b6fb280f6a7f2d0dc25&1218",
"1216": "2a54da28396f4b6fb280f6a7f2d0dc25&1216",
"1215": "2a54da28396f4b6fb280f6a7f2d0dc25&1215",
"1213": "2a54da28396f4b6fb280f6a7f2d0dc25&1213",
"1212": "2a54da28396f4b6fb280f6a7f2d0dc25&1212",
"1211": "2a54da28396f4b6fb280f6a7f2d0dc25&1211",
"1209": "2a54da28396f4b6fb280f6a7f2d0dc25&1209",
"1207": "2a54da28396f4b6fb280f6a7f2d0dc25&1207",
"1205": "2a54da28396f4b6fb280f6a7f2d0dc25&1205",
"1203": "2a54da28396f4b6fb280f6a7f2d0dc25&1203",
"1201": "2a54da28396f4b6fb280f6a7f2d0dc25&1201",
"1123": "2a54da28396f4b6fb280f6a7f2d0dc25&1123",
"1120": "2a54da28396f4b6fb280f6a7f2d0dc25&1120",
"1118": "2a54da28396f4b6fb280f6a7f2d0dc25&1118",
"1117": "2a54da28396f4b6fb280f6a7f2d0dc25&1117",
"1116": "2a54da28396f4b6fb280f6a7f2d0dc25&1116",
"1115": "2a54da28396f4b6fb280f6a7f2d0dc25&1115",
"1113": "2a54da28396f4b6fb280f6a7f2d0dc25&1113",
"1112": "2a54da28396f4b6fb280f6a7f2d0dc25&1112",
"1109": "2a54da28396f4b6fb280f6a7f2d0dc25&1109",
"1107": "2a54da28396f4b6fb280f6a7f2d0dc25&1107",
"1105": "2a54da28396f4b6fb280f6a7f2d0dc25&1105",
"1103": "2a54da28396f4b6fb280f6a7f2d0dc25&1103",
"1101": "2a54da28396f4b6fb280f6a7f2d0dc25&1101",
"1023": "2a54da28396f4b6fb280f6a7f2d0dc25&1023",
"1020": "2a54da28396f4b6fb280f6a7f2d0dc25&1020",
"1016": "2a54da28396f4b6fb280f6a7f2d0dc25&1016",
"1015": "2a54da28396f4b6fb280f6a7f2d0dc25&1015",
"1013": "2a54da28396f4b6fb280f6a7f2d0dc25&1013",
"1012": "2a54da28396f4b6fb280f6a7f2d0dc25&1012",
"1011": "2a54da28396f4b6fb280f6a7f2d0dc25&1011",
"1009": "2a54da28396f4b6fb280f6a7f2d0dc25&1009",
"1007": "2a54da28396f4b6fb280f6a7f2d0dc25&1007",
"1005": "2a54da28396f4b6fb280f6a7f2d0dc25&1005",
"1003": "2a54da28396f4b6fb280f6a7f2d0dc25&1003",
"1001": "2a54da28396f4b6fb280f6a7f2d0dc25&1001",
"1919": "2a54da28396f4b6fb280f6a7f2d0dc25&1919",
"9018": "2a54da28396f4b6fb280f6a7f2d0dc25&9018",
"9016": "2a54da28396f4b6fb280f6a7f2d0dc25&9016",
"9015": "2a54da28396f4b6fb280f6a7f2d0dc25&9015",
"9013": "2a54da28396f4b6fb280f6a7f2d0dc25&9013",
"9012": "2a54da28396f4b6fb280f6a7f2d0dc25&9012",
"9011": "2a54da28396f4b6fb280f6a7f2d0dc25&9011",
"9010": "2a54da28396f4b6fb280f6a7f2d0dc25&9010",
"9009": "2a54da28396f4b6fb280f6a7f2d0dc25&9009",
"9007": "2a54da28396f4b6fb280f6a7f2d0dc25&9007",
"9005": "2a54da28396f4b6fb280f6a7f2d0dc25&9005",
"9003": "2a54da28396f4b6fb280f6a7f2d0dc25&9003",
"9001": "2a54da28396f4b6fb280f6a7f2d0dc25&9001",
"1818": "2a54da28396f4b6fb280f6a7f2d0dc25&1818",
"8018": "2a54da28396f4b6fb280f6a7f2d0dc25&8018",
"8016": "2a54da28396f4b6fb280f6a7f2d0dc25&8016",
"8015": "2a54da28396f4b6fb280f6a7f2d0dc25&8015",
"8013": "2a54da28396f4b6fb280f6a7f2d0dc25&8013",
"8012": "2a54da28396f4b6fb280f6a7f2d0dc25&8012",
"8011": "2a54da28396f4b6fb280f6a7f2d0dc25&8011",
"8010": "2a54da28396f4b6fb280f6a7f2d0dc25&8010",
"8009": "2a54da28396f4b6fb280f6a7f2d0dc25&8009",
"8007": "2a54da28396f4b6fb280f6a7f2d0dc25&8007",
"8005": "2a54da28396f4b6fb280f6a7f2d0dc25&8005",
"8003": "2a54da28396f4b6fb280f6a7f2d0dc25&8003",
"8001": "2a54da28396f4b6fb280f6a7f2d0dc25&8001",
"6666": "2a54da28396f4b6fb280f6a7f2d0dc25&6666",
"7018": "2a54da28396f4b6fb280f6a7f2d0dc25&7018",
"7016": "2a54da28396f4b6fb280f6a7f2d0dc25&7016",
"7015": "2a54da28396f4b6fb280f6a7f2d0dc25&7015",
"7013": "2a54da28396f4b6fb280f6a7f2d0dc25&7013",
"7012": "2a54da28396f4b6fb280f6a7f2d0dc25&7012",
"7011": "2a54da28396f4b6fb280f6a7f2d0dc25&7011",
"7010": "2a54da28396f4b6fb280f6a7f2d0dc25&7010",
"7009": "2a54da28396f4b6fb280f6a7f2d0dc25&7009",
"7007": "2a54da28396f4b6fb280f6a7f2d0dc25&7007",
"7005": "2a54da28396f4b6fb280f6a7f2d0dc25&7005",
"7003": "2a54da28396f4b6fb280f6a7f2d0dc25&7003",
"7001": "2a54da28396f4b6fb280f6a7f2d0dc25&7001"
},
"ConnectionStrings": {
"DefaultConnection": "Server=10.8.8.212;Database=postgres;user id=postgres;password=123456;port=16035;"
}
}

35
MQTTSub/nlog.config Normal file
View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- enable asp.net core layout renderers -->
<targets>
<!--项目日志保存文件路径说明fileName="${basedir}/保存目录,以年月日的格式创建/${shortdate}/${记录器名称}-${单级记录}-${shortdate}.txt"-->
<target name="info_file" xsi:type="File"
fileName="${basedir}/Logs/${shortdate}/info_${shortdate}.txt"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString} ${newline} ${stacktrace} ${newline}"
archiveFileName="${basedir}/archives/info_${shortdate}-{#####}.txt"
archiveAboveSize="102400"
archiveNumbering="Sequence"
concurrentWrites="true"
keepFileOpen="false" />
<target name="error_file" xsi:type="File"
fileName="${basedir}/Logs/${shortdate}/error_${shortdate}.txt"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString} ${newline} ${stacktrace} ${newline}"
archiveFileName="${basedir}/archives/error_${shortdate}-{#####}.txt"
archiveAboveSize="102400"
archiveNumbering="Sequence"
concurrentWrites="true"
keepFileOpen="false" />
</targets>
<!--规则配置,final - 最终规则匹配后不处理任何规则-->
<!--规则配置,final - 最终规则匹配后不处理任何规则-->
<!--定义使用哪个target输出-->
<rules>
<!-- 优先级从高到低依次为OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL -->
<!-- 将所有日志输出到文件 -->
<logger name="*" minlevel="FATAL" maxlevel="FATAL" writeTo="info_file" />
<logger name="*" minlevel="Error" writeTo="error_file" />
</rules>
</nlog>