diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1c52108..e52f811 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ package="be.musee.de.la.fraise.tablet_app"> > c) { + final MqttPublishMessage message = c[0].payload; + final payload = MqttPublishPayload.bytesToStringAsString(message.payload.message); + print('Received message:$payload from topic: ${c[0].topic}'); + }); + } + + // unconnected + void onDisconnected() { + print('Disconnected'); + } + + // subscribe to topic succeeded + void onSubscribed(String topic) { + print('Subscribed topic: $topic'); + } + + // subscribe to topic failed + void onSubscribeFail(String topic) { + print('Failed to subscribe $topic'); + } + + // unsubscribe succeeded + void onUnsubscribed(String topic) { + print('Unsubscribed topic: $topic'); + } + + Future connect(dynamic tabletAppContext) async { + var identifier = await UniqueIdentifier.serial; + tabletAppContext.clientMQTT = MqttServerClient.withPort(tabletAppContext.host.replaceAll('http://', ''), 'tablet_app_'+identifier, 1883); + + tabletAppContext.clientMQTT.logging(on: false); + tabletAppContext.clientMQTT.keepAlivePeriod = 20; + tabletAppContext.clientMQTT.onDisconnected = onDisconnected; + tabletAppContext.clientMQTT.onConnected = () => onConnected(tabletAppContext); + tabletAppContext.clientMQTT.onSubscribed = onSubscribed; + + final connMessage = MqttConnectMessage().authenticateAs('admin', 'mdlf2021!') // TODO ONLINE + .keepAliveFor(60) + .withWillTopic('willtopic') + .withWillMessage('Will message') + .withClientIdentifier('tablet_app_'+identifier) + .startClean() + .withWillQos(MqttQos.atLeastOnce); + + tabletAppContext.clientMQTT.connectionMessage = connMessage; + tabletAppContext.clientMQTT.autoReconnect = true; + try { + await tabletAppContext.clientMQTT.connect(); + tabletAppContext.clientMQTT.subscribe("#", MqttQos.atLeastOnce); + + const pubTopic = 'player/status'; + final builder = MqttClientPayloadBuilder(); + builder.addString('tablet_app_'+identifier); + tabletAppContext.clientMQTT.publishMessage(pubTopic, MqttQos.atLeastOnce, builder.payload); + } catch (e) { + print('Exception: $e'); + tabletAppContext.clientMQTT.disconnect(); + } + + return tabletAppContext.clientMQTT; + } +} \ No newline at end of file diff --git a/lib/Models/tabletContext.dart b/lib/Models/tabletContext.dart index 3de32c4..e4e11ef 100644 --- a/lib/Models/tabletContext.dart +++ b/lib/Models/tabletContext.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; import 'package:managerapi/api.dart'; +import 'package:mqtt_client/mqtt_server_client.dart'; import 'package:tablet_app/client.dart'; import 'dart:convert'; class TabletAppContext with ChangeNotifier{ Client clientAPI; + MqttServerClient clientMQTT; String id; String host; ConfigurationDTO configuration; diff --git a/lib/Screens/Configuration/config_view.dart b/lib/Screens/Configuration/config_view.dart index 9e5e58b..5eaf974 100644 --- a/lib/Screens/Configuration/config_view.dart +++ b/lib/Screens/Configuration/config_view.dart @@ -3,19 +3,19 @@ import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:managerapi/api.dart'; +import 'package:mqtt_client/mqtt_server_client.dart'; import 'package:provider/provider.dart'; import 'package:tablet_app/Components/Buttons/rounded_button.dart'; import 'package:tablet_app/Components/loading.dart'; import 'package:tablet_app/Components/rounded_input_field.dart'; import 'package:tablet_app/Helpers/DatabaseHelper.dart'; -import 'package:tablet_app/Models/map-marker.dart'; +import 'package:tablet_app/Helpers/MQTTHelper.dart'; import 'package:tablet_app/Models/tabletContext.dart'; import 'package:tablet_app/Screens/MainView/dropDown_configuration.dart'; import 'package:tablet_app/Screens/MainView/main_view.dart'; import 'package:tablet_app/app_context.dart'; import 'package:tablet_app/client.dart'; import 'package:tablet_app/constants.dart'; -import 'package:auto_size_text/auto_size_text.dart'; import 'dart:io'; import 'package:unique_identifier/unique_identifier.dart'; @@ -153,13 +153,13 @@ class _ConfigViewWidget extends State { textColor: Colors.white, fontSize: 16.0 ); + TabletAppContext tabletAppContext = new TabletAppContext(); + tabletAppContext.host = url; + tabletAppContext.clientAPI = client; + tabletAppContext.clientMQTT = await MQTTHelper.instance.connect(tabletAppContext); setState(() { - TabletAppContext tabletAppContext = new TabletAppContext(); - tabletAppContext.host = url; - tabletAppContext.clientAPI = client; - appContext.setContext(tabletAppContext); - - configOk = true; + appContext.setContext(tabletAppContext); + configOk = true; }); } else { Fluttertoast.showToast( diff --git a/lib/Screens/MainView/main_view.dart b/lib/Screens/MainView/main_view.dart index 97bbacf..2e73a19 100644 --- a/lib/Screens/MainView/main_view.dart +++ b/lib/Screens/MainView/main_view.dart @@ -30,6 +30,8 @@ class _MainViewWidget extends State { Size sizeScreen = new Size(1080.0, 1920.0); // Tablet resolution SectionDTO sectionSelected; + int rowCount = 4; + @override Widget build(BuildContext context) { final appContext = Provider.of(context); @@ -176,7 +178,7 @@ class _MainViewWidget extends State { color: kBackgroundGrey, child: Stack( children: [ - LanguageSelection(), + if (appContext.getContext().configuration != null) LanguageSelection(), Center( child: Container( height: size.height * 0.85, @@ -191,7 +193,7 @@ class _MainViewWidget extends State { else { return GridView.builder( shrinkWrap: true, - gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4), + gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: rowCount), itemCount: snapshot.data?.length, itemBuilder: (BuildContext context, int index) { return InkWell( diff --git a/lib/main.dart b/lib/main.dart index 527789b..431b687 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,9 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:managerapi/api.dart'; import 'package:provider/provider.dart'; +import 'package:tablet_app/Helpers/MQTTHelper.dart'; import 'package:tablet_app/client.dart'; import 'Helpers/DatabaseHelper.dart'; import 'Models/tabletContext.dart'; @@ -60,6 +63,8 @@ class _MyAppState extends State { @override Widget build(BuildContext context) { + if (widget.tabletAppContext != null) + MQTTHelper.instance.connect(widget.tabletAppContext); return ChangeNotifierProvider( create: (_) => AppContext(widget.tabletAppContext), child: MaterialApp( diff --git a/pubspec.lock b/pubspec.lock index a09c925..59956e5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -85,6 +85,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + event_bus: + dependency: transitive + description: + name: event_bus + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" fake_async: dependency: transitive description: @@ -205,6 +212,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.9.7" + mqtt_client: + dependency: "direct main" + description: + name: mqtt_client + url: "https://pub.dartlang.org" + source: hosted + version: "8.2.0" nested: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b5bea7a..a178077 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,6 +35,7 @@ dependencies: enum_to_string: ^2.0.1 carousel_slider: ^4.0.0 youtube_player_flutter: ^7.0.0+7 + mqtt_client: ^8.1.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons.