MeiRiYiCheng_1_old/YBDevice.NApi.Application/BodyInfo/BodyService.cs

380 lines
15 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using DotNetCore.CAP;
using Furion.DependencyInjection;
using Furion.DistributedIDGenerator;
using Microsoft.Extensions.Caching.Distributed;
using Nirvana.Common;
using Senparc.Weixin.MP.AdvancedAPIs;
using Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage;
using Senparc.Weixin.Open.Containers;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YBDevice.Core;
using YBDevice.Entity;
namespace YBDevice.NApi.Application.BodyInfo
{
/// <summary>
/// 八电极处理接口
/// </summary>
public class BodyService : IBodyService, ITransient
{
public string component_AppId = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Appid;
public string component_Secret = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Secret;
public string component_Token = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Token;
public string component_EncodingAESKey = Senparc.Weixin.Config.SenparcWeixinSetting.Component_EncodingAESKey;
private readonly ISqlSugarRepository<YB_WifiBind> repository;
private readonly SqlSugarClient dbClient;
private readonly ILoggerService _loggerService;
private readonly INoticeService _noticeService;
private readonly IDistributedCache _cache;
private readonly ICapPublisher _capBus;
public BodyService(ISqlSugarRepository<YB_WifiBind> sqlSugarRepository, ILoggerService loggerService, INoticeService noticeService, IDistributedCache cache, ICapPublisher capPublisher)
{
repository = sqlSugarRepository;
dbClient = repository.Context;
_loggerService = loggerService;
_noticeService = noticeService;
_cache = cache;
_capBus = capPublisher;
}
/// <summary>
/// 数据包解析
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private BodyAnalyDto AnalyProto(BodyRequstDto data)
{
BodyAnalyDto dto = new BodyAnalyDto();
//检查是否为有效的base64数据
if (!AESEncrypt.IsBase64(data.@params))
{
dto.data = data.@params;
return dto;
}
//数据为base64加密
byte[] resultByte = Convert.FromBase64String(data.@params);
dto.data = resultByte.BytesToHexStr();
_loggerService.AddLogger($"八电极wifi结果推送,解析出的数据:{dto.data}", 2);
int len = resultByte.Count();//数据总长度
//长度格式是否正确,固定长度为36位
if (len < 33)
{
return dto;
}
//前15个字节为sn。中间以 00 分隔。后面为测量结果数据 AA 00 01 F4 00 64 00 64 00 64 00 64 02 30 06 A4 00 00 00 00
int i = 0;
byte[] snbyte = new byte[15];
for (i = 0; i < 15; i++)
{
snbyte[i] = resultByte[i];
}
dto.sn = snbyte.BytesToHexStr().Replace(" ", "");
dto.splitstr = resultByte[i].ByteToHexStr();
int datalen = len - 16;//数据体长度
byte[] databyte = new byte[datalen];
i++;
for (int j = 0; j < datalen; j++)
{
databyte[j] = resultByte[i];
i++;
}
dto.Header = databyte[0].ByteToHexStr();
if (dto.Header != "A1" && dto.Header != "A2") //第一条数据为A1第二条数据为A2
{
return dto;
}
dto.ischecked = true;
string tmpstr = "";
for (int j = 1; j < datalen; j++)
{
tmpstr += databyte[j].ByteToHexStr();
if (dto.Header == "A1")
{
if (j == 3)
{
dto.Weight = tmpstr.HexToDesc();
tmpstr = "";
}
if (j == 7)
{
dto.lefthandimp = tmpstr.HexToDesc();
tmpstr = "";
}
if (j == 11)
{
dto.righthandimp = tmpstr.HexToDesc();
tmpstr = "";
}
if (j == 15)
{
dto.leftfootimp = tmpstr.HexToDesc();
tmpstr = "";
}
}
if (dto.Header == "A2")
{
if (j == 4)
{
dto.rightfootimp = tmpstr.HexToDesc();
tmpstr = "";
}
if (j == 8)
{
dto.bodyimp = tmpstr.HexToDesc();
tmpstr = "";
}
if (j == 10)
{
dto.height = tmpstr.HexToDesc();
tmpstr = "";
}
}
}
return dto;
}
///<summary>
/// 处理wifi模块发送过来的数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public async Task<int> HandlerBodyDataAsync(BodyRequstDto data)
{
//记录发送过来的数据
_loggerService.AddLogger($"八电极发送原始数据,data={data.ToJson()}", 2);
var result = AnalyProto(data);
if (!result.ischecked)
{
return -1;
}
//数据分两条发送,首先保存第一条,然后根据二条的数据间隔进行保存
//保存到redis
var sn = result.sn;
var key = $"YBDeviceCache:Container:{sn}";
if (result.Header == "A1")
{
var param1 = $"{result.ToJson()}";
var param1byte = Encoding.UTF8.GetBytes(param1);
await _cache.SetAsync(key, param1byte, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(5)));
return 0;
}
else
{
var existsbyte = await _cache.GetAsync(key);
if (existsbyte != null && existsbyte.Length > 0)
{
var firstdata = Encoding.UTF8.GetString(existsbyte);
var firstjsondata = firstdata.ToObject<BodyAnalyDto>();
result.Weight = firstjsondata.Weight;
result.lefthandimp = firstjsondata.lefthandimp;
result.righthandimp = firstjsondata.righthandimp;
result.leftfootimp = firstjsondata.leftfootimp;
}
else
{
return -1;
}
}
//检查设备是否存在
var equ = await dbClient.Queryable<YB_Device>().FirstAsync(x => x.Ecode == result.sn);
if (equ == null)
{
_loggerService.AddLogger($"八电极wifi结果推送,设备未找到,参数:{result.ToJson()}", 3);
return -1;
}
//获取设备绑定的用户列表
var list = await dbClient.Queryable<YB_WifiBind>().Where(x => x.DevCode == result.sn && x.Subscribe == 1).ToListAsync();
if (list.Count == 0)
{
_loggerService.AddLogger($"八电极wifi结果推送,未绑定用户或均已取关,参数:{result.ToJson()}", 3);
return -1;
}
//由于传送过来的体重为实际*100,身高为实际*10
decimal weight = (result.Weight * 1.0 / 100.0).ToDecimal();
decimal height = (result.height * 1.0 / 10.0).ToDecimal();
#region
Guid resultid = IDGen.NextID();
await _capBus.PublishAsync("result.service.insertuserresult", new InsertResultDataS2SDto
{
DevId = equ.Id,
IsUserTake = false,
DeviceLastHeartTime = equ.LastHeartTime,
DevType = equ.Type,
BusinessId = equ.BusinessId,
CreateTime = DateTime.Now,
SourceType = 3,
ecode = equ.Ecode,
familyid = 0,
fansid = null,
height = height,
imp = result.bodyimp,
LeftArmImp = result.lefthandimp,
LeftLegImp = result.leftfootimp,
RightArmImp = result.righthandimp,
RightLegImp = result.rightfootimp,
UserId = 0,
weight = weight,
orderid = null,
publicid = "",
ResultId = resultid
});
#endregion
//发送模版消息
decimal mheight = height / 100.0m;
var tpldata = new
{
first = new TemplateDataItem($"收到新的测量结果"),
keyword1 = new TemplateDataItem($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}"),
keyword2 = new TemplateDataItem($"{height}"),
keyword3 = new TemplateDataItem($"{weight}"),
keyword4 = new TemplateDataItem($"{(((weight / (mheight * mheight)) * 10.0m) / 10.0m).ToDecimal(1)}"),
remark = new TemplateDataItem($"点击查看您的测量报告")
};
var token = await AuthorizerContainer.TryGetAuthorizerAccessTokenAsync(component_AppId, "wxda671f842dfda2b8");
string url = $"https://ybapi.ybhdmob.com/body/br?d={result.sn}|{weight}|{height}|{result.lefthandimp}|{result.righthandimp}|{result.leftfootimp}|{result.rightfootimp}|{result.bodyimp}|{resultid}";
foreach (var item in list)
{
SendTemplateMessageResult results = await TemplateApi.SendTemplateMessageAsync(token, item.OpenId, "0P6GebIlc5vjYJnO272DNt94VS1SDqxDxRgNzAQTmDA", url, tpldata);
//记录发送结果
_loggerService.AddLogger($"八电极wifi结果推送,模版消息推送,参数:{result.ToJson()}\r\n结果:{results.ToJson()}", 3);
}
return 0;
}
/// <summary>
/// 处理PCH01W发送过来的数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public async Task<object> Handler01WDataAsync(BodyRequstDto data)
{
var result = AnalyH01WProto(data);
var successdata = Encoding.UTF8.GetBytes("A901019A");
var returndata = new
{
status = "1",
data = Convert.ToBase64String(successdata)
};
if (!result.ischecked)
{
return returndata;
}
//发送模版消息
decimal height = (result.Height * 1.0m) / 10.0m;
decimal weight = (result.Weight * 1.0m) / 10.0m;
var tpldata = new
{
first = new TemplateDataItem($"收到新的测量结果"),
keyword1 = new TemplateDataItem($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}"),
keyword2 = new TemplateDataItem($"{height}CM|{result.imp}Ω"),
keyword3 = new TemplateDataItem($"{weight}斤"),
keyword4 = new TemplateDataItem($"{result.sn}"),
remark = new TemplateDataItem($"点击查看您的测量报告")
};
var token = await AuthorizerContainer.TryGetAuthorizerAccessTokenAsync(component_AppId, "wxda671f842dfda2b8");
var openlist = new List<string>()
{
"o2No269VSmA3C3WNFLDrgc1k2vyo",
"o2No265s2YTuDN4CQwfCcdflk4L0"
};
foreach (var item in openlist)
{
SendTemplateMessageResult results = await TemplateApi.SendTemplateMessageAsync(token, item, "0P6GebIlc5vjYJnO272DNt94VS1SDqxDxRgNzAQTmDA", "", tpldata);
//记录发送结果
_loggerService.AddLogger($"PCH01Wwifi结果推送,模版消息推送,参数:{result.ToJson()}\r\n结果:{results.ToJson()}", 3);
}
return returndata;
}
/// <summary>
/// 解析PCH01W数据包
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private H01WAnalyDto AnalyH01WProto(BodyRequstDto data)
{
_loggerService.AddLogger($"PCH01W发送原始数据,data={data.ToJson()}", 3);
H01WAnalyDto dto = new H01WAnalyDto();
//检查是否为有效的base64数据
if (!AESEncrypt.IsBase64(data.@params))
{
dto.data = data.@params;
return dto;
}
//数据为base64加密
byte[] resultByte = Convert.FromBase64String(data.@params);
dto.data = resultByte.BytesToHexStr();
_loggerService.AddLogger($"PCH01W_wifi结果推送,解析出的数据:{dto.data}", 3);
int len = resultByte.Count();//数据总长度
//长度格式是否正确,固定长度为36位
if (len < 33)
{
return dto;
}
//前15个字节为sn。中间以 00 分隔。后面为测量结果数据 A9 0F 01
int i = 0;
byte[] snbyte = new byte[15];
for (i = 0; i < 15; i++)
{
snbyte[i] = resultByte[i];
}
dto.sn = snbyte.BytesToHexStr().Replace(" ", "");
dto.splitstr = resultByte[i].ByteToHexStr();
int datalen = len - 16;//数据体长度
byte[] databyte = new byte[datalen];
i++;
for (int j = 0; j < datalen; j++)
{
databyte[j] = resultByte[i];
i++;
}
dto.Header = databyte[0].ByteToHexStr();
if (dto.Header != "A9") //数据包头为A9
{
return dto;
}
//检查标志位
var flag = databyte[2].ByteToHexStr();
if (flag != "01")
{
return dto;
}
dto.ischecked = true;
string tmpstr = "";
for (int j = 1; j < datalen; j++)
{
tmpstr += databyte[j].ByteToHexStr();
if (j == 2)
{
tmpstr = "";
}
if (j == 5)
{
dto.Weight = tmpstr.HexToDesc();
tmpstr = "";
}
if (j == 11)
{
tmpstr = "";
}
if (j == 13)
{
dto.Height = tmpstr.HexToDesc();
tmpstr = "";
}
if (j == 15)
{
dto.imp = tmpstr.HexToDesc();
tmpstr = "";
}
}
return dto;
}
}
}