μ€λ§νΈ μμ΄ μνλ μ΄ν° μ μ΄ λ° λͺ¨λν°λ§μ μν Flutter μ΄ν리μΌμ΄μ
λ³Έ μ±μ BLE κΈ°λ°μ μ€νλΌμΈ μ μ΄λ₯Ό ν΅μ¬μΌλ‘ νλ©°, λμ©λ λ°μ΄ν° μ μ‘μ μν μ체 Chunking νλ‘ν μ½κ³Ό ACK κΈ°λ° μ λ’°μ± ν΅μ μ ꡬννμμ΅λλ€.
flutter_blue_plus- BLE ν΅μprovider- μν κ΄λ¦¬shared_preferences- λ‘컬 μ μ₯μfl_chart- λ°μ΄ν° μκ°ν
lib/
βββ main.dart # μ± μνΈλ¦¬ λ° μν κ΄λ¦¬ (Lifted State)
βββ screens/ # UI νλ©΄ (Dashboard, Control, Analytics)
βββ services/ # λΉμ¦λμ€ λ‘μ§ λ° ν΅μ
βββ models/ # λ°μ΄ν° λͺ¨λΈ (User, AnalyticsData)
βββ utils/ # μ νΈλ¦¬ν° (SnackBar Helper, Constants)
BLEμ MTU(ν¨ν· ν¬κΈ°) μ νμ 극볡νκ³ λ°μ΄ν° 무결μ±μ 보μ₯νκΈ° μν΄ μ체 νλ‘ν μ½μ μ€κ³νμ΅λλ€.
- Chunking (λΆν μ μ‘): μ΄λ―Έμ§λ 480λ°μ΄νΈ λ¨μλ‘ λΆν λμ΄
<CHUNK:i/total>ν€λμ ν¨κ» μ μ‘λλ©°, μμ μΈ‘μμ μ¬μ‘°λ¦½ν©λλ€. - Reliability (ACK): μ€μ λͺ
λ Ή(
user_register,delete,timer)μ κΈ°κΈ°λ‘λΆν° μ²λ¦¬ μλ£ μλ΅(ACK)μ μμ ν΄μΌλ§ μ±κ³΅μΌλ‘ κ°μ£Όνλ νΈλμμ λ°©μμ μ¬μ©ν©λλ€.
// ACK λκΈ° μμ (λΉλκΈ° νΈλμμ
)
bool success = await ble.sendRequestWithAck({
'action': 'user_register',
'user_id': '...',
// ...
});λ‘컬 μ μ΄ μΈμ μλ²μ μΆμ λ λΉ λ°μ΄ν° ν΅κ³λ₯Ό μ‘°ννκΈ° μν΄ MQTTλ₯Ό 보쑰μ μΌλ‘ νμ©ν©λλ€.
- μμ²:
ambient/stats/request(κΈ°κ°λ³ μ¬μ©λ, μ νΈ λͺ¨λ λ±) - μλ΅:
ambient/stats/response(JSON ν¬λ§·μ ν΅κ³ λ°μ΄ν°)
μ± λ΄λΆμμ SharedPreferencesμ μ μ₯λ λ‘κ·Έλ₯Ό λΆμνμ¬ μ¬μ©μ λ§μΆ€ν 리ν¬νΈλ₯Ό μμ±ν©λλ€.
- In-App Analytics: λ³λμ μλ² μ°μ° μμ΄ μ± λ΄λΆ μκ³ λ¦¬μ¦μΌλ‘ μ£Ό μ¬μ© μκ°λ(
Top Hour), μ νΈ νμ λ±μ μ€μκ°μΌλ‘ λΆμν©λλ€. - Natural Language Insight: λΆμλ λ°μ΄ν°λ₯Ό "μ£Όλ‘ 14μμ μ νκΈ°λ₯Ό μ¬μ©ν©λλ€"μ κ°μ μμ°μ΄ λ¬Έμ₯μΌλ‘ λ³ννμ¬ μ 곡ν©λλ€.
- Visualization: μΌκ°/μ£Όκ° μ¬μ© ν¨ν΄μ μκ°νλ κ·Έλν(Bar/Donut Chart)λ‘ ννν©λλ€.
Flutter SDK μ€μΉ ν μμ‘΄μ±μ μ€μΉν©λλ€.
flutter pub getλλ°μ΄μ€λ₯Ό μ°κ²°νκ³ μ±μ μ€νν©λλ€.
# λλ°μ΄μ€ μ€ν
flutter run
# λ¨μ ν
μ€νΈ μ€ν
flutter test


