📜  敲敲 (1)

📅  最后修改于: 2023-12-03 15:10:22.965000             🧑  作者: Mango

敲敲

简介

敲敲是一款基于近场通讯技术的聊天应用,它可以让用户在手机之间传送消息,类似于传统的敲门砖。敲敲的名字来源于这个功能,用户可以在手机上敲击屏幕来发送/接收消息,同时也可以进行语音聊天、发送图片等操作。

技术栈

敲敲的核心技术在于近场通讯技术,其主要基于以下技术实现:

  • NFC(Near Field Communication,近场通讯):用于手机之间的短距离数据传输。
  • WebSocket:用于实时通信,在聊天过程中可以即时传递消息。
  • Flutter:Google推出的跨平台应用开发框架,可以同时支持iOS和Android应用的开发。
  • Firebase:Google提供的云服务,提供了数据存储、实时数据库、用户认证等功能,使得敲敲开发者可以更轻松地进行开发,快速迭代。
实现

首先,需要在两台设备上打开敲敲应用,进入聊天界面。在进入聊天界面时,会自动启用近场通讯模块,等待连接。

当两台设备的近场通讯模块连接成功后,就可以开始聊天了。用户可以通过敲击屏幕,发送消息给对方:

sendMessage(String message) async {
  try {
    await nfc.openSession("com.example.yourAppName"); // 打开 NFC 会话
    var data = utf8.encode(message);
    var response = await nfc.sendData(data); // 发送数据
    if (response.isNotEmpty) {
      print("Receive response: ${utf8.decode(response)}"); // 打印接收到的数据
    }
  } catch (error) {
    print(error);
  } finally {
    await nfc.closeSession(); // 关闭 NFC 会话
  }
}

在接收到对方发送的消息时,也可以通过 nfc 来处理,例如:

StreamSubscription<NfcMessage> _nfcSubscription;
// ...

void startNfcListener() {
  _nfcSubscription = nfc.onMessage.listen((NfcMessage message) async {
    String data = utf8.decode(message.data);
    print("Receive message: $data");
    // 处理消息
  });
}

void stopNfcListener() {
  if (_nfcSubscription != null) {
    _nfcSubscription.cancel();
    _nfcSubscription = null;
  }
}

同时,敲敲也提供了其他功能,例如语音聊天、发送图片等。这些功能主要基于Firebase实现,例如:

void sendAudioMessage(File audioFile) async {
  final storageReference = FirebaseStorage.instance.ref().child(audioFile.path);
  final uploadTask = storageReference.putFile(audioFile);

  final ref = FirebaseFirestore.instance.collection('chat-rooms').doc(chatRoomId);
  final newMsg = VoiceMessage(
    senderUid: _user.uid,
    fileName: audioFile.path,
    url: '',
    duration: 0,
    timestamp: DateTime.now().millisecondsSinceEpoch,
  );
  final messageMap = newMsg.toMap();
  await ref.update({
    'messageList': FieldValue.arrayUnion([messageMap])
  });
}
结语

敲敲是一款基于近场通讯技术的聊天应用,它的开发过程涉及到的技术非常多。但是,它也是一款极具挑战性和趣味性的应用,让用户可以在传统的敲门砖上发挥出更多的创意。