xm
2020-07-21 9a4b76398009cf76c508d61f7e48fb6f5cb7ac2d
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
 
namespace Shared.Common
{
    public class CommonPage : UIDrawerLayout
    {
        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()
        {
            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 RequestHttpsHost = "https://global.hdlcontrol.com/HangZhouHdlCloudApi";
        public static string RequestHttpsHost = "https://global.hdlcontrol.com/ProposedProductionApi";
        /// <summary>
        /// 版本号
        /// </summary>
        public static string CodeIDString = "1.1.0120072005";
        /// <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>
        /// 使用的语言
        /// </summary>
        public static string ZigBeeLanguage
        {
            get
            {
                return Language.CurrentLanguage;
            }
        }
        /// <summary>
        /// 默认手机区号为86中国大陆
        /// </summary>
        public static string PhoneZoneStr = "86";
        /// <summary>
        /// APP宽度 -- 1080
        /// </summary>
        public static int AppRealWidth = 1080;
 
        /// <summary>
        /// 用于中国大陆验证手机号正则表达式
        /// </summary>
        public static string PhoneRegexStr = "^[1][0-9]{10}$";
        /// <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>
        /// 安卓的系统返回按键能否按下(比如在备份还原时,不能按下返回键)
        /// </summary>
        public static bool BackKeyCanClick = true;
 
        /// <summary>
        /// 请求服务器方法
        /// 指定一个Url,和请求方法,数据,Cookie,得到响应的数据
        /// </summary>
        /// <param name="requestUrl">请求Url</param>
        /// <param name="byteData">请求的的数据</param>
        /// <param name="timeout">超时,默认10秒</param>
        /// <returns>得到响应的数据</returns>
        public ResponseEntity.ResponsePack RequestHttpsZigbeeAsync(string requestUrl, byte[] byteData, int timeout = 10)
        {
            string result = this.RequestHttpsZigbeeResultAsync(requestUrl, byteData, timeout);
            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>
        /// <param name="timeout">超时,默认10秒</param>
        /// <returns>得到响应的数据</returns>
        public string RequestHttpsZigbeeResultAsync(string requestUrl, byte[] byteData, int timeout = 10)
        {
            var result = RequestHttpsZigbeeBytesResultAsync(requestUrl, byteData, "POST", timeout);
            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>
        /// <param name="timeout">超时,默认10秒</param>
        /// <returns>得到响应的数据</returns>
        public byte[] RequestHttpsZigbeeBytesResultAsync(string requestUrl, byte[] byteData, string requestMethod = "POST", int timeout = 10)
        {
            //请求Url的完成路径
            var fullUrl = $"{RequestHttpsHost}/{requestUrl}";
            return this.DoRequestZigbeeHttpsInterface(fullUrl, byteData, Config.Instance.Token, requestMethod, timeout);
        }
 
        /// <summary>
        /// <pra>请求服务器方法,指定一个Url,和请求方法,数据,Cookie,得到响应的数据</pra>
        /// <pra>注意!!此方法仅限【拥有管理员权限的成员】调用</pra>
        /// </summary>
        /// <param name="requestUrl">请求Url</param>
        /// <param name="byteData">请求的的数据</param>
        /// <param name="requestMethod">POST 或者 GET 等等</param>
        /// <param name="timeout">超时,默认10秒</param>
        /// <returns>得到响应的数据</returns>
        public byte[] RequestZigbeeHttpsByAdmin(string requestUrl, byte[] byteData, string requestMethod = "POST", int timeout = 10)
        {
            //请求Url的完成路径
            var fullUrl = $"{Config.Instance.AdminRequestBaseUrl}/{requestUrl}";
            return this.DoRequestZigbeeHttpsInterface(fullUrl, byteData, Config.Instance.AdminRequestToken, requestMethod, timeout);
        }
 
        /// <summary>
        /// 请求服务器方法
        /// 指定一个Url,和请求方法,数据,Cookie,得到响应的数据
        /// </summary>
        /// <param name="requestFullUrl">请求Url的完成路径</param>
        /// <param name="byteData">请求的的数据</param>
        /// <param name="token">token</param>
        /// <param name="requestMethod">POST 或者 GET 等等</param>
        /// <param name="timeout">超时,默认10秒</param>
        /// <returns>得到响应的数据</returns>
        public byte[] DoRequestZigbeeHttpsInterface(string requestFullUrl, byte[] byteData, string token, string requestMethod = "POST", int timeout = 10)
        {
            try
            {
                //初始化新的webRequst
                //1. 创建httpWebRequest对象
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(requestFullUrl));
 
                //2. 初始化HttpWebRequest对象
                webRequest.Method = requestMethod;
                webRequest.Timeout = timeout * 1000;
                //取消使用代理访问
                webRequest.Proxy = null;
                if (token != null)
                {
                    //对应微信网址
                    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 (WebException e)
            {
                if (e.Status == WebExceptionStatus.ConnectFailure//由有网络切换到无网络时触发
                    || e.Status == WebExceptionStatus.Timeout//超时
                    || e.Status == WebExceptionStatus.NameResolutionFailure)//本身就是无网络时启动时触发
                {
                    Phone.UserCenter.HdlWifiLogic.Current.CanAccessHttp = false;
                }
                return null;
            }
            catch (Exception e)
            {
                return null;
            }
        }
 
        /// <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.Login.AccountLoginForm();
                    CommonPage.Instance.AddChidren(login);
                    login.ShowForm();
                });
            }
            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 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 = CommonPage.Instance.RequestHttpsZigbeeAsync("ZigbeeUsers/SignZigbeeNeedPushRegID", System.Text.Encoding.UTF8.GetBytes(requestJson));
                if (reverObj == null)
                {
                    return null;
                }
                return reverObj.StateCode;
            }
            catch
            {
                return null;
            }
        }
    }
}