android - 蓝牙使用颤振从 OBD-II 扫描仪接收数据
问题描述
我正在开发一个使用 Flutter 通过蓝牙与 OBD-II 扫描仪连接的应用程序。我已经尝试过Flutter Blue包和其他一些包,但它们没有显示任何可用的蓝牙设备(没有扫描结果),调试控制台内也没有任何错误消息。连接扫描仪后,我必须读取数据流。请指导我。这是代码
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final title = 'Flutter BLE Scan Demo';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: title,
home: MyHomePage(title: title),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, @required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
FlutterBlue flutterBlue = FlutterBlue.instance;
List<ScanResult> scanResultList = [];
bool _isScanning = false;
@override
initState() {
super.initState();
initBle();
}
void initBle() {
flutterBlue.isScanning.listen((isScanning) {
_isScanning = isScanning;
setState(() {});
});
}
scan() async {
if (!_isScanning) {
scanResultList.clear();
flutterBlue.startScan(timeout: Duration(seconds: 4));
flutterBlue.scanResults.listen((results) {
scanResultList = results;
setState(() {});
});
} else {
flutterBlue.stopScan();
}
}
Widget deviceSignal(ScanResult r) {
return Text(r.rssi.toString());
}
Widget deviceMacAddress(ScanResult r) {
return Text(r.device.id.id);
}
Widget deviceName(ScanResult r) {
String name = '';
if (r.device.name.isNotEmpty) {
name = r.device.name;
} else if (r.advertisementData.localName.isNotEmpty) {
name = r.advertisementData.localName;
} else {
name = 'N/A';
}
return Text(name);
}
Widget leading(ScanResult r) {
return CircleAvatar(
child: Icon(
Icons.bluetooth,
color: Colors.white,
),
backgroundColor: Colors.cyan,
);
}
void onTap(ScanResult r) {
print('${r.device.name}');
}
Widget listItem(ScanResult r) {
return ListTile(
onTap: () => onTap(r),
leading: leading(r),
title: deviceName(r),
subtitle: deviceMacAddress(r),
trailing: deviceSignal(r),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: ListView.separated(
itemCount: scanResultList.length,
itemBuilder: (context, index) {
return listItem(scanResultList[index]);
},
separatorBuilder: (BuildContext context, int index) {
return Divider();
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: scan,
child: Icon(_isScanning ? Icons.stop : Icons.search),
),
);
}
}
以下是权限:
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
提前致谢
解决方案
推荐阅读
- hadoop - 将大文件从 SAS 传输到 hadoop - CSV
- r - 如何在 R 中对指定值 x 处的 y 平均值执行假设检验
- google-apps-script - 用于多列下拉菜单的 Google onEdit 脚本
- flutter - 如何在我们的应用程序中维护 API 数据
- linux - 在没有包装脚本的情况下将 stderr 和 stdout 写入文件
- azure-devops - Azure Devops OpenShift 并行发布
- c++ - 使用 registerConstructor 注入 Mock
- javascript - 递归方法继续前进,但方向相反。为什么?
- docker - Nginx 反向代理无法与容器通信
- c++ - 如何找到当前用户名和系统盘?