Розробка мобільних додатків для розумного сільського господарства
Поле в 100 гектарів — не квартира з розумними лампочками. Датчики розкидані на кілометри, GSM-зв'язок є не везде, заміна батарейок раз на рік — вимога, не побажання. Мобільний додаток для агро-IoT будується навколо кількох реальних обмежень: низька зв'язність, довгі цикли даних (раз у 15-60 хвилин від LoRaWAN-вузла), висока вартість помилки (втрачений урожай).
Протоколи в агро-IoT
LoRaWAN — основний протокол для польових датчиків на великих площах. Діапазон до 15 км у відкритому полі, спживання мілівати, пакети 51-222 байта залежно від Spreading Factor. LPWAN-альтернативи: NB-IoT (потрібна операторська мережа, але двостороння зв'язь), Sigfox (обмеження 140 повідомлень на день).
Для теплиць та об'єктів з інфраструктурою — Zigbee/Thread, Wi-Fi, проводовий Modbus. Для мобільних активів (техніка, тварини) — GPRS/LTE з GPS-трекером.
Дані з LoRaWAN-вузлів ідуть через Network Server (TTN, ChirpStack, Helium) → Application Server → MQTT або REST → мобільний додаток.
Архітектура даних: рідкі оновлення, багата аналітика
LoRaWAN-датчик оновлює дані кожні 15-60 хвилин. Мобільний додаток показує не тільки поточні значення, але й тренди, аномалії, прогнози. Це вимагає серверної агрегації та зберігання у Time Series DB.
Структура даних для датчика ґрунту:
{
"deviceEui": "0004A30B001C3A4D",
"applicationId": "crop-monitoring-prod",
"timestamp": "2024-07-15T08:30:00Z",
"location": {"lat": 51.2345, "lon": 23.4567},
"payload": {
"soilMoistureVwc": 28.5,
"soilTemperatureC": 18.2,
"soilElectricalConductivity": 0.45,
"batteryPercent": 87,
"signalRssi": -98,
"snr": 4.2
}
}
На мобільній стороні — Kotlin Flow з Room для офлайн-роботи:
@Dao
interface SensorReadingDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(readings: List<SensorReading>)
@Query("""
SELECT * FROM sensor_readings
WHERE device_eui = :eui
AND timestamp >= :from
ORDER BY timestamp DESC
""")
fun observeReadings(eui: String, from: Long): Flow<List<SensorReading>>
@Query("""
SELECT
CAST(strftime('%s', datetime(timestamp/1000, 'unixepoch', 'start of day')) AS INTEGER) * 1000 AS day,
AVG(soil_moisture_vwc) AS avg_moisture,
MIN(soil_temperature_c) AS min_temp,
MAX(soil_temperature_c) AS max_temp
FROM sensor_readings
WHERE device_eui = :eui
AND timestamp >= :from
GROUP BY day
ORDER BY day
""")
fun getDailyAggregates(eui: String, from: Long): Flow<List<DailyAggregate>>
}
Карта полів та зональне управління
Ключовий екран у агро-додатку — карта з полігонами полів та маркерами датчиків. На Flutter з flutter_map (Leaflet-based, безплатно без API-key) або Google Maps:
class FieldMapWidget extends StatelessWidget {
final List<Field> fields;
final List<SensorDevice> sensors;
@override
Widget build(BuildContext context) {
return FlutterMap(
options: MapOptions(center: LatLng(51.23, 23.45), zoom: 13),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
// Або агро-шари: Sentinel-2 NDVI через EO Browser
),
PolygonLayer(
polygons: fields.map((f) => Polygon(
points: f.boundary,
color: _fieldColorByStatus(f),
borderColor: Colors.white,
borderStrokeWidth: 1.5,
)).toList(),
),
MarkerLayer(
markers: sensors.map((s) => Marker(
point: LatLng(s.lat, s.lon),
builder: (_) => SensorMarker(sensor: s),
)).toList(),
),
],
);
}
Color _fieldColorByStatus(Field field) {
final ndvi = field.latestNdvi;
if (ndvi == null) return Colors.grey.withOpacity(0.3);
if (ndvi < 0.3) return Colors.red.withOpacity(0.4);
if (ndvi < 0.5) return Colors.yellow.withOpacity(0.4);
return Colors.green.withOpacity(0.4);
}
}
NDVI (індекс вегетації) отримується з Sentinel-2 знімків через Copernicus Data Space API або Planet API. Знімки раз у 5-12 днів при безхмарній погоді — автоматично скачуються на backend та розраховуються попіксельно.
Уведення за агро-порогами
Для агро-IoT критичні пороговані алерти: «Вологість ґрунту нижче 25% на полі Північний-3» або «Заморозок очікується до 04:00, 3 датчики показують температуру нижче 2°C». Логіка на backend, доставка через FCM/APNs.
Нюанс мобільних сповіщень для фермерів: телефон часто в кишені під час роботи, потрібні короткі інформативні тексти. Перший рядок має значення: «Поле Східне: вологість 18%, потрібен полив».
Офлайн-режим
LoRaWAN шлюз на полі може не мати постійного інтернету. Частина даних синхронізується пачками при появі зв'язку. Додаток показує «останнє оновлення 2 години тому» та не паникує. Критично правильно обробляти часові мітки: дані з датчика мають свою часову мітку, яка може сильно відрізнятися від часу доставки на сервер.
Розробка агро-IoT додатка з картою полів, моніторингом датчиків та алертами для однієї культури: 2-3 місяці. Багатокультурний моніторинг, NDVI-аналітика, управління зрошенням та прогнози: 4-6 місяців. Вартість розраховується після аналізу парку датчиків та агрономічних вимог.







