黄学彪
2019-11-20 5174e95a428876018ce3372f3dbc24b2861ea472
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
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using Shared.Phone.UserCenter.Abount;
namespace Shared.Common
{
    public class CommonPage : FrameLayout
    {
        static CommonPage commonPage;
        public static CommonPage Instance
        {
            get
            {
                if (commonPage == null)
                {
                    commonPage = new CommonPage { };
                }
                return commonPage;
            }
        }
 
        /// <summary>
        ///  显示加载界面
        /// </summary>
        public static Loading Loading = new Loading();
        public void Show()
        {
            //if (Application.IsPad)
            //{
            //    Application.DesignWidth = 2048;
            //    Application.DesignHeight = 1536;
            //    Pad.MainPage.Instance .Show();
            // }
            //else
            //{
            Application.DesignWidth = 1080;
            Application.DesignHeight = 1920;
            Application.MainPage.AddChidren(this);
            AddChidren(Phone.UserView.HomePage.Instance);
            Application.MainPage.AddChidren(Loading);
            //}
            Phone.UserView.HomePage.Instance.InitPage();
        }
 
        public static string SoftTitle = "ZigBee";
        /// <summary>
        /// 短信模板编号
        /// </summary>
        public static int SoftSmsType = 0;
        public static string LogoString = @"Logo/Logo.png";
        public static string RegisterLogoString = @"Logo/Register_logo.png";
        public static string RequestHttpsHost = "https://global.hdlcontrol.com/HangZhouHdlCloudApi";
        //public static string RequestHttpsHost = "http://172.16.2.192:13061";
        /// <summary>
        /// 版本号
        /// </summary>
        public static string CodeIDString = "1.0.19111201";
        /// <summary>
        /// 注册来源(0:HDL On 1:Zigbee)
        /// </summary>
        public static int RegisterSoruceFromZIGBEE = 0;
        public static string Source = "ZIGBEE";
        /// <summary>
        /// Company 用户公司用于公司App定制版  默认0
        /// </summary>
        public static int Company = 0;
        /// <summary>
        /// 海外 注册时API调用和国内区分
        ///</summary>
        public static int CompanyForINTERNETION = 4;
        /// <summary>
        /// 请求版本号
        /// </summary>
        public static string RequestVersion = "2.0";
        /// <summary>
        /// 左边距离屏幕的宽度--58
        /// </summary>
        public static int XLeft = 58;
        /// <summary>
        /// button高度--110
        /// </summary>
        public static int ButtonHeight = 110;
        /// <summary>
        /// 使用的语言
        /// </summary>
        public static string ZigBeeLanguage
        {
            get
            {
                return Language.CurrentLanguage;
            }
        }
        /// <summary>
        /// 大控件圆角 --- 10。不是不半圆那种。
        /// </summary>
        public static uint BigFormRadius = 10;
        /// <summary>
        /// 默认手机区号为86中国大陆
        /// </summary>
        public static string PhoneZoneStr = "86";
        /// <summary>
        /// 手机区名称
        /// </summary>
        public static string ZoneNameStr = "中国大陆";
        /// <summary>
        /// 距离顶端高度--80 状态栏高度
        /// </summary>
        public static int NavigationTitle_Y = 80;
        /// <summary>
        /// 行高--180
        /// </summary>
        public static int RowHeight = 180;
        /// <summary>
        /// APP宽度 -- 1080
        /// </summary>
        public static int AppRealWidth = 1080;
        /// <summary>
        /// APP高度 -- 1920
        /// </summary>
        public static int AppRealHeight = 1920;
        /// <summary>
        /// 返回键距离左边的距离 30
        /// </summary>
        public static int Navigation_X = 30;
        /// <summary>
        /// 导航栏高度-220
        /// </summary>
        public static int Navigation_Height = 220;
        /// <summary>
        /// 底边栏高度
        /// </summary>
        public const int TabbarHeight = 141;
        /// <summary>
        /// 线条的高度--实际像素3
        /// </summary>
        public static int LineHeight = 3;
        /// <summary>
        /// 整个场景延时时间--60秒
        /// </summary>
        public static int SceneDelayTime = 60;
 
        /// <summary>
        /// 间隔多长时间读取设备状态 单位 秒 --默认30
        /// </summary>
        public static int ReadDeviceStatuSpan = 30;
        /// <summary>
        /// 读取多少页--999
        /// </summary>
        public static int PageSize = 999;
 
        /// <summary>
        /// 用于中国大陆验证手机号正则表达式
        /// 等同于--- "^[1]+\\d{10}"
        /// </summary>
        public static string PhoneRegexStr = "^[1]+[0,1,2,3,4,5,6,7,8,9]+\\d{9}";
        /// <summary>
        /// 用于验证非中国大陆手机号正则表达式
        /// </summary>
        public static string PhoneForForeignRegexStr = "^[0-9]*$";
        /// <summary>
        /// 用于验证邮箱正则表达式
        /// </summary>
        public static string EmailRegexStr = "^\\s*([A-Za-z0-9_-]+(\\.\\w+)*@(\\w+\\.)+\\w{2,5})\\s*$";
        /// <summary>
        /// 下载安卓apk的byte长度
        /// </summary>
        public static long ApkBytesTotalLength = 0;
 
        //public static Encoding EncodingUTF8 = Encoding.UTF8;
        //public static Encoding EncodingGB2312 = Encoding.GetEncoding("gb2312");
        public static bool IsRemote = false;
        public static bool FindGateway = false;
        /// <summary>
        /// 当前网络连接的模式  0:没有网络  1:远程连接,也叫3G,4G  2:WIFI
        /// </summary>
        public static int nowNetworkMode = 0;
        /// <summary>
        /// 占位字体大小
        /// 11
        /// </summary>
        public static int PlaceHolderTextSize = 11;
        /// <summary>
        /// 安卓的系统返回按键能否按下(比如在备份还原时,不能按下返回键)
        /// </summary>
        public static bool BackKeyCanClick = true;
 
        /// <summary>
        /// 请求服务器方法
        /// 指定一个Url,和请求方法,数据,Cookie,得到响应的数据
        /// </summary>
        /// <param name="requestUrl">请求Url</param>
        /// <param name="byteData">请求的的数据</param>
        /// <returns>得到响应的数据</returns>
        public async System.Threading.Tasks.Task<Shared.Common.ResponseEntity.ResponsePack> RequestHttpsZigbeeAsync(string requestUrl, byte[] byteData)
        {
            string result = await this.RequestHttpsZigbeeResultAsync(requestUrl, byteData);
            if (result != null)
            {
                try
                {
                    var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.ResponsePack>(result);
                    return data;
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine(ex.Message);
                }
            }
            return null;
        }
 
        /// <summary>
        /// 请求服务器方法
        /// 指定一个Url,和请求方法,数据,Cookie,得到响应的数据
        /// </summary>
        /// <param name="requestUrl">请求Url</param>
        /// <param name="byteData">请求的的数据</param>
        /// <returns>得到响应的数据</returns>
        public async System.Threading.Tasks.Task<string> RequestHttpsZigbeeResultAsync(string requestUrl, byte[] byteData)
        {
            var result = await RequestHttpsZigbeeBytesResultAsync(requestUrl, byteData);
            if (result != null)
            {
                return Encoding.UTF8.GetString(result);
            }
            return null;
        }
 
        /// <summary>
        /// 请求服务器方法
        /// 指定一个Url,和请求方法,数据,Cookie,得到响应的数据
        /// </summary>
        /// <param name="requestUrl">请求Url</param>
        /// <param name="byteData">请求的的数据</param>
        /// <param name="requestMethod">POST 或者 GET 等等</param>
        /// <returns>得到响应的数据</returns>
        public async System.Threading.Tasks.Task<byte[]> RequestHttpsZigbeeBytesResultAsync(string requestUrl, byte[] byteData, string requestMethod = "POST")
        {
            //请求Url的完成路径
            var fullUrl = $"{RequestHttpsHost}/{requestUrl}";
            return await this.DoRequestZigbeeHttpsInterface(fullUrl, byteData, Config.Instance.Token, requestMethod);
        }
 
        /// <summary>
        /// <pra>请求服务器方法,指定一个Url,和请求方法,数据,Cookie,得到响应的数据</pra>
        /// <pra>注意!!此方法仅限【拥有管理员权限的成员】调用</pra>
        /// </summary>
        /// <param name="requestUrl">请求Url</param>
        /// <param name="byteData">请求的的数据</param>
        /// <param name="requestMethod">POST 或者 GET 等等</param>
        /// <returns>得到响应的数据</returns>
        public async System.Threading.Tasks.Task<byte[]> RequestZigbeeHttpsByAdmin(string requestUrl, byte[] byteData, string requestMethod = "POST")
        {
            //请求Url的完成路径
            var fullUrl = $"{Config.Instance.AdminRequestBaseUrl}/{requestUrl}";
            return await this.DoRequestZigbeeHttpsInterface(fullUrl, byteData, Config.Instance.AdminRequestToken, requestMethod);
        }
 
        /// <summary>
        /// 请求服务器方法
        /// 指定一个Url,和请求方法,数据,Cookie,得到响应的数据
        /// </summary>
        /// <param name="requestFullUrl">请求Url的完成路径</param>
        /// <param name="byteData">请求的的数据</param>
        /// <param name="token">token</param>
        /// <param name="requestMethod">POST 或者 GET 等等</param>
        /// <returns>得到响应的数据</returns>
        public async System.Threading.Tasks.Task<byte[]> DoRequestZigbeeHttpsInterface(string requestFullUrl, byte[] byteData, string token, string requestMethod = "POST")
        {
            try
            {
                //初始化新的webRequst
                //1. 创建httpWebRequest对象
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(requestFullUrl));
 
                //2. 初始化HttpWebRequest对象
                webRequest.Method = requestMethod;
                webRequest.Timeout = 10 * 1000;
                webRequest.Headers.Add(HttpRequestHeader.Authorization, token);
                if (requestMethod == "GET")
                {
                    //webRequest.ContentType = "text/html";
                    webRequest.ContentType = "application/json";
                }
                else
                {
                    webRequest.ContentType = "application/json";
                    webRequest.ContentLength = byteData.Length;
 
                    //3. 附加要POST给服务器的数据到HttpWebRequest对象(附加POST数据的过程比较特殊,它并没有提供一个属性给用户存取,需要写入HttpWebRequest对象提供的一个stream里面。)
                    var newStream = webRequest.GetRequestStream();//创建一个Stream,赋值是写入HttpWebRequest对象提供的一个stream里面
                    newStream.Write(byteData, 0, byteData.Length);
                    newStream.Flush();
                    newStream.Close();
                }
 
                //4. 读取服务器的返回信息
                var response = (HttpWebResponse)webRequest.GetResponse();
                using (var stream = response.GetResponseStream())
                {
                    if (stream == null)
                    {
                        return null;
                    }
                    var ms = new MemoryStream();
                    var bytes = new byte[1024];
                    var len = int.MaxValue;
                    while (stream.CanRead && 0 < len)
                    {
                        len = stream.Read(bytes, 0, bytes.Length);
                        ms.Write(bytes, 0, len);
                    }
                    return ms.ToArray();
                }
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.Message);
                return null;
            }
        }
#if iOS
        /// <summary>
        /// 获取iOS-APP版本信息
        /// </summary>
        /// <returns>The https app version async.</returns>
        public async System.Threading.Tasks.Task<ResponseEntity.ResultPack> RequestHttpsiOSAppVersionAsync()
        {
            try
            {
                var webClient = new WebClient { };
                var result = await webClient.DownloadDataTaskAsync("https://itunes.apple.com/lookup?id=1461693569");
                if (result == null)
                {
                    return null;
                }
                return Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseEntity.ResultPack>(Encoding.UTF8.GetString(result));
            }
            catch
            {
                return null;
            }
        }
        /// <summary>
        /// 跳转到APP Store
        /// </summary>
        public void OpenUrl()
        {
            Uri url = new Uri("https://itunes.apple.com/cn/app/hdl-home/id1461693569?mt=8");
            UIKit.UIApplication.SharedApplication.OpenUrl(url);
        }
#elif Android
        /// <summary>
        /// 获取 Android-APP 版本信息
        /// </summary>
        /// <returns>The https app version async.</returns>
        public async System.Threading.Tasks.Task<ResponseEntity.ApkInfoOBJ> RequestHttpsAndroidAppVersionAsync()
        {
            try
            {
                var requestOBJ = new SendDataToServer.GetAndroidApkInfoOBJ
                {
                    Name = "ZigbeeApp",
                    RequestVersion = CodeIDString
                };
                var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(requestOBJ);
                var result = await RequestHttpsZigbeeAsync("FirmwareMana/DetectionPlatformUploadFirmware", System.Text.Encoding.UTF8.GetBytes(requestJson));
                if (result == null)
                {
                    return null;
                }
                if (result.StateCode.ToUpper() == "SUCCESS")
                {
                    if (result.ResponseData == null)
                    {
                        return null;
                    }
 
                    var responeData = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseEntity.ApkInfoRes>(result.ResponseData.ToString());
                    if (responeData == null || responeData.pageData == null || responeData.pageData.Count==0)
                    {
                        return null;
                    }
                    int MaxIndex = 0;
                    int NewVersion = 0;
                    for (int i = 0; i < responeData.pageData.Count; i++)
                    {
                        var apkInfo = responeData.pageData[i];
                        var version = int.Parse(apkInfo.FirmwareVersion.Replace(".", ""));
                        if (version > NewVersion)
                        {
                            NewVersion = version;
                            MaxIndex = i;
                        }
                    }
                    return responeData.pageData[MaxIndex];
                }
                return null;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
 
        /// <summary>
        /// 下载安装apk
        /// </summary>
        /// <returns>The load apk async.</returns>
        /// <param name="requestUrl">请求链接</param>
        /// <param name="byteData">请求参数</param>
        public System.Threading.Tasks.Task<byte[]> DownLoadApkAsync(string requestUrl, byte[] byteData)
        {
            try
            {
                AbountForm.instance.webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
                AbountForm.instance.webClient.Headers.Add(HttpRequestHeader.Authorization, Config.Instance.Token);
                AbountForm.instance.webClient.UploadProgressChanged += Client_DownloadProgressChanged;
                AbountForm.instance.webClient.UploadDataCompleted += Client_UploadCompleted;
                var result = AbountForm.instance.webClient.UploadDataTaskAsync($"{RequestHttpsHost}/{requestUrl}", "POST", byteData);
                if (result == null)
                {
                    return null;
                }
                return result;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
            }
        }
        /// <summary>
        /// apk下载进度
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="e">E.</param>
        void Client_DownloadProgressChanged(object sender, UploadProgressChangedEventArgs e)
        {
            System.Console.WriteLine($"当前进度--{(int)(e.BytesReceived / (float)ApkBytesTotalLength * 100)} % --BytesReceived--{e.BytesReceived}--totalByte{e.TotalBytesToReceive}");
            if (e.BytesReceived <= ApkBytesTotalLength)
            {
                Application.RunOnMainThread(() =>
                {
                    //Loading.Start($"{(int)(e.BytesReceived / (float)ApkBytesTotalLength * 100)} %");
                    AbountForm.instance.seekBar.Progress = (int)(e.BytesReceived / (float)ApkBytesTotalLength * 100);
                    AbountForm.instance.seekBarTitle.Text = $"{(int)(e.BytesReceived / (float)ApkBytesTotalLength * 100)}%";
                });
            }
        }
        void Client_UploadCompleted(object sender, UploadDataCompletedEventArgs e)
        {
            System.Console.WriteLine("下载apk完成");
            //Application.RunOnMainThread(Loading.Hide);
        }
        /// <summary>
        /// 取消下载apk
        /// </summary>
        public static void CancelDownLoadApkAsync()
        {
            AbountForm.instance.webClient?.CancelAsync();
            System.Console.WriteLine("取消下载apk");
        }
 
#endif
        /// <summary>
        /// 服务器获取数据失败提示
        /// </summary>
        public void FailureToServer()
        {
            Application.RunOnMainThread(() =>
            {
                var alert = new Alert(Language.StringByID(R.MyInternationalizationString.TIP), Language.StringByID(R.MyInternationalizationString.RequestServerFailed), Language.StringByID(R.MyInternationalizationString.Confrim));
                alert.Show();
            });
        }
        /// <summary>
        /// 显示错误提示
        /// </summary>
        /// <param name="errorStringID">Error string identifier.</param>
        public void ShowErrorInfoAlert(int errorStringID)
        {
            Application.RunOnMainThread(() =>
            {
                var alert = new Alert(Language.StringByID(R.MyInternationalizationString.TIP), Language.StringByID(errorStringID), Language.StringByID(R.MyInternationalizationString.Confrim));
                alert.Show();
            });
        }
        /// <summary>
        /// Get服务器方法1
        /// </summary>
        public string GetMethod(string requestUrl)
        {
            string requestMethod = "get";
            string urlHead = $"{RequestHttpsHost}/FeerView/";
            string url = urlHead + requestUrl;
            HttpWebRequest httpWebRequestObj = WebRequest.CreateHttp(url);
            httpWebRequestObj.Method = requestMethod;
            using (HttpWebResponse httpWebResponseObj = httpWebRequestObj.GetResponse() as HttpWebResponse)
            {
                if (httpWebResponseObj == null)
                {
                    return null;
                }
                else
                {
                    Stream ResponseStream = httpWebResponseObj.GetResponseStream();
                    using (StreamReader Sr = new StreamReader(ResponseStream))
                    {
                        string responseString = Sr.ReadToEnd();
                        return responseString;
                    }
                }
            }
        }
 
 
        /// <summary>
        /// 登出
        /// </summary>
        public void SingOut()
        {
            try
            {
                Application.RunOnMainThread( () =>
                {
                    //设定一个时间
                    Config.Instance.LoginDateTime = new DateTime(1970, 1, 1);
                    Config.Instance.Save();
                    CommonPage.Instance.RemoveAll();
                    CommonPage.Instance.Show();
                    var login = new Phone.Device.Account.AccountLogin();
                    CommonPage.Instance.AddChidren(login);
                    login.Show();
                });
            }
            catch { }
        }
        /// <summary>
        /// 退出登录时调用,清除推送数据
        /// </summary>
        public void SignOutClearData()
        {
            try
            {
                System.Threading.Tasks.Task.Run(() =>
                {
                    using (var client = new System.Net.Http.HttpClient())
                    {
                        client.DefaultRequestHeaders.Add("ContentType", "application/json");
                        client.DefaultRequestHeaders.Add("Authorization", Shared.Common.Config.Instance.Token);
                        var responseString = client.GetStringAsync($"{CommonPage.RequestHttpsHost}/ZigbeeUsers/SignOut");
                    }
                });
            }
            catch { }
        }
 
        /// <summary>
        /// 登录成功后上报设备id等相关信息给后端
        /// </summary>
        /// <returns>返回状态码</returns>
        public async System.Threading.Tasks.Task<string> PushRegID()
        {
            try
            {
                string deviceAlias;
                string deviceType;
#if iOS
                deviceAlias = UIKit.UIDevice.CurrentDevice.Name;
                deviceType = "iphone";
#elif Android
                deviceAlias = Android.OS.Build.Manufacturer;
                deviceType = "android";
#endif
                var RegIDObj = new SendDataToServer.SignZigbeeNeedPushRegIDObj()
                {
                    RegID = Shared.Common.Config.Instance.RegistrationID,
                    DeviceAlias = deviceAlias,
                    DeviceType = deviceType
                };
                var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(RegIDObj);
                var reverObj = await CommonPage.Instance.RequestHttpsZigbeeAsync("ZigbeeUsers/SignZigbeeNeedPushRegID", System.Text.Encoding.UTF8.GetBytes(requestJson));
                if (reverObj == null)
                {
                    return null;
                }
                return reverObj.StateCode;
            }
            catch
            {
                return null;
            }
        }
    }
}