Мобильные устройства не обнаруживаются во время сканирования Bluetooth, обнаруживаются только такие устройства, как mi band, smart tv - PullRequest
0 голосов
/ 05 августа 2020

Я использовал пакеты flutter_blue и beacon_broadcast вместе. Я получаю все устройства, кроме мобильных. Я использую приложение для социального дистанцирования в трепете, и должны отображаться только устройства, на которых установлено мое приложение. Может кто-нибудь, пожалуйста, помогите с этим. Я перепробовал все методы, но не смог решить проблему.

введите описание изображения здесь Рядом.дарт

import 'dart:async';
import 'dart:math';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
import 'package:beacon_broadcast/beacon_broadcast.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'material.dart';

import 'package:vibration/vibration.dart';



final fire = Firestore.instance;
class BlueApp extends StatefulWidget {
  @override
  _BlueAppState createState() => _BlueAppState();
}


BeaconBroadcast beaconBroadcast = BeaconBroadcast();
BeaconStatus _isTransmissionSupported;
bool _isAdvertising = false;
StreamSubscription<bool> _isAdvertisingSubscription;
final databaseReference=Firestore.instance;
String UUID = "CB10023F-A318-3394-4199-A8730C7C1AEC";

//sending to firestore
void createRecord(String id, int rssi, int dis) async {
//  await databaseReference.collection("users")
//      .document(UUID)
//      .setData({
//    'list':a
//  });
//  print('senddddddddingggggg');
//  DocumentReference ref = await databaseReference.collection("users")
//      .add({
//    'uuid':a
//  });

  fire.collection("users").document(UUID).collection("contacts").document(id).setData(
      {
        'uuid':id,
        'time': new DateTime.now(),
        'rssi':rssi,
        'distance':dis
      }).then((value){

  });
  Vibration.vibrate(duration: 1000);
}


class _BlueAppState extends State<BlueApp> {
  static const UUID = 'CB10023F-A318-3394-4199-A8730C7C1AEC';
  static const minorId=1;
  static const MajorId=100;
  static const TRANSMISSION_POWER = -59;
  static const IDENTIFIER = 'com.example.myDeviceRegion';
  static const LAYOUT = BeaconBroadcast.ALTBEACON_LAYOUT;

  void initState()  {
    // TODO: implement initState
    super.initState();

    FlutterBlue.instance.state.listen((state) {
        print("im in the init");
        print(state);
       if (state == BluetoothState.off) {
          print("bluetooth is off");
       } else if (state == BluetoothState.on) {
         print("bluethooth on");
          //print(device.id);
       }
       print("printing  beacon");
    });
    beaconBroadcast
        .setUUID(UUID)
        .setMinorId(minorId)
        .setMajorId(MajorId)
        .setTransmissionPower(TRANSMISSION_POWER)
        .setIdentifier(IDENTIFIER)
        .setLayout(LAYOUT)
        .start();
    print('Beacon started Advertising');
    FlutterBlue.instance.startScan();
    print('started scannin....');
    beaconBroadcast.checkTransmissionSupported().then((isTransmissionSupported) {
      setState(() {
        _isTransmissionSupported = isTransmissionSupported;
        print('*************************');
      
        print(_isTransmissionSupported);
        print('*************************');
        print('why');
      });
    });
    _isAdvertisingSubscription =
              beaconBroadcast.getAdvertisingStateChange().listen((isAdvertising) {
                setState(() {
                  _isAdvertising = true;
                });
        });
    if(_isAdvertising==true){
      print('Beacon started Advertising');
    }
    print('Beacon started Advertising??????????????????????????');
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: StreamBuilder<BluetoothState>(
          stream: FlutterBlue.instance.state,
          initialData: BluetoothState.turningOn,
          builder: (c, snapshot) {
            final state = snapshot.data;
           // print(state);
            if (state == BluetoothState.on) {
              print("BlueTooth is on");
              return FindDevicesScreen();
            }

            print("BlueTooth is off");
            return FindDevicesScreen();
          }),
    );
  }
}

class FindDevicesScreen extends StatefulWidget {
  @override
  _FindDevicesScreenState createState() => _FindDevicesScreenState();
}

class _FindDevicesScreenState extends State<FindDevicesScreen> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

  }

  @override
  Widget build(BuildContext context) {
  // createRecord(FlutterBlue.instance.scanResults);
    return Scaffold(
      appBar: AppBar(
        title: Text('Find Devices'),
      ),
      body: RefreshIndicator(
        onRefresh: () =>
            FlutterBlue.instance.startScan(),
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[

              StreamBuilder<List<BluetoothDevice>>(
                stream: Stream.periodic(Duration(seconds: 4))
                    .asyncMap((_) => FlutterBlue.instance.connectedDevices),
                initialData: [],
                builder: (c, snapshot) => Column(
                  children: snapshot.data
                      .map((d) => ListTile(
                    title: Text(d.name),
                    subtitle: Text(d.id.toString()),
                    trailing: StreamBuilder<BluetoothDeviceState>(
                      stream: d.state,
                      initialData: BluetoothDeviceState.disconnected,
                      builder: (c, snapshot) {

                        return Text(snapshot.data.toString());
                      },
                    ),
                  ))
                      .toList(),
                ),
              ),
              StreamBuilder<List<ScanResult>>(
                stream: FlutterBlue.instance.scanResults,
                initialData: [],
                builder: (c, snapshot) => Column(
                  children: snapshot.data
                      .map(
                        (r) => Card(
                      child: ScanResultTile(
                        result: r,

                      ),
                    ),
                  )
                      .toList(),
                ),
              ),
            ],
          ),
        ),
      ),

    );
  }
}

материал.дарт

import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
import 'nearby.dart';
class ScanResultTile extends StatelessWidget {
  const ScanResultTile({Key key, this.result, this.onTap}) : super(key: key);

  final ScanResult result;
  final VoidCallback onTap;

  Widget _buildTitle(BuildContext context) {
    if (result.device.name.length > 0) {
      return Column(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[

          Text(
            result.device.name,
            overflow: TextOverflow.ellipsis,
          ),
          Text(
            result.device.id.toString(),
            style: Theme.of(context).textTheme.caption,
          ),
//          _buildAdvRow(
//              context, 'Distance of the device',(result.rssi!=null && result.advertisementData.txPowerLevel!=null)?"${getDistance(result.rssi,result.advertisementData.txPowerLevel)}":"N/A" ),
        ],
      );
    } else {
      return Text(result.device.id.toString());
    }
  }

  Widget _buildAdvRow(BuildContext context, String title, String value) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0),
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Text(title, style: Theme.of(context).textTheme.caption),
          SizedBox(
            width: 12.0,
          ),
          Expanded(
            child: Text(
              value,
              style: Theme.of(context)
                  .textTheme
                  .caption
                  .apply(color: Colors.black),
              softWrap: true,
            ),
          ),
        ],
      ),
    );
  }

  String getNiceHexArray(List<int> bytes) {
    return '[${bytes.map((i) => i.toRadixString(16).padLeft(2, '0')).join(', ')}]'
        .toUpperCase();
  }


  int getDistance(int rssi, int txPower) {
    print("rssi");
    print(rssi);
    return 10 ^ ((txPower - rssi) / (10 * 2)).round();
  }

  @override
  Widget build(BuildContext context) {
    print("rssi");
    print(result.rssi);
    print("Transmit power");
    print(result.advertisementData.txPowerLevel);
   // print(result.device.name);
    print("////////////////////////////////////////////////////////////////////////////");
    print(result.device.id);
    if(result.advertisementData.txPowerLevel!=null&&result.device.id.toString()!=null) {
      createRecord(result.device.id.toString(), result.rssi,
          getDistance(result.rssi, result.advertisementData.txPowerLevel));
    }
//    if((getDistance(result.rssi,result.advertisementData.txPowerLevel))<=2)
//    {
//      createRecord(result.advertisementData.serviceUuids.iterator.moveNext().toString());
//    }
    return ExpansionTile(
      title: _buildTitle(context),
      leading: Column(
        children: <Widget>[

          Text("Tap for more...",style: TextStyle(fontSize: 10.0,color: Colors.lightBlueAccent),)
        ],
      ),

      children: <Widget>[
        _buildAdvRow(
            context, 'Distance of the device',(result.rssi!=null && result.advertisementData.txPowerLevel!=null)?"${getDistance(result.rssi,result.advertisementData.txPowerLevel)}":"N/A" ),
        _buildAdvRow(context, 'Tx Power Level',
            '${result.advertisementData.txPowerLevel ?? 'N/A'}'),

        _buildAdvRow(
            context,
            'Service UUIDs',
            (result.advertisementData.serviceUuids.isNotEmpty)? result.advertisementData.serviceUuids.join(', ').toUpperCase(): 'N/A'),
      ],
    );
  }
}

class ServiceTile extends StatelessWidget {
  final BluetoothService service;
  final List<CharacteristicTile> characteristicTiles;

  const ServiceTile({Key key, this.service, this.characteristicTiles})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    if (characteristicTiles.length > 0) {
      return ExpansionTile(
        title: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text('Service'),
            Text('0x${service.uuid.toString().toUpperCase().substring(4, 8)}',
                style: Theme.of(context)
                    .textTheme
                    .body1
                    .copyWith(color: Theme.of(context).textTheme.caption.color))
          ],
        ),
        children: characteristicTiles,
      );
    } else {
      return ListTile(
        title: Text('Service'),
        subtitle:
        Text('0x${service.uuid.toString().toUpperCase().substring(4, 8)}'),
      );
    }
  }
}

class CharacteristicTile extends StatelessWidget {
  final BluetoothCharacteristic characteristic;
  final List<DescriptorTile> descriptorTiles;
  final VoidCallback onReadPressed;
  final VoidCallback onWritePressed;
  final VoidCallback onNotificationPressed;

  const CharacteristicTile(
      {Key key,
        this.characteristic,
        this.descriptorTiles,
        this.onReadPressed,
        this.onWritePressed,
        this.onNotificationPressed})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<int>>(
      stream: characteristic.value,
      initialData: characteristic.lastValue,
      builder: (c, snapshot) {
        final value = snapshot.data;
        return ExpansionTile(
          title: ListTile(
            title: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text('Characteristic'),
                Text(
                    '0x${characteristic.uuid.toString().toUpperCase().substring(4, 8)}',
                    style: Theme.of(context).textTheme.body1.copyWith(
                        color: Theme.of(context).textTheme.caption.color))
              ],
            ),
            subtitle: Text(value.toString()),
            contentPadding: EdgeInsets.all(0.0),
          ),
          children: descriptorTiles,
        );
      },
    );
  }
}

class DescriptorTile extends StatelessWidget {
  final BluetoothDescriptor descriptor;
  final VoidCallback onReadPressed;
  final VoidCallback onWritePressed;

  const DescriptorTile(
      {Key key, this.descriptor, this.onReadPressed, this.onWritePressed})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Text('Descriptor'),
          Text('0x${descriptor.uuid.toString().toUpperCase().substring(4, 8)}',
              style: Theme.of(context)
                  .textTheme
                  .body1
                  .copyWith(color: Theme.of(context).textTheme.caption.color))
        ],
      ),
      subtitle: StreamBuilder<List<int>>(
        stream: descriptor.value,
        initialData: descriptor.lastValue,
        builder: (c, snapshot) => Text(snapshot.data.toString()),
      ),
      trailing: Row(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          IconButton(
            icon: Icon(
              Icons.file_download,
              color: Theme.of(context).iconTheme.color.withOpacity(0.5),
            ),
            onPressed: onReadPressed,
          ),
          IconButton(
            icon: Icon(
              Icons.file_upload,
              color: Theme.of(context).iconTheme.color.withOpacity(0.5),
            ),
            onPressed: onWritePressed,
          )
        ],
      ),
    );
  }
}

class AdapterStateTile extends StatelessWidget {
  const AdapterStateTile({Key key, @required this.state}) : super(key: key);

  final BluetoothState state;

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.redAccent,
      child: ListTile(
        title: Text(
          'Bluetooth adapter is ${state.toString().substring(15)}',
          style: Theme.of(context).primaryTextTheme.subhead,
        ),
        trailing: Icon(
          Icons.error,
          color: Theme.of(context).primaryTextTheme.subhead.color,
        ),
      ),
    );
  }
}
...