mirror of
				https://github.com/hackku21/loc-chain-app.git
				synced 2025-06-13 12:54:05 +00:00 
			
		
		
		
	auto connects and send the message accrocced
This commit is contained in:
		
							parent
							
								
									d56bad22d0
								
							
						
					
					
						commit
						388ffb4897
					
				| @ -1,5 +1,4 @@ | |||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:loc_chain_app/util/bluetooth.dart'; |  | ||||||
| import 'package:shared_preferences/shared_preferences.dart'; | import 'package:shared_preferences/shared_preferences.dart'; | ||||||
| import 'package:loc_chain_app/widgets/navbar.dart'; | import 'package:loc_chain_app/widgets/navbar.dart'; | ||||||
| import 'package:flutter_udid/flutter_udid.dart'; | import 'package:flutter_udid/flutter_udid.dart'; | ||||||
| @ -15,8 +14,6 @@ class App extends StatelessWidget { | |||||||
|   // This widget is the root of your application. |   // This widget is the root of your application. | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     Connect.start(); |  | ||||||
| 
 |  | ||||||
|     return MaterialApp( |     return MaterialApp( | ||||||
|       title: 'Loc-Chain', |       title: 'Loc-Chain', | ||||||
|       theme: ThemeData( |       theme: ThemeData( | ||||||
|  | |||||||
| @ -1,7 +1,9 @@ | |||||||
|  | import 'dart:io'; | ||||||
|  | import 'dart:typed_data'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:flutter_udid/flutter_udid.dart'; | import 'package:flutter_udid/flutter_udid.dart'; | ||||||
| import 'package:loc_chain_app/util/bluetooth.dart'; |  | ||||||
| import 'package:loc_chain_app/util/transaction_manager.dart'; | import 'package:loc_chain_app/util/transaction_manager.dart'; | ||||||
|  | import 'package:nearby_connections/nearby_connections.dart'; | ||||||
| 
 | 
 | ||||||
| class HomePage extends StatefulWidget { | class HomePage extends StatefulWidget { | ||||||
|   HomePage({Key? key, required this.title}) : super(key: key); |   HomePage({Key? key, required this.title}) : super(key: key); | ||||||
| @ -12,72 +14,201 @@ class HomePage extends StatefulWidget { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class _HomePageState extends State<HomePage> { | class _HomePageState extends State<HomePage> { | ||||||
|   final Future<String> _id = FlutterUdid.consistentUdid; |   @override | ||||||
|   Connect connector = Connect(); |   void initState() { | ||||||
|   Map<String, Transaction> transactionMap = Map(); |     super.initState(); | ||||||
|   // String getId() => |     WidgetsBinding.instance!.addPostFrameCallback((_) { | ||||||
|   //     SharedPreferences.getInstance().then((s) => s.getString('id') ?? '0'); |       getUUID(); | ||||||
| 
 |       startAdvertising(); | ||||||
|   void refreshTransactions() { |       startDiscovery(); | ||||||
|     setState(() { |  | ||||||
|       transactionMap = Connect.transactionMap; |  | ||||||
|       Connect.context = context; |  | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   static late String userName; | ||||||
|  |   final Strategy strategy = Strategy.P2P_STAR; | ||||||
|  |   Map<String, ConnectionInfo> endpointMap = Map(); | ||||||
|  | 
 | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     return Scaffold( |     return Center( | ||||||
|       appBar: AppBar( |       child: Padding( | ||||||
|         title: Text(widget.title), |         padding: const EdgeInsets.all(8.0), | ||||||
|       ), |         child: ListView( | ||||||
|       body: FutureBuilder<String>( |           children: <Widget>[ | ||||||
|           future: _id, // a previously-obtained Future<String> or null |             Text("User Name: " + userName), | ||||||
|           builder: (BuildContext context, AsyncSnapshot<String> snapshot) { |             Divider(), | ||||||
|             String content = "Loading id..."; |             Text("Number of connected devices: ${endpointMap.length}"), | ||||||
|             if (snapshot.hasData) { |             ElevatedButton( | ||||||
|               content = "ID: ${snapshot.data!}"; |               child: Text("Stop All Endpoints"), | ||||||
|             } |               onPressed: () async { | ||||||
|             List<Card> transactions = List.generate( |                 await Nearby().stopAllEndpoints(); | ||||||
|               transactionMap.length, |                 setState(() { | ||||||
|               (index) { |                   endpointMap.clear(); | ||||||
|                 Transaction t = transactionMap.values.elementAt(index); |                 }); | ||||||
|                 return Card( |  | ||||||
|                   child: Row( |  | ||||||
|                     children: [Text(t.hash), Text(t.pubKey)], |  | ||||||
|                   ), |  | ||||||
|                 ); |  | ||||||
|               }, |               }, | ||||||
|             ); |             ), | ||||||
|             return ListView( |             Divider(), | ||||||
|               children: <Widget>[ |             Text( | ||||||
|                     Container( |               "Sending Data", | ||||||
|                       child: Text(content), |             ), | ||||||
|                     ), |             ElevatedButton( | ||||||
|                   ] + |               child: Text("Send Bytes Payload"), | ||||||
|                   transactions, |               onPressed: () async { | ||||||
|             ); |                 sendPayload(); | ||||||
|           }), |               }, | ||||||
|       floatingActionButton: FloatingActionButton( |             ), | ||||||
|         onPressed: () { |           ], | ||||||
|           refreshTransactions(); |         ), | ||||||
|           try { |  | ||||||
|             Connect.stop(); |  | ||||||
|             Connect.start(); |  | ||||||
|           } catch (e) { |  | ||||||
|             print(e); |  | ||||||
|           } |  | ||||||
|         }, |  | ||||||
|         child: Icon(Icons.refresh_sharp), |  | ||||||
|       ), |       ), | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   String genPayload(ConnectionInfo value) { | ||||||
|  |     print("Sender ID: $userName"); | ||||||
|  |     print("Receiver ID: ${value.endpointName}"); | ||||||
|  | 
 | ||||||
|  |     var dateTime = DateTime.now(); | ||||||
|  |     print('Milliseconds since Epoch: ${dateTime.millisecondsSinceEpoch}'); | ||||||
|  | 
 | ||||||
|  |     String payload = userName + | ||||||
|  |         ":" + | ||||||
|  |         value.endpointName + | ||||||
|  |         ":" + | ||||||
|  |         dateTime.millisecondsSinceEpoch.toString(); | ||||||
|  |     return payload; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   void sendPayload() { | ||||||
|  |     endpointMap.forEach((key, value) { | ||||||
|  |       String a = genPayload(value); | ||||||
|  | 
 | ||||||
|  |       showSnackbar("Sending $a to ${value.endpointName}, id: $key"); | ||||||
|  |       Nearby().sendBytesPayload(key, Uint8List.fromList(a.codeUnits)); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   void showSnackbar(dynamic a) { |   void showSnackbar(dynamic a) { | ||||||
|     ScaffoldMessenger.of(context).showSnackBar(SnackBar( |     ScaffoldMessenger.of(context).showSnackBar(SnackBar( | ||||||
|       content: Text(a.toString()), |       content: Text(a.toString()), | ||||||
|     )); |     )); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   Future<void> reportExposure() async {} |   void getUUID() async { | ||||||
|  |     userName = await FlutterUdid.consistentUdid; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   void stopAll() async { | ||||||
|  |     await Nearby().stopAllEndpoints(); | ||||||
|  |     await Nearby().stopAdvertising(); | ||||||
|  |     await Nearby().stopDiscovery(); | ||||||
|  |     setState(() {}); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   void startDiscovery() async { | ||||||
|  |     try { | ||||||
|  |       userName = await FlutterUdid.consistentUdid; | ||||||
|  |       bool a = await Nearby().startDiscovery( | ||||||
|  |         userName, | ||||||
|  |         strategy, | ||||||
|  |         onEndpointFound: (id, name, serviceId) { | ||||||
|  |           print("userName = $userName"); | ||||||
|  |           print("id = $id"); | ||||||
|  | 
 | ||||||
|  |           Nearby().requestConnection( | ||||||
|  |             userName, | ||||||
|  |             id, | ||||||
|  |             onConnectionInitiated: (id, info) { | ||||||
|  |               onConnectionInit(id, info); | ||||||
|  |               sleep(Duration(microseconds: 500)); | ||||||
|  |               sendPayload(); | ||||||
|  |             }, | ||||||
|  |             onConnectionResult: (id, status) { | ||||||
|  |               showSnackbar(status); | ||||||
|  |             }, | ||||||
|  |             onDisconnected: (id) { | ||||||
|  |               setState(() { | ||||||
|  |                 endpointMap.remove(id); | ||||||
|  |               }); | ||||||
|  |               showSnackbar( | ||||||
|  |                   "Disconnected from: ${endpointMap[id]!.endpointName}, id $id"); | ||||||
|  |             }, | ||||||
|  |           ); | ||||||
|  |         }, | ||||||
|  |         onEndpointLost: (id) { | ||||||
|  |           showSnackbar( | ||||||
|  |               "Lost discovered Endpoint: ${endpointMap[id]!.endpointName}, id $id"); | ||||||
|  |         }, | ||||||
|  |       ); | ||||||
|  |       showSnackbar("DISCOVERING: " + a.toString()); | ||||||
|  |     } catch (e) { | ||||||
|  |       showSnackbar(e); | ||||||
|  |     } | ||||||
|  |     setState(() {}); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   void startAdvertising() async { | ||||||
|  |     try { | ||||||
|  |       userName = await FlutterUdid.consistentUdid; | ||||||
|  | 
 | ||||||
|  |       bool a = await Nearby().startAdvertising( | ||||||
|  |         userName, | ||||||
|  |         strategy, | ||||||
|  |         onConnectionInitiated: (id, info) { | ||||||
|  |           onConnectionInit(id, info); | ||||||
|  |           sleep(Duration(microseconds: 500)); | ||||||
|  |           sendPayload(); | ||||||
|  |         }, //advertisingOnConnectionInit, | ||||||
|  |         onConnectionResult: (id, status) { | ||||||
|  |           print("userName = $userName"); | ||||||
|  |           print("id = $id"); | ||||||
|  |           print(status); | ||||||
|  |           showSnackbar(status); | ||||||
|  |         }, | ||||||
|  |         onDisconnected: (id) { | ||||||
|  |           showSnackbar( | ||||||
|  |               "Disconnected: ${endpointMap[id]!.endpointName}, id $id"); | ||||||
|  |           setState(() { | ||||||
|  |             endpointMap.remove(id); | ||||||
|  |           }); | ||||||
|  |         }, | ||||||
|  |       ); | ||||||
|  |       showSnackbar("ADVERTISING: " + a.toString()); | ||||||
|  |     } catch (exception) { | ||||||
|  |       showSnackbar(exception); | ||||||
|  |     } | ||||||
|  |     setState(() {}); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /// Called upon Connection request (on both devices) | ||||||
|  |   /// Both need to accept connection to start sending/receiving | ||||||
|  |   void onConnectionInit(String id, ConnectionInfo info) { | ||||||
|  |     setState(() { | ||||||
|  |       endpointMap[id] = info; | ||||||
|  |     }); | ||||||
|  |     Nearby().acceptConnection( | ||||||
|  |       id, | ||||||
|  |       onPayLoadRecieved: (endid, payload) async { | ||||||
|  |         if (payload.type == PayloadType.BYTES) { | ||||||
|  |           String str = String.fromCharCodes(payload.bytes!); | ||||||
|  | 
 | ||||||
|  |           // first device recives here | ||||||
|  |           print("Receiving:"); | ||||||
|  |           print("${str.split(":")}"); | ||||||
|  | 
 | ||||||
|  |           showSnackbar(endid + ": " + str); | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       onPayloadTransferUpdate: (endid, payloadTransferUpdate) { | ||||||
|  |         if (payloadTransferUpdate.status == PayloadStatus.IN_PROGRESS) { | ||||||
|  |           print(payloadTransferUpdate.bytesTransferred); | ||||||
|  |         } else if (payloadTransferUpdate.status == PayloadStatus.FAILURE) { | ||||||
|  |           print("failed"); | ||||||
|  |           showSnackbar(endid + ": FAILED to transfer file"); | ||||||
|  |         } else if (payloadTransferUpdate.status == PayloadStatus.SUCCESS) { | ||||||
|  |           showSnackbar( | ||||||
|  |               "$endid success, total bytes = ${payloadTransferUpdate.totalBytes}"); | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |     ); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user