Merge branch 'develop_liyi' of code-internal.star-lock.cn:StarlockTeam/app-starlock into develop_liyi

This commit is contained in:
“DaisyWu” 2025-02-06 11:09:53 +08:00
commit e3beea01da
60 changed files with 465 additions and 172 deletions

View File

@ -146,9 +146,14 @@ android {
xhj_bundle {
dimension "flavor-type"
applicationId "ltd.xhjcn.lock"
signingConfig signingConfigs.xhj_bundle
resValue "string", "app_name", "Star Lock"
manifestPlaceholders.JPUSH_PKGNAME = "ltd.xhjcn.lock"
manifestPlaceholders = [
JPUSH_PKGNAME : "ltd.xhjcn.lock",
JPUSH_APPKEY : "5ccdb9b8d3faaae66ba5d02e",
JPUSH_CHANNEL : "flutter_channel",
]
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-xhj.pro'
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "كلمات المرور غير متسقة",
"中功率": "قوة متوسطة",
"常规使用": "استخدام منتظم",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "بعد تشغيل البوابة ، اضغط مع الاستمرار على زر إعادة الضبط لمدة 5 ثوانٍ ، وانقر بعد ذلك عندما يومض مصباح المؤشر بالتناوب",
"扫描设备": "جهاز المسح الضوئي",
"删除失败,网关可能已经离线,是否强制删除该数据?": "فشل الحذف. ربما تكون البوابة قد اختفت دون اتصال. هل تريد فرض حذف البيانات ؟",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Паролите са непоследователни",
"中功率": "Средна мощност",
"常规使用": "Редовна употреба",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "След като шлюзът е включен, натиснете и задръжте бутона reset за 5 секунди и щракнете върху следващия, когато индикаторната светлина мига алтернативно",
"扫描设备": "Сканиране устройство",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Изтриването не успя. Портата може да е отишла офлайн. Искате ли да принудите изтриване на данните?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Thepasswordsare pencay",
"中功率": "উইউমপোওয়ার",
"常规使用": "গ্যারিউস",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "অ্যারাস্টার্টিউইসপোভেরেডন, প্রেস এবং টিপেস্টেট্রিসেট গানttonfor5sononds, এবং চক্লিক উইভেন্থে-উইন্টার",
"扫描设备": "সিস্কান্লিভাইস",
"删除失败,网关可能已经离线,是否强制删除该数据?": "ডাইজেজেশনিমেরিলেড। টিভওয়েমাইয়ানভিগনোনোআরলাইন। ডো ডাউনডেটা?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "এক্ফক্লোসিস্টেম",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "ব্যান্ডোটারট্রাসেট, thelock'sferprinতা?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "ব্যান্ডোটারপ্রাসেট, নিয়ন্ত্রণের নিয়ন্ত্রণ। ডোডো ডাইভান্টটুরে?",
"版本说明": "ভার্সনপরিচিতি",
"版本说明": "ভার্সনপরিচিতি"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Hesla jsou nekonzistentní",
"中功率": "Střední síla",
"常规使用": "Pravidelné použití",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po zapnutí brány stiskněte a podržte tlačítko reset po dobu 5 sekund a klepněte na tlačítko next",
"扫描设备": "Skenovat zařízení",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Odstranění se nezdařilo. Brána možná byla offline. Chcete vynutit smazat data?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Adgangskoderne er inkonsekvente",
"中功率": "Mellem effekt",
"常规使用": "Regelmæssig anvendelse",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Når gateway er tændt, tryk og hold nulstillingsknappen i 5 sekunder, og klik Next, når indikator lys blinker skiftevist",
"扫描设备": "Scan- enhed",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Sletning mislykkedes. Porten er måske offline. Vil du tvinge slette data?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Følg systemet",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Efter nulstilling vil låsens fingeraftryk blive slettet. Er du sikker på at du vil nulstille den?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Efter nulstilling, fjernbetjeningen af låsen vil blive slettet. Vil du nulstille den?",
"版本说明": "Versionsbeskrivelse",
"版本说明": "Versionsbeskrivelse"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Die Passwörter sind inkonsistent",
"中功率": "Mittlere Leistung",
"常规使用": "Regelmäßige Verwendung",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nachdem das Gateway eingesc haltet ist, drücken und halten Sie die Reset-Taste für 5 Sekunden, und klicken Sie auf Weiter, wenn die Kontroll leuchte blinkt abwechselnd",
"扫描设备": "Scan-Gerät",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Löschung fehl geschlagen. Das Gateway ist möglicher weise offline gegangen. Möchten Sie das Löschen der Daten erzwingen?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Οι κωδικοί πρόσβασης δεν είναι συνεπείς.",
"中功率": "Μέση ισχύς",
"常规使用": "Κανονική χρήση:",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Αφού ενεργοποιηθεί η πύλη, πατήστε και κρατήστε το κουμπί επαναφοράς για 5 δευτερόλεπτα, και κάντε κλικ Next όταν το φως δείκτη αναβοσβήνει εναλλάξα",
"扫描设备": "Συσκευή σάρωσης",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Η διαγραφή απέτυχε. Η πύλη μπορεί να έχει εκτός λειτουργίας. Θέλετε να αναγκάσετε τη διαγραφή των δεδομένων;",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Ακολουθήστε το σύστημα",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, τα αποτυπώματα της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να το επαναφέρετε;",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, το τηλεχειριστήριο της κλειδαριάς θα διαγραφεί. Θέλεις να το επαναφέρεις;",
"版本说明": "Περιγραφή έκδοσης",
"版本说明": "Περιγραφή έκδοσης"
}

View File

@ -217,7 +217,6 @@
"添加网关": "Add Gateway",
"重新通电": "Re Connect the Power",
"指示灯": "Indicator Light",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds, and click Next when the indicator light flashes alternately",
"选择网关": "Choose Gateway",
"不支持5G WiFi网络请选择2.4G WiFi网络进行配置": "5G is not supported,.Please select a WiFi of 2.4G.",
"WiFi密码": "WiFi Passward",
@ -1128,5 +1127,6 @@
"正在说话...": "Talking now...",
"下载完成,请到相册查看": "Download completed, please go to the album to view",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "After reset, the remote control of the lock will be deleted. Do you want to reset it?",
"版本说明": "Version description"
"版本说明": "Version description",
"网关通电后长按重置按钮5秒蓝色指示灯闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds. Click Next when the blue indicator light flashes"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Las contraseñas son inconsistentes",
"中功率": "Potencia media",
"常规使用": "Uso regular",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Después de encender la puerta de enlace, mantenga presionado el botón de reinicio durante 5 segundos y haga clic en Siguiente cuando la luz indicadora parpadee alternativamente",
"扫描设备": "Dispositivo de exploración",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Falló la eliminación. Es posible que la puerta de enlace se haya desconectado. ¿Desea forzar la eliminación de los datos?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Paroolid ei ole järjekindlad",
"中功率": "Keskmine võimse",
"常规使用": "Regulaarne kasutamine",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Kui värav on sisse lülitatud, vajutage ja hoidke nuppu 5 sekundit, ja klõpsa Järgmine, kui indikaator valgus vilgub vaheldumisel",
"扫描设备": "Skaneerimisseade",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Kustutamine nurjus. Värav võis välja lülitada. Kas soovid kustutada andmed?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Süsteemi jälgimine",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku sõrmejäljed. Kas tõesti soovid see lähtestada?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku kaugjuhtimine. Kas sa tahad seda lähtestada?",
"版本说明": "Versiooniteave",
"版本说明": "Versiooniteave"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Salasanat ovat epäjohdonmukaiset.",
"中功率": "Keskimääräinen teho",
"常规使用": "Säännöllinen käyttö",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Kun portti on käytössä, paina ja pidä painiketta nollauspainiketta 5 sekunnin ajan, ja klikkaa Seuraava kun ilmaisin valo vilkkuu vuorotellensa",
"扫描设备": "Skannauslaite",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Poisto epäonnistui. Portti on ehkä pois päältä. Haluatko pakottaa poistamaan tiedot?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Seuraa järjestelmää",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Lukon sormenjäljet poistetaan. Haluatko varmasti nollataa sen?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Nollauksen jälkeen lukon kaukosäädin poistetaan. Haluatko palauttaa sen?",
"版本说明": "Versio",
"版本说明": "Versio"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Les mots de passe sont incohérents",
"中功率": "Puissance moyenne",
"常规使用": "Utilisation régulière",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Une fois la passerelle allumée, appuyez et maintenez enfoncé le bouton de réinitialisation pendant 5 secondes, puis cliquez sur Suivant lorsque le voyant clignote alternativement",
"扫描设备": "Appareil de numérisation",
"删除失败,网关可能已经离线,是否强制删除该数据?": "La suppression a échoué. La passerelle est peut-être hors ligne. Voulez-vous forcer la suppression des données?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Suivre le système",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Après réinitialisation, les empreintes digitales de la serrure seront supprimées. Êtes-vous sûr de vouloir le réinitialiser?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Après réinitialisation, la télécommande du verrou sera supprimée. Voulez-vous le réinitialiser?",
"版本说明": "Explication de la version",
"版本说明": "Explication de la version"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "הסיסמאות אינן עקביות",
"中功率": "כוח בינוני",
"常规使用": "שימוש קבוע",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "לאחר השער מופעל, לחץ והחזק את כפתור איפוס עבור 5 שניות, ולחץ על הבא כאשר מחוון אור מהבהב לסירוגין",
"扫描设备": "התקן סריקה",
"删除失败,网关可能已经离线,是否强制删除该数据?": "מחיקה נכשלה. ייתכן שהשער נעלם מהרשת. האם ברצונך לאלץ למחוק את הנתונים?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "מערכת מעקב",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "לאחר איפוס, טביעות האצבעות של המנעול יימחקו. אתה בטוח שברצונך לאפס את זה?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "לאחר איפוס, השליטה מרחוק של המנעול יימחק. אתה רוצה לאפס את זה?",
"版本说明": "המידע על גרסה",
"版本说明": "המידע על גרסה"
}

View File

@ -217,7 +217,6 @@
"添加网关": "添加網關",
"重新通电": "重新連接電源",
"指示灯": "指示燈",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "網關上電之後長按復位鍵5秒指示燈交替閃爍時點擊下一步",
"选择网关": "選擇Gateway (網關)",
"不支持5G WiFi网络请选择2.4G WiFi网络进行配置": "唔撐5G。 請選擇2.4G嘅WiFi。",
"WiFi密码": "WiFi通行證",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Šifre nisu dosljedne",
"中功率": "Srednja snaga",
"常规使用": "Redovna upotreba",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nakon što se prolaz ukljuèi, pritisnite i zadržite dugme za reset 5 sekundi, i kliknite Sljedeća kada svjetlost indikatora izmijeniti",
"扫描设备": "Skeniraj uređaj",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Brisanje nije uspjelo. Prolaz je možda nestao. Želite li prisiliti brisati podatke?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Prati sistem:",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Nakon resetovanja, otisci brave će biti izbrisani. Jeste li sigurni da ga želite resetirati?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Nakon resetovanja, daljinski upravljač brave će biti izbrisan. Hoæeš da ga resetuješ?",
"版本说明": "Informacije o verziji",
"版本说明": "Informacije o verziji"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "A jelszavak nem következetesek",
"中功率": "Közepes teljesítmény",
"常规使用": "Rendszeres használat",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Miután az átjáró be van kapcsolva, nyomja meg és tartsa a reset gombot 5 másodpercig, és kattintson a következő gombra, amikor a jelző fény felváltva villog",
"扫描设备": "Beolvasási eszköz",
"删除失败,网关可能已经离线,是否强制删除该数据?": "A törlés nem sikerült. Az átjáró lehet, hogy offline lett. Szeretné kényszeríteni az adatok törlését?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Follow system",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "A reset után a zár ujjlenyomatai törlődnek. Biztos vagy benne, hogy vissza szeretné állítani?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "A reset után a zár távirányítója törlődik. Szeretné visszaállítani?",
"版本说明": "Versió leírás",
"版本说明": "Versió leírás"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Kata sandi tidak konsisten",
"中功率": "Kekuatan sedang",
"常规使用": "Penggunaan biasa",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Setelah gateway menyala, tekan dan tahan tombol reset selama 5 detik, dan klik berikutnya ketika lampu indikator berkedip secara bersamaan",
"扫描设备": "Perangkat Pindai",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Penghapusan gagal. Gateway mungkin telah offline. Ingin menghapus data?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Sistem mengikuti",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Setelah mengulang, sidik jari kunci akan dihapus. Yakin ingin meresetnya?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Setelah reset, remote control kunci akan dihapus. Ingin mengatur ulang?",
"版本说明": "Catatan versi",
"版本说明": "Catatan versi"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Le password sono incoerenti",
"中功率": "Potenza media",
"常规使用": "Uso regolare",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Dopo aver acceso il gateway, tenere premuto il pulsante di ripristino per 5 secondi e fare clic su Avanti quando l'indicatore luminoso lampeggia alternativamente",
"扫描设备": "Dispositivo di scansione",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Eliminazione non riuscita. Il gateway potrebbe essere andato offline. Vuoi forzare l'eliminazione dei dati?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "パスワードが一致しない",
"中功率": "ミディアムパワー",
"常规使用": "通常の使用",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "ゲートウェイの電源がオンになった後、リセットボタンを5秒間押し続け、インジケーターライトが交互に点滅したら [次へ] をクリックします。",
"扫描设备": "スキャン装置",
"删除失败,网关可能已经离线,是否强制删除该数据?": "削除に失敗しました。ゲートウェイがオフラインになった可能性があります。強制的にデータを削除しますか?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "システムに従う",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "リセット後、ロックの指紋は削除されます。リセットしてもよろしいですか。",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "リセット後、ロックのリモコンが削除されます。リセットしますか?",
"版本说明": "バージョン説明",
"版本说明": "バージョン説明"
}

View File

@ -219,7 +219,7 @@
"添加网关": "添加网关",
"重新通电": "重新通电",
"指示灯": "指示灯",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步",
"网关通电后长按重置按钮5秒蓝色指示灯闪烁时点击下一步": "网关通电后长按重置按钮5秒蓝色指示灯闪烁时点击下一步",
"选择网关": "选择网关",
"不支持5G WiFi网络请选择2.4G WiFi网络进行配置": "不支持5G WiFi网络请选择2.4G WiFi网络进行配置",
"WiFi密码": "WiFi密码",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Парольдер болмаған",
"中功率": "Орташа қуары",
"常规使用": "Қалыпты қолданылсын",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Келесі періңізнен соң, ысырып тасымалдау батырмасын басып 5 секунд басыңыз, Индикаторның жарықты ауыстырғанда, келесі басыңыз",
"扫描设备": "Сканер құрылғысы",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Өшіру жаңылысы. Келесі жіберді. Деректерді өшіргіңіз келе ме?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Жүйені қолдану",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Қайта ысырып тастау Шынымен ысырып тастауды қалайсыз ба?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Қайта ысырып ысырып тасымалдауын өшіріледі. Оны ысырып тастауды қалайсыз ба?",
"版本说明": "Версиятын көрсету",
"版本说明": "Версиятын көрсету"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "암호가 일치하지 않습니다.",
"中功率": "중간 전력",
"常规使用": "정사이즈 사용",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "게이트웨이의 전원이 켜진 후 5 초 동안 리셋 버튼을 누르고 누르고 표시등이 번갈아 깜박이면 다음 을 클릭하십시오.",
"扫描设备": "스캔 장치",
"删除失败,网关可能已经离线,是否强制删除该数据?": "삭제가 실패했습니다. 게이트웨이가 오프라인 상태일 수 있다. 강제로 데이터 삭제를 하시겠습니까?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "시스템을 따르십시오",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 지문이 삭제됩니다. 당신은 그것을 재설정 하시겠습니까?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 리모컨이 삭제됩니다. 당신은 그것을 재설정 하시겠습니까?",
"版本说明": "버전 설명",
"版本说明": "버전 설명"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Slaptažodžiai yra nenuoseklūs",
"中功率": "Vidutinės galios",
"常规使用": "Reguliarus naudojimas",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Įjungus vartus, 5 sekundes paspauskite ir palaikykite reset mygtuką ir spustelėkite toliau, kai indikatoriaus lemputė mirksi pakaitomis.",
"扫描设备": "Nuskaitymo įrenginys",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Ištrynimas nepavyko. Vartai gali būti neprisijungę. Ar norite priversti ištrinti duomenis?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Sekti sistema",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Po reset užrakto pirštų atspaudai bus ištrinti. Ar tikrai norite jį atkurti?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po reset, nuotolinis valdymo pultas užraktas bus ištrintas. Ar norite jį atkurti?",
"版本说明": "Versijos aprašymas",
"版本说明": "Versijos aprašymas"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Kata laluan tidak konsisten",
"中功率": "Kuasa sederhana",
"常规使用": "Penggunaan biasa",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Selepas pintu masuk dihidupkan, tekan dan tahan butang reset selama 5 saat, dan klik seterusnya apabila lampu penunjuk berkelip bergantian",
"扫描设备": "Imbas peranti",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Penghapusan gagal. Pintu masuk mungkin telah pergi di luar talian. Adakah anda mahu memaksa memadam data?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Ikut system",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, cap jari kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, kawalan jauh kunci akan dipadamkan. Adakah anda mahu menetapkan semula?",
"版本说明": "Penerangan versi",
"版本说明": "Penerangan versi"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "De wachtwoorden zijn inconsistent",
"中功率": "Middelgroot vermogen",
"常规使用": "Regelmatig gebruik",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Nadat de gateway is ingeschakeld, houdt u de resetknop 5 seconden ingedrukt en klikt u op Volgende wanneer het indicatielampje afwisselend knippert",
"扫描设备": "Scan apparaat",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Verwijdering is mislukt. De gateway is mogelijk offline gegaan. Wilt u de gegevens forceren verwijderen?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Systeem volgen",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Na het resetten worden de vingerafdrukken van het slot verwijderd. Weet je zeker dat je het wilt resetten?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Na het resetten wordt de afstandsbediening van het slot verwijderd. Wilt u het resetten?",
"版本说明": "Versieomschrijving",
"版本说明": "Versieomschrijving"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Hasła są niespójne",
"中功率": "Średnia moc",
"常规使用": "Regularne stosowanie",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po włączeniu bramy naciśnij i przytrzymaj przycisk resetowania przez 5 sekund i kliknij przycisk Dalej, gdy wskaźnik miga na przemian",
"扫描设备": "Urządzenie skanujące",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Usunięcie nie powiodło się. Brama mogła zostać wyłączona. Czy chcesz wymusić usunięcie danych?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Śledź system",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Po zresetowaniu odciski palców zamka zostaną usunięte. Czy na pewno chcesz go zresetować?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po zresetowaniu zdalne sterowanie zamkiem zostanie usunięte. Czy chcesz go zresetować?",
"版本说明": "Wersja",
"版本说明": "Wersja"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "As senhas são inconsistentes",
"中功率": "Potência média",
"常规使用": "Uso regular",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Depois que o gateway estiver ligado, pressione e segure o botão de reset por 5 segundos e clique em Next quando a luz indicadora pisca alternadamente",
"扫描设备": "Digitalizar dispositivo",
"删除失败,网关可能已经离线,是否强制删除该数据?": "A eliminação falhou. O gateway pode ter ficado offline. Você quer forçar a exclusão dos dados?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Siga o sistema",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Após a redefinição, as impressões digitais do bloqueio serão apagadas. Tens a certeza que queres redefini-lo?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Após a reinicialização, o controle remoto do bloqueio será excluído. Você quer redefini-lo?",
"版本说明": "Descrição da versão",
"版本说明": "Descrição da versão"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Parolele sunt inconsistente",
"中功率": "Putere medie",
"常规使用": "Utilizare regulată",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "După ce poarta este pornită, apăsați și țineți butonul de resetare timp de 5 secunde, și faceți clic pe Următor atunci când lumina indicatorului se aprinde alternativ.",
"扫描设备": "Dispozitiv de scanare",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Ștergerea a eșuat. Poarta poate s-a oprit. Doriți să forțați ștergerea datelor?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Urmează sistemul:",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "După resetare, amprentele încuietorii vor fi şterse. Sigur doriți să-l resetați?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "După resetare, telecomanda de blocare va fi ştersă. Vrei să-l resetezi?",
"版本说明": "Descrierea versiunii",
"版本说明": "Descrierea versiunii"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Пароли являются несовместимыми",
"中功率": "Средняя мощность",
"常规使用": "Регулярное использование",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "После включения шлюза нажмите и удерживайте кнопку сброса в течение 5 секунд и нажмите «Далее», когда индикатор попеременно начнет мигать.",
"扫描设备": "Устройство сканирования",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Ошибка удаления. Возможно, шлюз ушел в автономный режим. Хотите ли вы принудительно удалить данные?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Следуйте системе",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "После сброса отпечатки пальцев замка будут удалены. Вы уверены, что хотите его перезагрузить?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "После сброса пульт дистанционного управления замком будет удален. А вы хотите его сбросить?",
"版本说明": "Объяснение версии",
"版本说明": "Объяснение версии"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Heslá sú nekonzistentné",
"中功率": "Stredný výkon",
"常规使用": "Pravidelné použitie",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Po zapnutí brány stlačte a podržte tlačidlo reset po dobu 5 sekúnd a kliknite na ďalšie, keď indikátorové svetlo záblesky striedavo",
"扫描设备": "Skenovanie zariadenia",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Vymazanie sa nepodarilo. Brána môže ísť offline. Chcete vynútiť odstránenie údajov?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Лозинке су недоследне",
"中功率": "Средња снага",
"常规使用": "Редовна употреба",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Након што је гатеваи укључен, притисните и држите дугме за ресетовање за 5 секунди, и кликните Следећи када индикатор трепери наизменично",
"扫描设备": "Уређај за скенирање",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Брисање није успело. Гатеваи је можда отишао ван мреже. Да ли желите да присилите брисање података?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Lösenord är inkonsekventa",
"中功率": "Medelse",
"常规使用": "Regelbunden användning",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "När gateway är på, tryck och håll omställningsknappen i 5 sekunder, och klicka Nästa när indikatorljuset blinkar växelvist",
"扫描设备": "Söka enheter",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Borttagning misslyckades. Porten kan ha gått offline. Vill du tvinga bort data?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "รหัสผ่านไม่สอดคล้องกัน",
"中功率": "กำลังไฟปานกลาง",
"常规使用": "ใช้เป็นประจำ",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "หลังจากเปิดเกตเวย์แล้วให้กดปุ่มรีเซ็ตค้างไว้5วินาทีและคลิกถัดไปเมื่อไฟแสดงสถานะกะพริบสลับกัน",
"扫描设备": "อุปกรณ์สแกน",
"删除失败,网关可能已经离线,是否强制删除该数据?": "การลบล้มเหลวเกตเวย์อาจออฟไลน์ไปแล้วคุณต้องการบังคับให้ลบข้อมูลหรือไม่?",
"超级管理员英文": "Super Admin",

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Şifreler tutarsız",
"中功率": "Orta güç",
"常规使用": "Düzenli kullanım",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Ağ geçidi açıldıktan sonra, sıfırlama düğmesine 5 saniye basılı tutun ve gösterge ışığı dönüşümlü olarak yanıp söndüğünde İleri'ye tıklayın.",
"扫描设备": "Tarama cihazı",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Silme başarısız oldu. Ağ geçidi çevrimdışı geçmiş olabilir. Verileri silmeye zorlamak ister misiniz?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Sistemi takip et",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin parmak izleri silinecektir. Sıfırlamak istediğine emin misin?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Sıfırladıktan sonra, kilidin uzaktan kumandası silinecektir. Sıfırlamak ister misin?",
"版本说明": "Sürüm açıklaması",
"版本说明": "Sürüm açıklaması"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "密碼不一致",
"中功率": "媒介權力",
"常规使用": "經常使用",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "網關通電後,按住reset按鈕5秒鐘,當指示燈交替閃爍時單擊Next",
"扫描设备": "掃描設備",
"删除失败,网关可能已经离线,是否强制删除该数据?": "刪除失敗。 網關可能已脫機。 是否要強制刪除數據?",
"超级管理员英文": "超級管理員",
@ -1121,5 +1120,5 @@
"跟随系统": "跟蹤系統",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "重置後,鎖的指紋將被刪除。 是否確實要重置它?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置後,鎖的遙控器將被刪除。 是否要重置它?",
"版本说明": "版本說明",
"版本说明": "版本說明"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Паролі несумісні",
"中功率": "Середня потужність",
"常规使用": "Регулярне використання",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Після ввімкнення шлюзу натисніть і утримуйте кнопку скидання протягом 5 секунд, а потім натисніть «Далі», коли індикатор почне блимати по черзі",
"扫描设备": "Сканування пристрою",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Видалення не вдалося. Можливо, шлюз перейшов в автономний режим. Ви хочете примусово видалити дані?",
"超级管理员英文": "Super Admin",
@ -1121,5 +1120,5 @@
"跟随系统": "Система стеження за",
"重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Після скидання відбитки пальців замка будуть видалені. Ви впевнені, що хочете скинути налаштування?",
"重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Після скидання пульт дистанційного керування замком буде видалено. Хочете його скинути?",
"版本说明": "Опис версії",
"版本说明": "Опис версії"
}

View File

@ -1105,7 +1105,6 @@
"两次密码不一致哦": "Mật khẩu không nhất quán",
"中功率": "Công suất trung bình",
"常规使用": "Sử dụng thường xuyên",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "Sau khi cổng được bật, Nhấn và giữ nút đặt lại trong 5 giây và Nhấp vào tiếp theo khi đèn báo nhấp nháy luân phiên",
"扫描设备": "Thiết bị quét",
"删除失败,网关可能已经离线,是否强制删除该数据?": "Xóa thất bại. Cổng có thể đã tắt. Bạn có muốn buộc xóa dữ liệu không?",
"超级管理员英文": "Super Admin",

View File

@ -218,7 +218,7 @@
"添加网关": "添加网关",
"重新通电": "重新通电",
"指示灯": "指示灯",
"网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步": "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步",
"网关通电后长按重置按钮5秒蓝色指示灯闪烁时点击下一步": "网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步",
"选择网关": "选择网关",
"不支持5G WiFi网络请选择2.4G WiFi网络进行配置": "不支持5G WiFi网络请选择2.4G WiFi网络进行配置",
"WiFi密码": "WiFi密码",

View File

@ -4,14 +4,15 @@ import 'package:firebase_core/firebase_core.dart'
show Firebase, FirebaseOptions;
import 'package:flutter/foundation.dart'
show defaultTargetPlatform, kIsWeb, TargetPlatform;
import 'package:star_lock/flavors.dart';
class DefaultFirebaseOptions {
static FirebaseOptions get currentPlatform {
switch (defaultTargetPlatform) {
case TargetPlatform.android:
return android;
case TargetPlatform.iOS:
return ios;
switch (F.appFlavor) {
case Flavor.sky:
return sky_android;
case Flavor.xhj_bundle:
return xhj_android;
default:
throw UnsupportedError(
'DefaultFirebaseOptions are not supported for this platform.',
@ -19,14 +20,22 @@ class DefaultFirebaseOptions {
}
}
static const FirebaseOptions android = FirebaseOptions(
static const FirebaseOptions sky_android = FirebaseOptions(
apiKey: 'AIzaSyC-3-ABWuy9LrYyAw_KxDRto4DanQ0sq9g',
appId: '1:281500445726:android:ddf52ac7b7f83cf5c4d20f',
messagingSenderId: '281500445726',
projectId: 'skychip2023-ecdff',
projectId: 'smart-lock-12b8c',
storageBucket: 'skychip2023-ecdff.firebasestorage.app',
);
static const FirebaseOptions xhj_android = FirebaseOptions(
apiKey: 'AIzaSyAm8dJlBY5hjslJDVDBNd2bkWrJlGjAMqw',
appId: '1:448746601330:android:1a8056175e1dad5e317beb',
messagingSenderId: '448746601330',
projectId: 'smart-lock-12b8c',
storageBucket: 'smart-lock-12b8c.firebasestorage.app',
);
static const FirebaseOptions ios = FirebaseOptions(
apiKey: 'AIzaSyACbp5aUKhLU1SMg8iIdm9WmNX7wxI7fVc',
appId: '1:281500445726:ios:b194ccffb92fb86cc4d20f',
@ -51,9 +60,14 @@ class FirebaseHelper {
}
Future<void> initApp() async {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
const bool isProductVmMode = bool.fromEnvironment('dart.vm.product');
if (F.isProductionEnv &&
isProductVmMode &&
defaultTargetPlatform == TargetPlatform.android) {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
}
}
Future<void> initSdk() async {

View File

@ -1,4 +1,3 @@
import 'package:star_lock/app_settings/app_settings.dart';
import 'io_tool/io_manager.dart';
@ -8,12 +7,14 @@ abstract class IOData {
List<int> messageDetail();
}
abstract class SenderProtocol extends IOData { //
abstract class SenderProtocol extends IOData {
//
// final int? tail = 0xFF; // CRC 2
SenderProtocol(this.commandType) {
_commandIndex = IoManager().commandIndex;
}
// var uint8View1 = Uint8List(300);
CommandType? commandType; //
@ -33,8 +34,7 @@ abstract class SenderProtocol extends IOData { //数据块
void printLog(List<int> data) {
AppLog.log(
"App -> 锁,指令类型:${commandType!.typeName} ${commandType!.typeValue == 0x3030
? '子命令:${data[3]}' : ''} \n参数是:\n${toString()} \n加密之前数据是:\n$data :${data.length}");
"App -> 锁,指令类型:${commandType!.typeName} ${commandType!.typeValue == 0x3030 ? '子命令:${data[3]}' : ''} \n参数是:\n${toString()} \n加密之前数据是:\n$data 长度是:${data.length}");
}
//

View File

@ -8,6 +8,7 @@ enum Flavor {
sky_dev,
sky_pre,
xhj,
xhj_bundle,
xhj_dev,
xhj_pre,
}
@ -48,6 +49,7 @@ class F {
static bool get isXHJ =>
appFlavor == Flavor.xhj ||
appFlavor == Flavor.xhj_bundle ||
appFlavor == Flavor.xhj_dev ||
appFlavor == Flavor.xhj_pre;
@ -71,6 +73,7 @@ class F {
case Flavor.dev:
case Flavor.pre:
case Flavor.xhj:
case Flavor.xhj_bundle:
default:
return xhjCall();
}
@ -89,6 +92,7 @@ class F {
case Flavor.sky_pre:
return '锁通通'.tr;
case Flavor.xhj:
case Flavor.xhj_bundle:
case Flavor.xhj_dev:
case Flavor.xhj_pre:
return '星星锁'.tr;
@ -110,6 +114,7 @@ class F {
case Flavor.sky_pre:
return '锁通通'.tr;
case Flavor.xhj:
case Flavor.xhj_bundle:
case Flavor.xhj_dev:
case Flavor.xhj_pre:
return '星星锁'.tr;
@ -136,6 +141,7 @@ class F {
case Flavor.sky:
return 'https://lock.skychip.top';
case Flavor.xhj:
case Flavor.xhj_bundle:
return 'https://lock.xhjcn.ltd';
// return 'https://pre.lock.star-lock.cn';
default:
@ -186,6 +192,9 @@ class F {
return const StarLockAMapKey(
androidKey: '9dd8073a2e96870b206269bb562a887a',
iosKey: 'c70047e60ce704d945ea89d6c2763b82');
case Flavor.xhj_bundle:
return const StarLockAMapKey(
androidKey: 'c47fa8e1d9e2a25321dbee75e1ff7790', iosKey: '');
default:
return const StarLockAMapKey(
androidKey: 'no valied key',
@ -250,6 +259,28 @@ class F {
}
}
// StarLockAMapKey
static String get jPushKey {
switch (appFlavor) {
case Flavor.local:
case Flavor.dev:
case Flavor.pre:
return '';
case Flavor.sky_dev:
case Flavor.sky_pre:
case Flavor.sky:
return '7ff37d174c1a568a89e98dad';
case Flavor.xhj_dev:
case Flavor.xhj_pre:
case Flavor.xhj:
return '251fc8074820d122b6de58d2';
case Flavor.xhj_bundle:
return '5ccdb9b8d3faaae66ba5d02e';
default:
return '';
}
}
//
static bool get isProductionEnv {
switch (appFlavor) {
@ -259,6 +290,7 @@ class F {
return false;
case Flavor.sky:
case Flavor.xhj:
case Flavor.xhj_bundle:
return true;
default:
return false;

View File

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/main/lockDetail/card/addICCard/addICCard_entity.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -52,11 +53,11 @@ class AddICCardLogic extends BaseGetXController {
switch (status) {
case 0x00:
//
final List<int> cardNumberList =
reply.data.sublist(reply.data.length - 2);
final String cardNumber = listChangInt(cardNumberList).toString();
// AppLog.log("添加卡号:$cardNumberList cardNumber:$cardNumber");
state.cardNumber.value = cardNumber.toString();
// final List<int> cardNumberList =
// reply.data.sublist(reply.data.length - 2);
// final String cardNumber = listChangInt(cardNumberList).toString();
// // AppLog.log("添加卡号:$cardNumberList cardNumber:$cardNumber");
// state.cardNumber.value = cardNumber.toString();
cancelBlueConnetctToastTimer();
state.ifAddState.value = true;
@ -134,6 +135,10 @@ class AddICCardLogic extends BaseGetXController {
'date': DateTool().getNowDateWithType(1),
'add_card_result': '成功',
});
AppLog.log('data:${reply.data}');
final List<int> cardNumberList = reply.data.sublist(6, 8);
final String cardNumber = listChangInt(cardNumberList).toString();
state.cardNumber.value = cardNumber.toString();
switch (reply.data[5]) {
case 0xff:
//

View File

@ -47,6 +47,8 @@ class CatEyeCustomModeLogic extends BaseGetXController {
}
}
}
await _getConfigAndGenerateBleData();
updateCatEyeSetConfig();
return entity;
}
@ -79,8 +81,7 @@ class CatEyeCustomModeLogic extends BaseGetXController {
);
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr);
_getConfigAndGenerateBleData();
updateCatEyeSetConfig();
await getLockSettingInfoData();
}
}
@ -206,14 +207,6 @@ class CatEyeCustomModeLogic extends BaseGetXController {
privateKey: getPrivateKeyList,
);
final packageData = command.packageData();
// List<int>
String hexString = packageData
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
AppLog.log('open lock hexString: $hexString');
///
StartChartManage().sendBleMessage(
bluetoothDeviceName: BlueManage().connectDeviceName,

View File

@ -29,7 +29,7 @@ class CatEyeSetLogic extends BaseGetXController {
state.catEyeConfig.value.autoLightScreen =
state.isAutoBright.value == true ? 1 : 0;
state.catEyeConfig.refresh();
updateCatEyeSetConfig();
await getLockSettingInfoData();
}
}
@ -46,7 +46,7 @@ class CatEyeSetLogic extends BaseGetXController {
state.catEyeConfig.value.autoLightScreenTime =
int.parse(state.selectBrightDuration.value.replaceAll(''.tr, ''));
state.catEyeConfig.refresh();
updateCatEyeSetConfig();
await getLockSettingInfoData();
}
}
@ -62,7 +62,7 @@ class CatEyeSetLogic extends BaseGetXController {
state.catEyeConfig.value.autoLightScreen =
state.isStayWarning.value == true ? 1 : 0;
state.catEyeConfig.refresh();
updateCatEyeSetConfig();
await getLockSettingInfoData();
}
}
@ -78,7 +78,7 @@ class CatEyeSetLogic extends BaseGetXController {
state.catEyeConfig.value.autoLightScreen =
state.isExceptionWarning.value == true ? 1 : 0;
state.catEyeConfig.refresh();
updateCatEyeSetConfig();
await getLockSettingInfoData();
}
}
@ -137,14 +137,14 @@ class CatEyeSetLogic extends BaseGetXController {
XSConstantMacro.catEyeWorkModeCustom) {
state.selectCatEyeWorkMode.value = '自定义模式'.tr;
}
_getConfigAndGenerateBleData();
updateCatEyeSetConfig();
}
}
await _getConfigAndGenerateBleData();
updateCatEyeSetConfig();
return entity;
}
_getConfigAndGenerateBleData() {
_getConfigAndGenerateBleData() async {
// state.lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0].catEyeMode
int originalCatEyeMode = state
.lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0].catEyeMode!;
@ -168,13 +168,19 @@ class CatEyeSetLogic extends BaseGetXController {
int recordTime = _handleGetIntNumber(state.lockSetInfoData.value
.lockSettingInfo!.catEyeConfig![0].catEyeModeConfig!.recordTime!);
int detectionDistance = _handleDetectionDistance(state
.lockSetInfoData
.value
.lockSettingInfo!
.catEyeConfig![0]
.catEyeModeConfig!
.detectionDistance!);
int detectionDistance = 0;
if (state.lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0]!
.catEyeModeConfig!.detectionDistance !=
null) {
detectionDistance = _handleDetectionDistance(state
.lockSetInfoData
.value
.lockSettingInfo!
.catEyeConfig![0]
.catEyeModeConfig!
.detectionDistance!);
}
int realTimeMode = state.lockSetInfoData.value.lockSettingInfo!
.catEyeConfig![0].catEyeModeConfig!.realTimeMode!;
@ -254,10 +260,10 @@ class CatEyeSetLogic extends BaseGetXController {
final List<String>? publicKey =
await Storage.getStringList(saveBluePublicKey);
final List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
final userId = await Storage.getUid();
final command = SetSupportFunctionsWithParametersCommand(
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
userID: await Storage.getUid(),
userID: userId,
featureBit: 64,
featureParaLength: config.length,
featureData: config,
@ -273,7 +279,7 @@ class CatEyeSetLogic extends BaseGetXController {
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
AppLog.log('open lock hexString: $hexString');
AppLog.log('发送透传猫眼设置: $hexString');
///
StartChartManage().sendBleMessage(
@ -344,10 +350,10 @@ class CatEyeSetLogic extends BaseGetXController {
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(recordStartTime);
//
int hour = dateTime.hour;
int minute = dateTime.minute;
// int hour = dateTime.hour;
// int minute = dateTime.minute;
print("时: $hour, 分: $minute");
// print("时: $hour, 分: $minute");
// 0
int minutesSinceMidnight = dateTime.hour * 60 + dateTime.minute;

View File

@ -1,12 +1,16 @@
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsWithParameters.dart';
import 'package:star_lock/blue/io_tool/io_tool.dart';
import 'package:star_lock/blue/sender_manage.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart';
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeWorkMode/catEyeWorkMode_state.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/talk/starChart/star_chart_manage.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/versionUndate/versionUndate_entity.dart';
@ -56,6 +60,8 @@ class CatEyeWorkModeLogic extends BaseGetXController {
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr);
getLockSettingInfoData();
updateCatEyeSetConfig();
}
}
@ -122,7 +128,252 @@ class CatEyeWorkModeLogic extends BaseGetXController {
XSConstantMacro.catEyeWorkModeCustom) {
state.boolList.value = <bool>[false, false, false, true];
}
_getConfigAndGenerateBleData();
updateCatEyeSetConfig();
}
}
}
_getConfigAndGenerateBleData() {
// state.lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0].catEyeMode
int originalCatEyeMode = state
.lockSetInfoData.value.lockSettingInfo!.catEyeConfig![0].catEyeMode!;
int recordMode = state.lockSetInfoData.value.lockSettingInfo!
.catEyeConfig![0].catEyeModeConfig!.recordMode ==
0
? 1
: 0;
int stayWarn = state.lockSetInfoData.value.lockSettingInfo!.stayWarn!;
int abnormalWarn =
state.lockSetInfoData.value.lockSettingInfo!.abnormalWarn!;
int autoLightScreen =
state.lockSetInfoData.value.lockSettingInfo!.autoLightScreen!;
int recordStartTime = _handleTimeToM(state.lockSetInfoData.value
.lockSettingInfo!.catEyeConfig![0].catEyeModeConfig!.recordStartTime!);
int recordEndTime = _handleTimeToM(state.lockSetInfoData.value
.lockSettingInfo!.catEyeConfig![0].catEyeModeConfig!.recordEndTime!);
int recordTime = _handleGetIntNumber(state.lockSetInfoData.value
.lockSettingInfo!.catEyeConfig![0].catEyeModeConfig!.recordTime!);
int detectionDistance = _handleDetectionDistance(state
.lockSetInfoData
.value
.lockSettingInfo!
.catEyeConfig![0]
.catEyeModeConfig!
.detectionDistance!);
int realTimeMode = state.lockSetInfoData.value.lockSettingInfo!
.catEyeConfig![0].catEyeModeConfig!.realTimeMode!;
// catEyeMode
int adjustedCatEyeMode =
originalCatEyeMode > 0 ? originalCatEyeMode - 1 : originalCatEyeMode;
int brightScreenTime =
state.lockSetInfoData.value.lockSettingInfo!.autoLightScreenTime!;
/// v0.2
state.catEyeConfig.value = CatEyeSetEntity(
catEyeMode: adjustedCatEyeMode,
//
recordMode: recordMode,
// 0 1
recordStartTime: recordStartTime,
//recordStartTime与recordEndTime参数
recordEndTime: recordEndTime,
//recordStartTime与recordEndTime参数
realTimeMode: realTimeMode,
autoLightScreenTime: brightScreenTime,
stayWarn: stayWarn,
autoLightScreen: autoLightScreen,
//
abnormalWarn: abnormalWarn,
//
recordTime: recordTime,
//
detectionDistance: detectionDistance,
realTimePicture: realTimeMode,
);
state.catEyeConfig.refresh();
}
///
void updateCatEyeSetConfig() async {
final int operatingMode = state.catEyeConfig.value.catEyeMode ?? 1; //
final int isAllDay = state.catEyeConfig.value.recordMode ?? 1; //
final int startTime =
state.catEyeConfig.value.recordStartTime ?? 480; // 8:00 AM
final int endTime =
state.catEyeConfig.value.recordEndTime ?? 1080; // 6:00 PM
final int recordingTime = state.catEyeConfig.value.recordTime ?? 0; //
final int detectionDistance =
state.catEyeConfig.value.detectionDistance ?? 0; //0:0.8
final int realTimePicture =
state.catEyeConfig.value.realTimePicture ?? 0; //
final int automaticBrightening =
state.catEyeConfig.value.autoLightScreen ?? 1; //
final int brightScreenTime =
state.catEyeConfig.value.autoLightScreenTime ?? 10; // 15
final int stayWarning = state.catEyeConfig.value.stayWarn ?? 1; //
final int exceptionWarning =
state.catEyeConfig.value.abnormalWarn ?? 1; //
/// 0
final List<int> config = generateConfig(
operatingMode: operatingMode,
isAllDay: isAllDay,
startTime: startTime,
endTime: endTime,
recordingTime: recordingTime,
detectionDistance: detectionDistance,
realTimePicture: realTimePicture,
automaticBrightening: automaticBrightening,
brightScreenTime: brightScreenTime,
stayWarning: stayWarning,
exceptionWarning: exceptionWarning,
);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
final List<String>? publicKey =
await Storage.getStringList(saveBluePublicKey);
final List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
final command = SetSupportFunctionsWithParametersCommand(
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
userID: await Storage.getUid(),
featureBit: 64,
featureParaLength: config.length,
featureData: config,
token: getTokenList,
needAuthor: 1,
publicKey: getPublicKeyList,
privateKey: getPrivateKeyList,
);
final packageData = command.packageData();
// List<int>
String hexString = packageData
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
AppLog.log('catEye set: $hexString');
///
StartChartManage().sendBleMessage(
bluetoothDeviceName: BlueManage().connectDeviceName,
bleStructData: packageData,
);
}
//
List<int> generateConfig({
required int operatingMode,
required int isAllDay,
required int startTime,
required int endTime,
required int recordingTime,
required int detectionDistance,
required int realTimePicture,
required int automaticBrightening,
required int brightScreenTime,
required int stayWarning,
required int exceptionWarning,
}) {
//
List<int> config = [];
// operatingMode
config.add(operatingMode);
// 0
if (operatingMode != 3) {
config.addAll(
[0, 0, 0, 0, 0, 0]); // IsAllDay, StartTime, EndTime, recordingTime
} else {
config.add(isAllDay);
config.addAll(_intToBytes(startTime, 2)); // StartTime 2
config.addAll(_intToBytes(endTime, 2)); // EndTime 2
config.add(recordingTime);
}
// detectionDistance realTimePicture 0
if (operatingMode != 3) {
config.addAll([0, 0]);
} else {
config.add(detectionDistance);
config.add(realTimePicture);
}
//
config.add(automaticBrightening);
config.add(brightScreenTime);
config.add(stayWarning);
config.add(exceptionWarning);
return config;
}
//
List<int> _intToBytes(int value, int length) {
List<int> bytes = [];
for (int i = length - 1; i >= 0; i--) {
bytes.add((value >> (8 * i)) & 0xFF);
}
return bytes;
}
int _handleTimeToM(int recordStartTime) {
// DateTime
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(recordStartTime);
//
int hour = dateTime.hour;
int minute = dateTime.minute;
print("时: $hour, 分: $minute");
// 0
int minutesSinceMidnight = dateTime.hour * 60 + dateTime.minute;
return minutesSinceMidnight;
}
int _handleGetIntNumber(String recordTime) {
if (recordTime == '不录像') {
return 0;
}
if (recordTime == '立即录像') {
return 1;
}
// 使
RegExp regExp = RegExp(r'(\d+)秒');
Match? match = regExp.firstMatch(recordTime);
if (match != null && match.groupCount >= 1) {
//
int number = int.parse(match.group(1)!);
return number;
} else {
return 0;
}
}
int _handleDetectionDistance(String s) {
if (s == '约0.8米') {
return 0;
}
if (s == '约1.5米') {
return 1;
}
if (s == '约3.0米') {
return 2;
}
return 0;
}
}

View File

@ -1,4 +1,5 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_state.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart';
class CatEyeWorkModeState {
@ -31,4 +32,6 @@ class CatEyeWorkModeState {
// var selectCatEyeWorkMode = 0.obs; //
RxList<bool> boolList = <bool>[false, false, false, false].obs;
Rx<CatEyeConfig> catEyeConfigData = CatEyeConfig().obs;
///
Rx<CatEyeSetEntity> catEyeConfig = CatEyeSetEntity().obs;
}

View File

@ -238,7 +238,6 @@ class VideoSlotLogic extends BaseGetXController {
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
AppLog.log('open lock hexString: $hexString');
///
StartChartManage().sendBleMessage(

View File

@ -199,13 +199,6 @@ class LiveVideoLogic extends BaseGetXController {
);
final packageData = command.packageData();
// List<int>
String hexString = packageData
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
AppLog.log('open lock hexString: $hexString');
///
StartChartManage().sendBleMessage(
bluetoothDeviceName: BlueManage().connectDeviceName,

View File

@ -4,7 +4,7 @@ import 'flavors.dart';
import 'main.dart' as runner;
Future<void> main() async {
F.appFlavor = Flavor.xhj;
F.appFlavor = Flavor.pre;
// AppLog.log('local调用了main函数');
await runner.main();
}

View File

@ -4,7 +4,7 @@ import 'flavors.dart';
import 'main.dart' as runner;
Future<void> main() async {
F.appFlavor = Flavor.xhj;
F.appFlavor = Flavor.xhj_bundle;
F.isLite = true;
// AppLog.log('xhj_lite调用了main函数');
await runner.main();

View File

@ -36,15 +36,15 @@ class _GatewayConfigurationWifiPageState
backgroundColor: AppColors.mainColor),
body: Column(
children: <Widget>[
// Container(
// width: 1.sw,
// color: const Color(0xFFF2F6F9),
// padding: EdgeInsets.all(15.h),
// child: Text(
// '不支持5G WiFi网络请选择2.4G WiFi网络进行配置'.tr,
// style: TextStyle(
// color: AppColors.darkGrayTextColor, fontSize: 20.sp),
// )),
Container(
width: 1.sw,
color: const Color(0xFFF2F6F9),
padding: EdgeInsets.all(15.h),
child: Text(
'不支持5G WiFi网络请选择2.4G WiFi网络进行配置'.tr,
style: TextStyle(
color: AppColors.darkGrayTextColor, fontSize: 20.sp),
)),
Expanded(
child: ListView(
children: <Widget>[

View File

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -128,11 +129,26 @@ class GatewayGetWifiListLogic extends BaseGetXController {
}, isAddEquipment: true);
}
final NetworkInfo _networkInfo = NetworkInfo();
Future<String> getWifiName() async {
String ssid = '';
ssid = (await _networkInfo.getWifiName())!;
ssid = ssid ?? '';
ssid = ssid.replaceAll(r'"', '');
return ssid ?? '';
}
@override
void onReady() {
super.onReady();
_initReplySubscription();
getWifiName().then((String value) {
state.phoneConnectedWiFi = value;
// update();
// AppLog.log('wifiNameTF:${state.wifiNameTF.text} value:$value');
});
}
@override

View File

@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -20,9 +19,11 @@ class GatewayGetWifiListPage extends StatefulWidget {
State<GatewayGetWifiListPage> createState() => _GatewayGetWifiListPageState();
}
class _GatewayGetWifiListPageState extends State<GatewayGetWifiListPage> with RouteAware{
class _GatewayGetWifiListPageState extends State<GatewayGetWifiListPage>
with RouteAware {
final GatewayGetWifiListLogic logic = Get.put(GatewayGetWifiListLogic());
final GatewayGetWifiListState state = Get.find<GatewayGetWifiListLogic>().state;
final GatewayGetWifiListState state =
Get.find<GatewayGetWifiListLogic>().state;
@override
Widget build(BuildContext context) {
@ -34,7 +35,8 @@ class _GatewayGetWifiListPageState extends State<GatewayGetWifiListPage> with Ro
actionsList: <Widget>[
TextButton(
child: Text(
'刷新'.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp),
'刷新'.tr,
style: TextStyle(color: Colors.white, fontSize: 24.sp),
),
onPressed: logic.senderGetWifiListWifiAction,
),
@ -43,17 +45,25 @@ class _GatewayGetWifiListPageState extends State<GatewayGetWifiListPage> with Ro
body: Column(
children: <Widget>[
Expanded(
child: Obx(() => state.wifiNameDataList.value.isNotEmpty ? ListView.builder(
itemCount: state.wifiNameDataList.value.length,
itemBuilder: (BuildContext c, int index) {
Map wifiNameStr = state.wifiNameDataList.value[index];
return _messageListItem(wifiNameStr['wifiName'], wifiNameStr['rssi'], () {
Get.toNamed(Routers.gatewayConfigurationWifiPage, arguments: {
'wifiName': wifiNameStr['wifiName'],
'gatewayModel': state.gatewayModel
});
});
}) : NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight - 64.h)),
child: Obx(() => state.wifiNameDataList.value.isNotEmpty
? ListView.builder(
itemCount: state.wifiNameDataList.value.length,
itemBuilder: (BuildContext c, int index) {
Map wifiNameStr = state.wifiNameDataList.value[index];
return _messageListItem(
wifiNameStr['wifiName'], wifiNameStr['rssi'], () {
Get.toNamed(Routers.gatewayConfigurationWifiPage,
arguments: {
'wifiName': wifiNameStr['wifiName'],
'gatewayModel': state.gatewayModel
});
});
})
: NoData(
noDataHeight: 1.sh -
ScreenUtil().statusBarHeight -
ScreenUtil().bottomBarHeight -
64.h)),
),
SubmitBtn(
btnName: '手动配网'.tr,
@ -70,8 +80,7 @@ class _GatewayGetWifiListPageState extends State<GatewayGetWifiListPage> with Ro
height: 64.h,
)
],
)
);
));
}
Widget _messageListItem(String wifiName, String rssi, Function() action) {
@ -93,7 +102,7 @@ class _GatewayGetWifiListPageState extends State<GatewayGetWifiListPage> with Ro
children: <Widget>[
SizedBox(
height: 79.h,
width: 1.sw - 20.w*2,
width: 1.sw - 20.w * 2,
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
@ -103,7 +112,10 @@ class _GatewayGetWifiListPageState extends State<GatewayGetWifiListPage> with Ro
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 22.sp, color: AppColors.blackColor),
fontSize: 22.sp,
color: state.phoneConnectedWiFi == wifiName
? AppColors.mainColor
: AppColors.blackColor),
),
),
// Text(

View File

@ -1,10 +1,8 @@
import 'package:get/get.dart';
import '../selectGateway/getGatewayInfo_model.dart';
class GatewayGetWifiListState{
class GatewayGetWifiListState {
GatewayGetWifiListState() {
var map = Get.arguments;
if (map['gatewayModel'] != null && map['gatewayModel'] != '') {
@ -12,9 +10,11 @@ class GatewayGetWifiListState{
}
}
final RxList<Map<String, String>> wifiNameDataList = <Map<String, String>>[].obs;
final RxList<Map<String, String>> wifiNameDataList =
<Map<String, String>>[].obs;
GetGatewayInfoModel gatewayModel = GetGatewayInfoModel();
RxBool ifCurrentScreen = true.obs; // ,
RxInt sureBtnState = 0.obs;
}
String? phoneConnectedWiFi;
}

View File

@ -97,9 +97,9 @@ class SelectGatewayListLogic extends BaseGetXController {
}
void startScanBlueList() {
state.devices.clear();
BlueManage().startScan(2000, DeviceType.gateway, (List<ScanResult> list) {
AppLog.log('ScanResultList:$list');
state.devices.clear();
for (int i = 0; i < list.length; i++) {
final ScanResult device = list[i];
// if ((device.advertisementData.serviceUuids.isNotEmpty
@ -107,7 +107,12 @@ class SelectGatewayListLogic extends BaseGetXController {
// : '')
// .toString()[31] !=
// '1') {
state.devices.add(list[i]);
if (!state.devices.contains(device)) {
state.devices.add(device);
} else {
//
state.devices[state.devices.indexOf(device)] = device;
}
// AppLog.log('device:${list[i]}');
// }
}

View File

@ -53,7 +53,7 @@ class _SelectGatewayTypeNextTipPageState
padding: EdgeInsets.all(20.w),
child: Center(
child: Text(
'网关通电后长按重置按钮5秒指示灯交替闪烁时点击下一步'.tr,
'网关通电后长按重置按钮5秒蓝色指示灯闪烁时点击下一步'.tr,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18.sp),
))),

View File

@ -1092,7 +1092,7 @@ class StartChartManage {
void sendBleMessage({
required String bluetoothDeviceName,
required List<int> bleStructData,
}) {
}) async {
// 线
final message = MessageCommand.bleMessage(
FromPeerId: FromPeerId,
@ -1101,7 +1101,7 @@ class StartChartManage {
bluetoothDeviceName: bluetoothDeviceName,
bleStructData: bleStructData,
);
_sendMessage(message: message);
await _sendMessage(message: message);
}
///

View File

@ -24,18 +24,12 @@ class XSJPushProvider {
return;
}
String appKey;
if (F.isSKY) {
appKey = '7ff37d174c1a568a89e98dad';
} else {
appKey = '251fc8074820d122b6de58d2';
}
print('jPushKey ${F.jPushKey}');
jpush.setup(
appKey: appKey,
appKey: F.jPushKey,
channel: 'flutter_channel',
production: false,
debug: false,
production: F.isProductionEnv,
debug: !F.isProductionEnv,
);
jpush.applyPushAuthority(

View File

@ -15,9 +15,9 @@ class FlavorsImg extends StatelessWidget {
@override
Widget build(BuildContext context) {
myFilter = ColorFilterGenerator(name: 'xhj', filters: <List<double>>[
if (black) ColorFilterAddons.addictiveColor(-255, -255, -255) else ColorFilterAddons.addictiveColor(1, 22, 93),
if (black) ColorFilterAddons.addictiveColor(-255, -255, -255) else ColorFilterAddons.addictiveColor(1 , 22, 93),
]);
if (F.appFlavor != Flavor.xhj) {
if (F.appFlavor != Flavor.xhj && F.appFlavor != Flavor.xhj_bundle) {
return child;
}
return ColorFiltered(