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:loc_chain_app/util/bluetooth.dart'; | ||||
| import 'package:shared_preferences/shared_preferences.dart'; | ||||
| import 'package:loc_chain_app/widgets/navbar.dart'; | ||||
| import 'package:flutter_udid/flutter_udid.dart'; | ||||
| @ -15,8 +14,6 @@ class App extends StatelessWidget { | ||||
|   // This widget is the root of your application. | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     Connect.start(); | ||||
| 
 | ||||
|     return MaterialApp( | ||||
|       title: 'Loc-Chain', | ||||
|       theme: ThemeData( | ||||
|  | ||||
| @ -1,7 +1,9 @@ | ||||
| import 'dart:io'; | ||||
| import 'dart:typed_data'; | ||||
| import 'package:flutter/material.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:nearby_connections/nearby_connections.dart'; | ||||
| 
 | ||||
| class HomePage extends StatefulWidget { | ||||
|   HomePage({Key? key, required this.title}) : super(key: key); | ||||
| @ -12,72 +14,201 @@ class HomePage extends StatefulWidget { | ||||
| } | ||||
| 
 | ||||
| class _HomePageState extends State<HomePage> { | ||||
|   final Future<String> _id = FlutterUdid.consistentUdid; | ||||
|   Connect connector = Connect(); | ||||
|   Map<String, Transaction> transactionMap = Map(); | ||||
|   // String getId() => | ||||
|   //     SharedPreferences.getInstance().then((s) => s.getString('id') ?? '0'); | ||||
| 
 | ||||
|   void refreshTransactions() { | ||||
|     setState(() { | ||||
|       transactionMap = Connect.transactionMap; | ||||
|       Connect.context = context; | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     WidgetsBinding.instance!.addPostFrameCallback((_) { | ||||
|       getUUID(); | ||||
|       startAdvertising(); | ||||
|       startDiscovery(); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   static late String userName; | ||||
|   final Strategy strategy = Strategy.P2P_STAR; | ||||
|   Map<String, ConnectionInfo> endpointMap = Map(); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       appBar: AppBar( | ||||
|         title: Text(widget.title), | ||||
|       ), | ||||
|       body: FutureBuilder<String>( | ||||
|           future: _id, // a previously-obtained Future<String> or null | ||||
|           builder: (BuildContext context, AsyncSnapshot<String> snapshot) { | ||||
|             String content = "Loading id..."; | ||||
|             if (snapshot.hasData) { | ||||
|               content = "ID: ${snapshot.data!}"; | ||||
|             } | ||||
|             List<Card> transactions = List.generate( | ||||
|               transactionMap.length, | ||||
|               (index) { | ||||
|                 Transaction t = transactionMap.values.elementAt(index); | ||||
|                 return Card( | ||||
|                   child: Row( | ||||
|                     children: [Text(t.hash), Text(t.pubKey)], | ||||
|                   ), | ||||
|                 ); | ||||
|               }, | ||||
|             ); | ||||
|             return ListView( | ||||
|     return Center( | ||||
|       child: Padding( | ||||
|         padding: const EdgeInsets.all(8.0), | ||||
|         child: ListView( | ||||
|           children: <Widget>[ | ||||
|                     Container( | ||||
|                       child: Text(content), | ||||
|                     ), | ||||
|                   ] + | ||||
|                   transactions, | ||||
|             ); | ||||
|           }), | ||||
|       floatingActionButton: FloatingActionButton( | ||||
|         onPressed: () { | ||||
|           refreshTransactions(); | ||||
|           try { | ||||
|             Connect.stop(); | ||||
|             Connect.start(); | ||||
|           } catch (e) { | ||||
|             print(e); | ||||
|           } | ||||
|             Text("User Name: " + userName), | ||||
|             Divider(), | ||||
|             Text("Number of connected devices: ${endpointMap.length}"), | ||||
|             ElevatedButton( | ||||
|               child: Text("Stop All Endpoints"), | ||||
|               onPressed: () async { | ||||
|                 await Nearby().stopAllEndpoints(); | ||||
|                 setState(() { | ||||
|                   endpointMap.clear(); | ||||
|                 }); | ||||
|               }, | ||||
|         child: Icon(Icons.refresh_sharp), | ||||
|             ), | ||||
|             Divider(), | ||||
|             Text( | ||||
|               "Sending Data", | ||||
|             ), | ||||
|             ElevatedButton( | ||||
|               child: Text("Send Bytes Payload"), | ||||
|               onPressed: () async { | ||||
|                 sendPayload(); | ||||
|               }, | ||||
|             ), | ||||
|           ], | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   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) { | ||||
|     ScaffoldMessenger.of(context).showSnackBar(SnackBar( | ||||
|       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