用移动设备远程控制任何电气设备总是很酷,甚至不需要靠近移动设备。

我们将看到如何使用IoT给普通的交流电源插头,插座或开关增添魔力。 这将使我们能够借助具有蓝牙功能的应用程序(当然是使用Flutter构建的)借助移动设备来控制房屋中的任何电气设备。

本文将介绍很多内容:

  • 将蓝牙集成到Flutter应用程序中(用于与IoT设备通信)
  • 将各种模块连接到Arduino(蓝牙模块和5V继电器)
  • 设置Arduino(发送和接收信号)

集成蓝牙

最终的应用程序用户界面如下所示:

对于这个项目,我们将使用一个名为flutter_bluetooth_serial的插件。还有一个很棒的插件,用于将Flutter_blue集成到Flutter应用程序中的蓝牙。

但是对于该项目,我使用的是flutter_bluetooth_serial插件,因为它具有更多功能,并且在与其他设备通信时可以更好地控制蓝牙连接。

该插件的缺点是,到目前为止,它仅支持Android。

将插件添加到您的pubspec.yaml文件中:

dependencies:
  flutter_bluetooth_serial: ^0.2.2

定义基本结构

删除整个Flutter Demo Counter应用程序代码后,创建一个新的Flutter应用程序并将以下内容添加到main.dart文件中。

</>

这是启动我们的项目的基本结构。我们必须为蓝牙应用程序类使用StatefulWidget,因为我们需要在应用程序的生命周期内多次更改状态。

启用蓝牙和检索设备

现在我们已经有了应用程序的基本结构,我们可以集中精力启用用户设备的蓝牙连接并检索配对的设备。

  • 初始化一些需要的变量(稍后,在构建应用程序时,我们将根据需要添加更多的类成员变量):

首先,在initState()内部,我们必须获取当前的蓝牙状态。根据状态,请求用户授予蓝牙权限,以在未打开蓝牙的情况下在其设备上启用蓝牙。

现在,我们必须定义两个函数:

  • enableBluetooth()用于从用户获取蓝牙权限。
  • getPairedDevices()用于检索配对的设备列表。

启用蓝牙的功能实现:

</>

检索蓝牙设备列表的功能实现:

</>
  • 为了避免任何内存泄漏,我们将定义dispose()方法以确保关闭连接并释放资源。
    ``
    // Define a member variable to track
    // when the disconnection is in progress
    bool isDisconnecting = false;

@override
void dispose() {
if (isConnected) {
isDisconnecting = true;
connection.dispose();
connection = null;
}

super.dispose();
}

启用蓝牙的用户界面

因此,我们拥有与设备建立正确的蓝牙连接所需的所有方法,现在我们必须将它们映射到某些UI小部件。

首先,我们将添加一个Switch小部件,它只能在两种模式之间进行切换。

该组件的代码如下:

</>

在此,开关将根据是否启用/禁用蓝牙连接在开/关之间切换。 不管是否通过切换启用或禁用了蓝牙,都会调用getPairedDevices()方法以刷新设备列表(即,如果启用了蓝牙,则将更新设备列表;如果禁用了蓝牙,则列表内容将 设为空)。

配对设备的用户界面列表

我们将使用DropdownButton小部件来显示已配对设备的列表。

// Inside _BluetoothAppState class

// Define this member variable for storing
// each device from the dropdown items
BluetoothDevice _device;

DropdownButton(
  items: _getDeviceItems(),
  onChanged: (value) =>
      setState(() => _device = value),
  value: _devicesList.isNotEmpty ? _device : null,
),

定义用于将设备名称存储在列表中的方法_getDeviceItems()。当列表中没有要存储的设备时,唯一写有“ NONE”的文本被存储。

// Inside _BluetoothAppState class

List<DropdownMenuItem<BluetoothDevice>> _getDeviceItems() {
  List<DropdownMenuItem<BluetoothDevice>> items = [];
  if (_devicesList.isEmpty) {
    items.add(DropdownMenuItem(
      child: Text('NONE'),
    ));
  } else {
    _devicesList.forEach((device) {
      items.add(DropdownMenuItem(
        child: Text(device.name),
        value: device,
      ));
    });
  }
  return items;
}

蓝牙连接到设备

与设备断开连接

连接/断开按钮的用户界面

将消息发送到蓝牙设备

蓝牙发送消息的用户界面

将各种模块连接到Arduino

设置Arduino

源代码