using Nirvana.Common; using Nirvana.Data; using Senparc.Weixin.MP.AdvancedAPIs; using Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage; using Senparc.Weixin.MP.Containers; using Senparc.Weixin.Open.Containers; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using YBDevice.Entity; using YBDevice.NApi.DBServices; namespace YBDevice.NApi { /// /// 八电极处理接口 /// public partial class BodyApp : Repository { 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 static 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(); int len = resultByte.Count();//数据总长度 //长度格式是否正确,固定长度为36位 if(len !=36) { 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 != "AA") { return dto; } dto.ischecked = true; string tmpstr = ""; for(int j = 1; j < datalen; j++) { tmpstr += databyte[j].ByteToHexStr(); if(j == 3) { dto.Weight = tmpstr.HexToDesc(); tmpstr = ""; } if(j == 5) { dto.lefthandimp = tmpstr.HexToDesc(); tmpstr = ""; } if(j == 7) { dto.righthandimp = tmpstr.HexToDesc(); tmpstr = ""; } if(j == 9) { dto.leftfootimp = tmpstr.HexToDesc(); tmpstr = ""; } if(j == 11) { dto.rightfootimp = tmpstr.HexToDesc(); tmpstr = ""; } if(j == 13) { dto.bodyimp = tmpstr.HexToDesc(); tmpstr = ""; } if(j == 15) { dto.height = tmpstr.HexToDesc(); tmpstr = ""; } } return dto; } /// /// 处理wifi模块发送过来的数据 /// /// /// public async Task HandlerBodyDataAsync(BodyRequstDto data) { var result = AnalyProto(data); if (!result.ischecked) { return -1; } using (var dbClient = ReadDbContext.GetInstance()) { //检查设备是否存在 if(!await dbClient.Queryable().AnyAsync(x=>x.Ecode == result.sn)) { new LoggerApp().InsertErrorLog($"八电极wifi结果推送,设备未找到,参数:{result.ToJson()}", 3); return -1; } //获取设备绑定的用户列表 var list = await dbClient.Queryable().Where(x => x.DevCode == result.sn && x.Subscribe == 1).ToListAsync(); if(list.Count == 0) { new LoggerApp().InsertErrorLog($"八电极wifi结果推送,未绑定用户或均已取关,参数:{result.ToJson()}", 3); return -1; } //发送模版消息 var tpldata = new { first = new TemplateDataItem($"收到新的测量结果"), keyword1 = new TemplateDataItem($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}"), keyword2 = new TemplateDataItem($"{result.height}"), keyword3 = new TemplateDataItem($"{result.Weight}"), keyword4 = new TemplateDataItem($"{result.lefthandimp},{result.righthandimp},{result.leftfootimp},{result.rightfootimp},{result.bodyimp}"), remark = new TemplateDataItem($"{result.sn}") }; var token = AuthorizerContainer.TryGetAuthorizerAccessToken(component_AppId, "wxda671f842dfda2b8"); string url = $"https://ybapi.ybhdmob.com/qr/br?d={result.sn}|{result.Weight}|{result.height}|{result.lefthandimp}|{result.righthandimp}|{result.leftfootimp}|{result.rightfootimp}|{result.bodyimp}"; list.ForEach(x => { SendTemplateMessageResult results = TemplateApi.SendTemplateMessage(token, x.OpenId, "0P6GebIlc5vjYJnO272DNt94VS1SDqxDxRgNzAQTmDA", url, tpldata); //记录发送结果 new LoggerApp().InsertErrorLog($"八电极wifi结果推送,模版消息推送,参数:{result.ToJson()}\r\n结果:{results.ToJson()}", 3); }); return 0; } } } }