用移动设备远程控制任何电气设备总是很酷,甚至不需要靠近移动设备。
我们将看到如何使用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
源代码