lixiaojun
2024-09-09 c0f3c3f170846197d8d3f74ac123e0ac93a6dd67
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
using System.Collections.Generic;
using System.Text;
 
namespace IStation.Server
{
    /// <summary>
    /// 接收信息辅助类
    /// </summary>
    internal class RequestReceivedHelper
    {
 
        //接收数据
        public static async ValueTask Receive(IAppSession session, PackageInfo packageInfo)
        {
            await Task.Run(() =>
            {
                try
                {
                    var mySession = (MySession)session;
                    var allBytes = packageInfo.Body;
                    LogHelper.Info($" {mySession.SessionName}接收到数据:{BitTransfer.ToString(allBytes)}!");
 
                    var prefix = ParsePrefix(allBytes);
                    if (prefix != ConfigHelper.Prefix)
                    {
                        LogHelper.Info($"收到一条无法识别的数据:{Encoding.Unicode.GetString(allBytes)}!");
                        return;
                    }
                    mySession.Send("OK"); //前缀认证成功 返回 “OK”
 
                    // 解析数据,每64个字节为一帧数据
                    var preLength = 9;
                    var dataCount = 64;
                    var totalCount = (allBytes.Length - preLength) / dataCount;
 
                    for (int i = 0; i < totalCount; i++)
                    {
                        var bytes = allBytes.Skip(preLength + (i * dataCount)).Take(dataCount).ToArray();
                        var model = HandleData(bytes);
                        if (model != null)
                        {
                            var bol = TransferHelper.Transfer(model);
                            if (bol)
                            {
                                LogHelper.Info($"{model.RegisterCode},成功插入{model.RecordList.Count}条数据!");
                            }
                            else
                            {
                                LogHelper.Info($"{model.RegisterCode},插入{model.RecordList.Count} 条数据失败!");
                            }
                            Thread.Sleep(1000);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex.Message);
                }
 
            });
 
        }
 
 
        #region 处理数据
 
        /// <summary>
        /// 处理数据
        /// </summary>
        /// <param name="bytes">64字节</param>
        /// <returns></returns>
        private static StandardModel HandleData(byte[] bytes)
        {
            var dataTime = ParseTime(bytes);
            if (!dataTime.HasValue)
            {
                return default;
            }
            var code = ParseCode(bytes);
 
            var model = new StandardModel();
            model.RegisterCode = code.ToString();
            model.RecordList = new List<StandardRecord>();
 
            var value瞬时流量 = Parse瞬时流量(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "瞬时流量",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value瞬时流量.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value瞬时压力 = Parse瞬时压力(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "瞬时压力",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value瞬时压力.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value瞬时流速 = Parse瞬时流速(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "瞬时流速",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value瞬时流速.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value正向累计 = Parse正向累计(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "正向累计",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value正向累计.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value反向累计 = Parse反向累计(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "反向累计",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value反向累计.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value水表电池电量 = Parse水表电池电量(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "水表电池电量",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value水表电池电量.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var valueGPRS电池电量 = ParseGPRS电池电量(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "GPRS电池电量",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=valueGPRS电池电量.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value系统报警 = Parse系统报警(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "系统报警",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value系统报警.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value水表空管报警 = Parse水表空管报警(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "水表空管报警",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value水表空管报警.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value断励磁报警 = Parse断励磁报警(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "断励磁报警",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value断励磁报警.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value流量上限报警 = Parse流量上限报警(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "流量上限报警",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value流量上限报警.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value流量下限报警 = Parse流量下限报警(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "流量下限报警",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value流量下限报警.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value压力上限报警 = Parse压力上限报警(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "压力上限报警",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value压力上限报警.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            var value压力下限报警 = Parse压力下限报警(bytes);
            model.RecordList.Add(new StandardRecord()
            {
                TransferId = "压力下限报警",
                SrcTime = dataTime.Value,
                SubList = new List<StandardSubRecord>() {
                    new StandardSubRecord(){
                        TransferId=string.Empty,
                        SrcValue=value压力下限报警.ToString(),
                        DataStatus=new List<string>()
                    }
                }
            });
 
            return model;
        }
 
        #endregion
 
        #region 解析方法
 
        /// <summary>
        /// 解析前缀
        /// </summary>
        /// <param name="bts">所有字节</param>
        /// <returns></returns>
        private static string ParsePrefix(byte[] bts)
        {
            if (bts == null || bts.Length < 9)
            {
                return string.Empty;
            }
            var btc = bts.Take(6).ToArray();
            return Encoding.ASCII.GetString(btc);
        }
 
        /// <summary>
        /// 解析编码
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static long ParseCode(byte[] bts)
        {
            var btc = bts.Take(4).ToArray();
            return Bytes2Int32(btc);
        }
 
        /// <summary>
        /// 解析时间
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static DateTime? ParseTime(byte[] bts)
        {
 
            try
            {
                DateTime? dt = null;
                var dateInt = Bytes2Int32(bts.Skip(4).Take(4).ToArray());
                var hmsInt = Bytes2Int32(bts.Skip(8).Take(4).ToArray());
                var hmsStr = hmsInt.ToString();
                if (hmsStr.Length < 3)
                {
                    hmsStr = "0000" + hmsStr;
                }
                if (hmsStr.Length < 5)
                {
                    hmsStr = "00" + hmsStr;
                }
                if (hmsStr.Length < 6)
                {
                    hmsStr = "0" + hmsStr;
                }
                var hms = hmsStr.Substring(0, 2) + ":" + hmsStr.Substring(2, 2) + ":" + hmsStr.Substring(4, 2);
                var date = DateTime.ParseExact(dateInt.ToString(), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
                var time = $"{date:d} {hms}";
                dt = Convert.ToDateTime(time);
                return dt;
            }
            catch (Exception ex)
            {
                LogHelper.Error($"时间解析:{ex.Message}");
                return default;
            }
        }
 
        /// <summary>
        /// 解析瞬时流量
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static double Parse瞬时流量(byte[] bts)
        {
            var btc = bts.Skip(12).Take(4).ToArray();
            return Bytes2Single(btc);
        }
 
        /// <summary>
        /// 解析瞬时压力
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static double Parse瞬时压力(byte[] bts)
        {
            var btc = bts.Skip(16).Take(4).ToArray();
            return Bytes2Single(btc);
        }
 
        /// <summary>
        /// 解析瞬时流速
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static double Parse瞬时流速(byte[] bts)
        {
            var btc = bts.Skip(20).Take(4).ToArray();
            return Bytes2Single(btc);
        }
 
        /// <summary>
        /// 解析正向累计
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static double Parse正向累计(byte[] bts)
        {
            var btc1 = bts.Skip(24).Take(4).ToArray();
            var value1 = Bytes2Int32(btc1);
            var btc2 = bts.Skip(32).Take(2).ToArray();
            var value2 = Bytes2Int16(btc2) / 1000f;
            return value1 + value2;
        }
 
        /// <summary>
        /// 解析反向累计
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static double Parse反向累计(byte[] bts)
        {
            var btc1 = bts.Skip(28).Take(4).ToArray();
            var value1 = Bytes2Int32(btc1);
            var btc2 = bts.Skip(34).Take(2).ToArray();
            var value2 = Bytes2Int16(btc2) / 1000f;
            return value1 + value2;
        }
 
        /// <summary>
        /// 解析水表电池电量
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int Parse水表电池电量(byte[] bts)
        {
            var btc = bts.Skip(36).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
        /// <summary>
        /// 解析GPRS电池电量
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int ParseGPRS电池电量(byte[] bts)
        {
            var btc = bts.Skip(37).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
        /// <summary>
        /// 解析系统报警
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int Parse系统报警(byte[] bts)
        {
            var btc = bts.Skip(38).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
        /// <summary>
        /// 解析水表空管报警
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int Parse水表空管报警(byte[] bts)
        {
            var btc = bts.Skip(39).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
        /// <summary>
        /// 解析断励磁报警
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int Parse断励磁报警(byte[] bts)
        {
            var btc = bts.Skip(40).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
        /// <summary>
        /// 解析流量上限报警
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int Parse流量上限报警(byte[] bts)
        {
            var btc = bts.Skip(41).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
        /// <summary>
        /// 解析流量下限报警
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int Parse流量下限报警(byte[] bts)
        {
            var btc = bts.Skip(42).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
        /// <summary>
        /// 解析压力上限报警
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int Parse压力上限报警(byte[] bts)
        {
            var btc = bts.Skip(43).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
        /// <summary>
        /// 解析压力下限报警
        /// </summary>
        /// <param name="bts">64字节</param>
        /// <returns></returns>
        private static int Parse压力下限报警(byte[] bts)
        {
            var btc = bts.Skip(44).Take(1).ToArray();
            return Bytes2Int8(btc);
        }
 
 
        #endregion
 
        #region  字节转化方法
 
        private static int Bytes2Int8(byte[] bts)
        {
            var btc = new byte[] { bts[0], 00 };
            return BitConverter.ToInt16(btc);
        }
 
        private static int Bytes2Int32(byte[] bts)
        {
            return BitConverter.ToInt32(bts);
        }
 
        private static int Bytes2Int16(byte[] bts)
        {
            return BitConverter.ToInt16(bts);
        }
 
        private static double Bytes2Single(byte[] bts)
        {
            return BitConverter.ToSingle(bts);
        }
 
 
        #endregion
 
 
 
 
 
    }
}