mini_program_gizwits_sdk 3.4.3 → 3.4.5-FeiSiMan
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4 -4
- package/dist/src/aepApi/aepApiRequest.d.ts +7 -0
- package/dist/src/handler/ble.d.ts +2 -0
- package/dist/src/sdk.d.ts +11 -7
- package/dist/src/wifiConfig/ConfigBase.d.ts +1 -0
- package/dist/src/wifiConfig/ble.d.ts +15 -2
- package/package.json +2 -2
- package/src/aepApi/aepApiRequest.ts +62 -0
- package/src/handler/ble.ts +19 -2
- package/src/protocol/dataPoint.ts +18 -18
- package/src/sdk.ts +75 -47
- package/src/utils.ts +15 -5
- package/src/wifiConfig/ConfigBase.ts +44 -0
- package/src/wifiConfig/ap.ts +3 -1
- package/src/wifiConfig/ble.ts +86 -23
- package/src/wifiConfig/timeZoneName.json +1 -0
|
@@ -3,6 +3,7 @@ import sleep from "../sleep";
|
|
|
3
3
|
import errorCode from "../errorCode";
|
|
4
4
|
import { bindMac, checkDeviceRegister } from '../services/devices';
|
|
5
5
|
import GizLog from "../GizLog";
|
|
6
|
+
import timeZoneDic from './timeZoneName.json'
|
|
6
7
|
|
|
7
8
|
interface IRejectCallback {
|
|
8
9
|
(result: IResult<unknown>): void;
|
|
@@ -42,6 +43,49 @@ class ConfigBase {
|
|
|
42
43
|
this.cleanTimeout();
|
|
43
44
|
};
|
|
44
45
|
|
|
46
|
+
// 插入配网扩展信息
|
|
47
|
+
appendExtendData = (key: string) => {
|
|
48
|
+
const cmd = 0 // 小程序默认国内
|
|
49
|
+
const zone: number = new Date().getTimezoneOffset() / 60; //手机时区
|
|
50
|
+
let hour: number = Math.floor(zone);
|
|
51
|
+
let m: number = 0; //最终下发的时区精度
|
|
52
|
+
let h: string = ""; //最终下发的时区
|
|
53
|
+
let zoneAccuracy: number = zone - hour;
|
|
54
|
+
let timeZoneCode =0
|
|
55
|
+
const timeZoneName = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
56
|
+
|
|
57
|
+
if (hour >= 0 && hour <= 9) { //时区0~9
|
|
58
|
+
h = String.fromCharCode('0'.charCodeAt(0) + hour);
|
|
59
|
+
} else if (hour > 9) { //A~F
|
|
60
|
+
h = String.fromCharCode(hour - 10 + 'A'.charCodeAt(0));
|
|
61
|
+
} else { //a~o
|
|
62
|
+
h = String.fromCharCode(-hour - 1 + 'a'.charCodeAt(0));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (zoneAccuracy < 0) { //转正数
|
|
66
|
+
zoneAccuracy = -zoneAccuracy;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (zoneAccuracy >= 0 && zoneAccuracy < 0.25) { //精度
|
|
70
|
+
m = 0;
|
|
71
|
+
} else if (zoneAccuracy >= 0.25 && zoneAccuracy < 0.5) {
|
|
72
|
+
m = 1;
|
|
73
|
+
} else if (zoneAccuracy >= 0.5 && zoneAccuracy < 0.75) {
|
|
74
|
+
m = 2;
|
|
75
|
+
} else {
|
|
76
|
+
m = 3;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Object.entries(timeZoneDic).forEach(([key, value]) => {
|
|
80
|
+
if (value === timeZoneName) {
|
|
81
|
+
timeZoneCode = parseInt(key);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return key + `\0\x1b` + cmd + "\x1b" + h + m + "\x1b" + timeZoneCode;
|
|
87
|
+
}
|
|
88
|
+
|
|
45
89
|
hasTimeoutHandler = (cb?: IRejectCallback) => {
|
|
46
90
|
if (this.timeoutHandler) {
|
|
47
91
|
// 方法还在执行中
|
package/src/wifiConfig/ap.ts
CHANGED
|
@@ -143,6 +143,8 @@ class ApConfig extends ConfigBase {
|
|
|
143
143
|
}: ISetDeviceOnboardingDeployProps) => {
|
|
144
144
|
const ssid = this.ssid;
|
|
145
145
|
const password = this.password;
|
|
146
|
+
// 插入时区信息
|
|
147
|
+
const appendPassword = this.appendExtendData(password)
|
|
146
148
|
return new Promise<IResult<IDevice[]>>(async (res, rej) => {
|
|
147
149
|
this.destroy();
|
|
148
150
|
this.initDeviceOnboardingDeploy(res, rej);
|
|
@@ -151,7 +153,7 @@ class ApConfig extends ConfigBase {
|
|
|
151
153
|
try {
|
|
152
154
|
const result = await this.configDevice({
|
|
153
155
|
ssid,
|
|
154
|
-
password,
|
|
156
|
+
password:appendPassword,
|
|
155
157
|
softAPSSIDPrefix,
|
|
156
158
|
});
|
|
157
159
|
const newData: IDevice[] = (result.data || []).map(item => {
|
package/src/wifiConfig/ble.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import errorCode from "../errorCode";
|
|
2
|
-
import {
|
|
2
|
+
import { IConfigResult, IResult } from "../sdk";
|
|
3
3
|
import { ab2hex, advertisData2PkAndMac, isWXDevicesResult } from '../utils';
|
|
4
4
|
|
|
5
5
|
import GizLog from "../GizLog";
|
|
@@ -11,6 +11,14 @@ import {
|
|
|
11
11
|
notifyBLECharacteristicValueChange, retryConnect, startBluetoothDevicesDiscovery, unpackWriteBLECharacteristicValue
|
|
12
12
|
} from '../wechatApi';
|
|
13
13
|
import ConfigBase from "./ConfigBase";
|
|
14
|
+
import aepApiRequest from "../aepApi/aepApiRequest";
|
|
15
|
+
|
|
16
|
+
interface IVerifyOnlineResult {
|
|
17
|
+
data: {
|
|
18
|
+
status: number; // 2表示离线 3表示在线
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
14
22
|
|
|
15
23
|
interface IArgs {
|
|
16
24
|
bleDeviceId: string;
|
|
@@ -260,6 +268,52 @@ class BLEConfig extends ConfigBase {
|
|
|
260
268
|
return { success: true };
|
|
261
269
|
};
|
|
262
270
|
|
|
271
|
+
getDeviceLastestOnlineTime = async ({ productKey, mac }:
|
|
272
|
+
{ productKey: string, mac: string }) => {
|
|
273
|
+
GizLog.debug('GIZ_SDK: getDeviceLastestOnlineTime', mac);
|
|
274
|
+
const res = await aepApiRequest<IVerifyOnlineResult>(`applet/device/getDeviceInfo/${(mac ?? '')}`, { method: 'get' });
|
|
275
|
+
GizLog.debug('GIZ_SDK: 请求结果', res);
|
|
276
|
+
return res;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// 配网后确认设备是否上线
|
|
280
|
+
verifyDeviceOnline = ({ productKey, mac }: { productKey: string, mac: string }) => {
|
|
281
|
+
return new Promise<IResult<IVerifyOnlineResult>>((res, rej) => {
|
|
282
|
+
GizLog.debug('GIZ_SDK: 开始确认设备上线')
|
|
283
|
+
const query = async () => {
|
|
284
|
+
|
|
285
|
+
if (!this.hasTimeoutHandler()) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
try {
|
|
290
|
+
await sleep(2000);
|
|
291
|
+
const data = await this.getDeviceLastestOnlineTime({ productKey, mac })
|
|
292
|
+
GizLog.debug('GIZ_SDK: 确认到设备是否在线', data.data.data.status);
|
|
293
|
+
if (data.success && data.data && data.data.data && data.data.data.status == 3) {
|
|
294
|
+
// 确认设备最后一次上线时间有更新
|
|
295
|
+
GizLog.debug('GIZ_SDK: 确认到设备是在线的', data);
|
|
296
|
+
res({
|
|
297
|
+
success: true,
|
|
298
|
+
data: data.data,
|
|
299
|
+
});
|
|
300
|
+
} else {
|
|
301
|
+
// 重新请求
|
|
302
|
+
GizLog.debug('GIZ_SDK: 未确认到设备是在线');
|
|
303
|
+
await sleep(1500);
|
|
304
|
+
!this.disableSearchDevice && query();
|
|
305
|
+
}
|
|
306
|
+
} catch (error) {
|
|
307
|
+
// 重新请求
|
|
308
|
+
await sleep(3000);
|
|
309
|
+
!this.disableSearchDevice && query();
|
|
310
|
+
// GizLog.debug('GIZ_SDK: random codes error', error);
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
query();
|
|
314
|
+
});
|
|
315
|
+
};
|
|
316
|
+
|
|
263
317
|
|
|
264
318
|
enableAndGetBluetoothDevices = async (
|
|
265
319
|
softAPSSIDPrefix?: string
|
|
@@ -290,30 +344,34 @@ class BLEConfig extends ConfigBase {
|
|
|
290
344
|
return new Promise<IResult<IDevice[]>>(async (res, rej) => {
|
|
291
345
|
const ssid = this.ssid;
|
|
292
346
|
const password = this.password;
|
|
347
|
+
|
|
348
|
+
// 插入时区信息
|
|
349
|
+
const appendPassword = this.appendExtendData(password)
|
|
293
350
|
this.destroy();
|
|
294
351
|
this.initDeviceOnboardingDeploy(res, rej);
|
|
295
352
|
this.startTimeoutTimer(timeout);
|
|
296
353
|
try {
|
|
297
354
|
const result = await this.configBLEDevice({
|
|
298
355
|
ssid,
|
|
299
|
-
password,
|
|
356
|
+
password: appendPassword,
|
|
300
357
|
timeout: timeout * 1000,
|
|
301
358
|
softAPSSIDPrefix,
|
|
302
359
|
});
|
|
303
360
|
|
|
304
|
-
const newData: IDevice[] =
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}
|
|
361
|
+
const newData: IDevice[] = [result.data as IDevice];
|
|
362
|
+
// const newData: IDevice[] = (result.data || []).map(item => {
|
|
363
|
+
// return {
|
|
364
|
+
// mac: item.mac,
|
|
365
|
+
// productKey: item.product_key,
|
|
366
|
+
// did: item.did,
|
|
367
|
+
// name: '',
|
|
368
|
+
// isBind: false,
|
|
369
|
+
// connectType: 'NONE',
|
|
370
|
+
// isBleOnline: false,
|
|
371
|
+
// isLanOnline: false,
|
|
372
|
+
// isOnline: false,
|
|
373
|
+
// }
|
|
374
|
+
// })
|
|
317
375
|
if (isBind) {
|
|
318
376
|
res(await this.bindDevices(newData));
|
|
319
377
|
} else {
|
|
@@ -341,7 +399,7 @@ class BLEConfig extends ConfigBase {
|
|
|
341
399
|
password,
|
|
342
400
|
softAPSSIDPrefix,
|
|
343
401
|
}: configBLEDeviceParams) => {
|
|
344
|
-
|
|
402
|
+
return new Promise<IResult<IConfigResult>>(async (res, rej) => {
|
|
345
403
|
GizLog.debug('GIZ_SDK: start config ble device');
|
|
346
404
|
const enableAndGetRes = await this.enableAndGetBluetoothDevices(
|
|
347
405
|
softAPSSIDPrefix
|
|
@@ -380,12 +438,13 @@ class BLEConfig extends ConfigBase {
|
|
|
380
438
|
wx.onBluetoothDeviceFound(handleFoundDevices);
|
|
381
439
|
|
|
382
440
|
const uint8Array = WifiConfig.pack(ssid,password);
|
|
441
|
+
const bleDevice = bleDevices.shift();
|
|
442
|
+
const { productKey, mac } = advertisData2PkAndMac(bleDevice.advertisData, this.specialProductKeys)
|
|
383
443
|
const startConfigDevice = async () => {
|
|
384
444
|
GizLog.debug('GIZ_SDK: startConfigDevice');
|
|
385
445
|
if (!this.hasTimeoutHandler()) {
|
|
386
446
|
return;
|
|
387
447
|
}
|
|
388
|
-
const bleDevice = bleDevices.shift();
|
|
389
448
|
if (bleDevice) {
|
|
390
449
|
GizLog.debug('GIZ_SDK: startConfigDevice, target device: ', bleDevice);
|
|
391
450
|
}
|
|
@@ -410,19 +469,23 @@ class BLEConfig extends ConfigBase {
|
|
|
410
469
|
GizLog.debug("GIZ_SDK: offBluetoothDeviceFound ready search device")
|
|
411
470
|
wx.offBluetoothDeviceFound(() => {});
|
|
412
471
|
};
|
|
472
|
+
await startConfigDevice();
|
|
413
473
|
|
|
414
|
-
//
|
|
474
|
+
// 开始确认设备是否上线
|
|
415
475
|
try {
|
|
416
476
|
// const devicesReturn = await this.searchDevice({ ssid, password });
|
|
417
|
-
this.searchDevice({ ssid, password }).then(devicesReturn => {
|
|
418
|
-
|
|
419
|
-
})
|
|
477
|
+
// this.searchDevice({ ssid, password }).then(devicesReturn => {
|
|
478
|
+
// res(devicesReturn);
|
|
479
|
+
// })
|
|
480
|
+
await sleep(5000);
|
|
481
|
+
// const devicesReturn = await this.searchDevice({ ssid, password });
|
|
482
|
+
this.verifyDeviceOnline({ productKey, mac }).then(devicesReturn => {
|
|
483
|
+
res({ ...devicesReturn, data: { ...devicesReturn.data.data, mac, productKey } });
|
|
484
|
+
});
|
|
420
485
|
} catch (error) {
|
|
421
486
|
rej(error);
|
|
422
487
|
GizLog.error("GIZ_SDK: searchDevice error", new Error(JSON.stringify(error)))
|
|
423
488
|
}
|
|
424
|
-
|
|
425
|
-
await startConfigDevice();
|
|
426
489
|
});
|
|
427
490
|
};
|
|
428
491
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"0": "Africa/Abidjan", "1": "Africa/Accra", "2": "Africa/Addis_Ababa", "3": "Africa/Algiers", "4": "Africa/Asmara", "5": "Africa/Asmera", "6": "Africa/Bamako", "7": "Africa/Bangui", "8": "Africa/Banjul", "9": "Africa/Bissau", "10": "Africa/Blantyre", "11": "Africa/Brazzaville", "12": "Africa/Bujumbura", "13": "Africa/Cairo", "14": "Africa/Casablanca", "15": "Africa/Ceuta", "16": "Africa/Conakry", "17": "Africa/Dakar", "18": "Africa/Dar_es_Salaam", "19": "Africa/Djibouti", "20": "Africa/Douala", "21": "Africa/El_Aaiun", "22": "Africa/Freetown", "23": "Africa/Gaborone", "24": "Africa/Harare", "25": "Africa/Johannesburg", "26": "Africa/Juba", "27": "Africa/Kampala", "28": "Africa/Khartoum", "29": "Africa/Kigali", "30": "Africa/Kinshasa", "31": "Africa/Lagos", "32": "Africa/Libreville", "33": "Africa/Lome", "34": "Africa/Luanda", "35": "Africa/Lubumbashi", "36": "Africa/Lusaka", "37": "Africa/Malabo", "38": "Africa/Maputo", "39": "Africa/Maseru", "40": "Africa/Mbabane", "41": "Africa/Mogadishu", "42": "Africa/Monrovia", "43": "Africa/Nairobi", "44": "Africa/Ndjamena", "45": "Africa/Niamey", "46": "Africa/Nouakchott", "47": "Africa/Ouagadougou", "48": "Africa/Porto-Novo", "49": "Africa/Sao_Tome", "50": "Africa/Timbuktu", "51": "Africa/Tripoli", "52": "Africa/Tunis", "53": "Africa/Windhoek", "54": "America/Adak", "55": "America/Anchorage", "56": "America/Anguilla", "57": "America/Antigua", "58": "America/Araguaina", "59": "America/Argentina/Buenos_Aires", "60": "America/Argentina/Catamarca", "61": "America/Argentina/ComodRivadavia", "62": "America/Argentina/Cordoba", "63": "America/Argentina/Jujuy", "64": "America/Argentina/La_Rioja", "65": "America/Argentina/Mendoza", "66": "America/Argentina/Rio_Gallegos", "67": "America/Argentina/Salta", "68": "America/Argentina/San_Juan", "69": "America/Argentina/San_Luis", "70": "America/Argentina/Tucuman", "71": "America/Argentina/Ushuaia", "72": "America/Aruba", "73": "America/Asuncion", "74": "America/Atikokan", "75": "America/Atka", "76": "America/Bahia", "77": "America/Bahia_Banderas", "78": "America/Barbados", "79": "America/Belem", "80": "America/Belize", "81": "America/Blanc-Sablon", "82": "America/Boa_Vista", "83": "America/Bogota", "84": "America/Boise", "85": "America/Buenos_Aires", "86": "America/Cambridge_Bay", "87": "America/Campo_Grande", "88": "America/Cancun", "89": "America/Caracas", "90": "America/Catamarca", "91": "America/Cayenne", "92": "America/Cayman", "93": "America/Chicago", "94": "America/Chihuahua", "95": "America/Coral_Harbour", "96": "America/Cordoba", "97": "America/Costa_Rica", "98": "America/Creston", "99": "America/Cuiaba", "100": "America/Curacao", "101": "America/Danmarkshavn", "102": "America/Dawson", "103": "America/Dawson_Creek", "104": "America/Denver", "105": "America/Detroit", "106": "America/Dominica", "107": "America/Edmonton", "108": "America/Eirunepe", "109": "America/El_Salvador", "110": "America/Ensenada", "111": "America/Fort_Nelson", "112": "America/Fort_Wayne", "113": "America/Fortaleza", "114": "America/Glace_Bay", "115": "America/Godthab", "116": "America/Goose_Bay", "117": "America/Grand_Turk", "118": "America/Grenada", "119": "America/Guadeloupe", "120": "America/Guatemala", "121": "America/Guayaquil", "122": "America/Guyana", "123": "America/Halifax", "124": "America/Havana", "125": "America/Hermosillo", "126": "America/Indiana/Indianapolis", "127": "America/Indiana/Knox", "128": "America/Indiana/Marengo", "129": "America/Indiana/Petersburg", "130": "America/Indiana/Tell_City", "131": "America/Indiana/Vevay", "132": "America/Indiana/Vincennes", "133": "America/Indiana/Winamac", "134": "America/Indianapolis", "135": "America/Inuvik", "136": "America/Iqaluit", "137": "America/Jamaica", "138": "America/Jujuy", "139": "America/Juneau", "140": "America/Kentucky/Louisville", "141": "America/Kentucky/Monticello", "142": "America/Knox_IN", "143": "America/Kralendijk", "144": "America/La_Paz", "145": "America/Lima", "146": "America/Los_Angeles", "147": "America/Louisville", "148": "America/Lower_Princes", "149": "America/Maceio", "150": "America/Managua", "151": "America/Manaus", "152": "America/Marigot", "153": "America/Martinique", "154": "America/Matamoros", "155": "America/Mazatlan", "156": "America/Mendoza", "157": "America/Menominee", "158": "America/Merida", "159": "America/Metlakatla", "160": "America/Mexico_City", "161": "America/Miquelon", "162": "America/Moncton", "163": "America/Monterrey", "164": "America/Montevideo", "165": "America/Montreal", "166": "America/Montserrat", "167": "America/Nassau", "168": "America/New_York", "169": "America/Nipigon", "170": "America/Nome", "171": "America/Noronha", "172": "America/North_Dakota/Beulah", "173": "America/North_Dakota/Center", "174": "America/North_Dakota/New_Salem", "175": "America/Ojinaga", "176": "America/Panama", "177": "America/Pangnirtung", "178": "America/Paramaribo", "179": "America/Phoenix", "180": "America/Port-au-Prince", "181": "America/Port_of_Spain", "182": "America/Porto_Acre", "183": "America/Porto_Velho", "184": "America/Puerto_Rico", "185": "America/Punta_Arenas", "186": "America/Rainy_River", "187": "America/Rankin_Inlet", "188": "America/Recife", "189": "America/Regina", "190": "America/Resolute", "191": "America/Rio_Branco", "192": "America/Rosario", "193": "America/Santa_Isabel", "194": "America/Santarem", "195": "America/Santiago", "196": "America/Santo_Domingo", "197": "America/Sao_Paulo", "198": "America/Scoresbysund", "199": "America/Shiprock", "200": "America/Sitka", "201": "America/St_Barthelemy", "202": "America/St_Johns", "203": "America/St_Kitts", "204": "America/St_Lucia", "205": "America/St_Thomas", "206": "America/St_Vincent", "207": "America/Swift_Current", "208": "America/Tegucigalpa", "209": "America/Thule", "210": "America/Thunder_Bay", "211": "America/Tijuana", "212": "America/Toronto", "213": "America/Tortola", "214": "America/Vancouver", "215": "America/Virgin", "216": "America/Whitehorse", "217": "America/Winnipeg", "218": "America/Yakutat", "219": "America/Yellowknife", "220": "Antarctica/Casey", "221": "Antarctica/Davis", "222": "Antarctica/DumontDUrville", "223": "Antarctica/Macquarie", "224": "Antarctica/Mawson", "225": "Antarctica/McMurdo", "226": "Antarctica/Palmer", "227": "Antarctica/Rothera", "228": "Antarctica/South_Pole", "229": "Antarctica/Syowa", "230": "Antarctica/Troll", "231": "Antarctica/Vostok", "232": "Arctic/Longyearbyen", "233": "Asia/Aden", "234": "Asia/Almaty", "235": "Asia/Amman", "236": "Asia/Anadyr", "237": "Asia/Aqtau", "238": "Asia/Aqtobe", "239": "Asia/Ashgabat", "240": "Asia/Ashkhabad", "241": "Asia/Atyrau", "242": "Asia/Baghdad", "243": "Asia/Bahrain", "244": "Asia/Baku", "245": "Asia/Bangkok", "246": "Asia/Barnaul", "247": "Asia/Beirut", "248": "Asia/Bishkek", "249": "Asia/Brunei", "250": "Asia/Calcutta", "251": "Asia/Chita", "252": "Asia/Choibalsan", "253": "Asia/Chongqing", "254": "Asia/Chungking", "255": "Asia/Colombo", "256": "Asia/Dacca", "257": "Asia/Damascus", "258": "Asia/Dhaka", "259": "Asia/Dili", "260": "Asia/Dubai", "261": "Asia/Dushanbe", "262": "Asia/Famagusta", "263": "Asia/Gaza", "264": "Asia/Harbin", "265": "Asia/Hebron", "266": "Asia/Ho_Chi_Minh", "267": "Asia/Hong_Kong", "268": "Asia/Hovd", "269": "Asia/Irkutsk", "270": "Asia/Istanbul", "271": "Asia/Jakarta", "272": "Asia/Jayapura", "273": "Asia/Jerusalem", "274": "Asia/Kabul", "275": "Asia/Kamchatka", "276": "Asia/Karachi", "277": "Asia/Kashgar", "278": "Asia/Kathmandu", "279": "Asia/Katmandu", "280": "Asia/Khandyga", "281": "Asia/Kolkata", "282": "Asia/Krasnoyarsk", "283": "Asia/Kuala_Lumpur", "284": "Asia/Kuching", "285": "Asia/Kuwait", "286": "Asia/Macao", "287": "Asia/Macau", "288": "Asia/Magadan", "289": "Asia/Makassar", "290": "Asia/Manila", "291": "Asia/Muscat", "292": "Asia/Nicosia", "293": "Asia/Novokuznetsk", "294": "Asia/Novosibirsk", "295": "Asia/Omsk", "296": "Asia/Oral", "297": "Asia/Phnom_Penh", "298": "Asia/Pontianak", "299": "Asia/Pyongyang", "300": "Asia/Qatar", "301": "Asia/Qostanay", "302": "Asia/Qyzylorda", "303": "Asia/Rangoon", "304": "Asia/Riyadh", "305": "Asia/Saigon", "306": "Asia/Sakhalin", "307": "Asia/Samarkand", "308": "Asia/Seoul", "309": "Asia/Shanghai", "310": "Asia/Singapore", "311": "Asia/Srednekolymsk", "312": "Asia/Taipei", "313": "Asia/Tashkent", "314": "Asia/Tbilisi", "315": "Asia/Tehran", "316": "Asia/Tel_Aviv", "317": "Asia/Thimbu", "318": "Asia/Thimphu", "319": "Asia/Tokyo", "320": "Asia/Tomsk", "321": "Asia/Ujung_Pandang", "322": "Asia/Ulaanbaatar", "323": "Asia/Ulan_Bator", "324": "Asia/Urumqi", "325": "Asia/Ust-Nera", "326": "Asia/Vientiane", "327": "Asia/Vladivostok", "328": "Asia/Yakutsk", "329": "Asia/Yangon", "330": "Asia/Yekaterinburg", "331": "Asia/Yerevan", "332": "Atlantic/Azores", "333": "Atlantic/Bermuda", "334": "Atlantic/Canary", "335": "Atlantic/Cape_Verde", "336": "Atlantic/Faeroe", "337": "Atlantic/Faroe", "338": "Atlantic/Jan_Mayen", "339": "Atlantic/Madeira", "340": "Atlantic/Reykjavik", "341": "Atlantic/South_Georgia", "342": "Atlantic/St_Helena", "343": "Atlantic/Stanley", "344": "Australia/ACT", "345": "Australia/Adelaide", "346": "Australia/Brisbane", "347": "Australia/Broken_Hill", "348": "Australia/Canberra", "349": "Australia/Currie", "350": "Australia/Darwin", "351": "Australia/Eucla", "352": "Australia/Hobart", "353": "Australia/LHI", "354": "Australia/Lindeman", "355": "Australia/Lord_Howe", "356": "Australia/Melbourne", "357": "Australia/NSW", "358": "Australia/North", "359": "Australia/Perth", "360": "Australia/Queensland", "361": "Australia/South", "362": "Australia/Sydney", "363": "Australia/Tasmania", "364": "Australia/Victoria", "365": "Australia/West", "366": "Australia/Yancowinna", "367": "Brazil/Acre", "368": "Brazil/DeNoronha", "369": "Brazil/East", "370": "Brazil/West", "371": "CET", "372": "CST6CDT", "373": "Canada/Atlantic", "374": "Canada/Central", "375": "Canada/Eastern", "376": "Canada/Mountain", "377": "Canada/Newfoundland", "378": "Canada/Pacific", "379": "Canada/Saskatchewan", "380": "Canada/Yukon", "381": "Chile/Continental", "382": "Chile/EasterIsland", "383": "Cuba", "384": "EET", "385": "EST", "386": "EST5EDT", "387": "Egypt", "388": "Eire", "389": "Etc/GMT", "390": "Etc/GMT+0", "391": "Etc/GMT+1", "392": "Etc/GMT+10", "393": "Etc/GMT+11", "394": "Etc/GMT+12", "395": "Etc/GMT+2", "396": "Etc/GMT+3", "397": "Etc/GMT+4", "398": "Etc/GMT+5", "399": "Etc/GMT+6", "400": "Etc/GMT+7", "401": "Etc/GMT+8", "402": "Etc/GMT+9", "403": "Etc/GMT-0", "404": "Etc/GMT-1", "405": "Etc/GMT-10", "406": "Etc/GMT-11", "407": "Etc/GMT-12", "408": "Etc/GMT-13", "409": "Etc/GMT-14", "410": "Etc/GMT-2", "411": "Etc/GMT-3", "412": "Etc/GMT-4", "413": "Etc/GMT-5", "414": "Etc/GMT-6", "415": "Etc/GMT-7", "416": "Etc/GMT-8", "417": "Etc/GMT-9", "418": "Etc/GMT0", "419": "Etc/Greenwich", "420": "Etc/UCT", "421": "Etc/UTC", "422": "Etc/Universal", "423": "Etc/Zulu", "424": "Europe/Amsterdam", "425": "Europe/Andorra", "426": "Europe/Astrakhan", "427": "Europe/Athens", "428": "Europe/Belfast", "429": "Europe/Belgrade", "430": "Europe/Berlin", "431": "Europe/Bratislava", "432": "Europe/Brussels", "433": "Europe/Bucharest", "434": "Europe/Budapest", "435": "Europe/Busingen", "436": "Europe/Chisinau", "437": "Europe/Copenhagen", "438": "Europe/Dublin", "439": "Europe/Gibraltar", "440": "Europe/Guernsey", "441": "Europe/Helsinki", "442": "Europe/Isle_of_Man", "443": "Europe/Istanbul", "444": "Europe/Jersey", "445": "Europe/Kaliningrad", "446": "Europe/Kiev", "447": "Europe/Kirov", "448": "Europe/Lisbon", "449": "Europe/Ljubljana", "450": "Europe/London", "451": "Europe/Luxembourg", "452": "Europe/Madrid", "453": "Europe/Malta", "454": "Europe/Mariehamn", "455": "Europe/Minsk", "456": "Europe/Monaco", "457": "Europe/Moscow", "458": "Europe/Nicosia", "459": "Europe/Oslo", "460": "Europe/Paris", "461": "Europe/Podgorica", "462": "Europe/Prague", "463": "Europe/Riga", "464": "Europe/Rome", "465": "Europe/Samara", "466": "Europe/San_Marino", "467": "Europe/Sarajevo", "468": "Europe/Saratov", "469": "Europe/Simferopol", "470": "Europe/Skopje", "471": "Europe/Sofia", "472": "Europe/Stockholm", "473": "Europe/Tallinn", "474": "Europe/Tirane", "475": "Europe/Tiraspol", "476": "Europe/Ulyanovsk", "477": "Europe/Uzhgorod", "478": "Europe/Vaduz", "479": "Europe/Vatican", "480": "Europe/Vienna", "481": "Europe/Vilnius", "482": "Europe/Volgograd", "483": "Europe/Warsaw", "484": "Europe/Zagreb", "485": "Europe/Zaporozhye", "486": "Europe/Zurich", "487": "GB", "488": "GB-Eire", "489": "GMT", "490": "GMT+0", "491": "GMT-0", "492": "GMT0", "493": "Greenwich", "494": "HST", "495": "Hongkong", "496": "Iceland", "497": "Indian/Antananarivo", "498": "Indian/Chagos", "499": "Indian/Christmas", "500": "Indian/Cocos", "501": "Indian/Comoro", "502": "Indian/Kerguelen", "503": "Indian/Mahe", "504": "Indian/Maldives", "505": "Indian/Mauritius", "506": "Indian/Mayotte", "507": "Indian/Reunion", "508": "Iran", "509": "Israel", "510": "Jamaica", "511": "Japan", "512": "Kwajalein", "513": "Libya", "514": "MET", "515": "MST", "516": "MST7MDT", "517": "Mexico/BajaNorte", "518": "Mexico/BajaSur", "519": "Mexico/General", "520": "NZ", "521": "NZ-CHAT", "522": "Navajo", "523": "PRC", "524": "PST8PDT", "525": "Pacific/Apia", "526": "Pacific/Auckland", "527": "Pacific/Bougainville", "528": "Pacific/Chatham", "529": "Pacific/Chuuk", "530": "Pacific/Easter", "531": "Pacific/Efate", "532": "Pacific/Enderbury", "533": "Pacific/Fakaofo", "534": "Pacific/Fiji", "535": "Pacific/Funafuti", "536": "Pacific/Galapagos", "537": "Pacific/Gambier", "538": "Pacific/Guadalcanal", "539": "Pacific/Guam", "540": "Pacific/Honolulu", "541": "Pacific/Johnston", "542": "Pacific/Kiritimati", "543": "Pacific/Kosrae", "544": "Pacific/Kwajalein", "545": "Pacific/Majuro", "546": "Pacific/Marquesas", "547": "Pacific/Midway", "548": "Pacific/Nauru", "549": "Pacific/Niue", "550": "Pacific/Norfolk", "551": "Pacific/Noumea", "552": "Pacific/Pago_Pago", "553": "Pacific/Palau", "554": "Pacific/Pitcairn", "555": "Pacific/Pohnpei", "556": "Pacific/Ponape", "557": "Pacific/Port_Moresby", "558": "Pacific/Rarotonga", "559": "Pacific/Saipan", "560": "Pacific/Samoa", "561": "Pacific/Tahiti", "562": "Pacific/Tarawa", "563": "Pacific/Tongatapu", "564": "Pacific/Truk", "565": "Pacific/Wake", "566": "Pacific/Wallis", "567": "Pacific/Yap", "568": "Poland", "569": "Portugal", "570": "ROC", "571": "ROK", "572": "Singapore", "573": "Turkey", "574": "UCT", "575": "US/Alaska", "576": "US/Aleutian", "577": "US/Arizona", "578": "US/Central", "579": "US/East-Indiana", "580": "US/Eastern", "581": "US/Hawaii", "582": "US/Indiana-Starke", "583": "US/Michigan", "584": "US/Mountain", "585": "US/Pacific", "586": "US/Samoa", "587": "UTC", "588": "Universal", "589": "W-SU", "590": "WET", "591": "Zulu"}
|