我正在尝试通过 BLE L2CAP 连接将 Android 手机连接到 golang 服务器,但是我似乎无法成功连接。
我的安卓代码是
val socket = device.createL2capChannel(0x0031)
socket.connect()
我的服务器代码是
stdout, err := cmd.Output()
if err != nil {
panic(err)
}
fmt.Println(string(stdout))
sock, err := unix.Socket(syscall.AF_BLUETOOTH, syscall.SOCK_SEQPACKET, unix.BTPROTO_L2CAP)
if err != nil {
panic(err)
}
defer unix.Close(sock)
addr := &unix.SockaddrL2{PSM: 0x0031}
if err := unix.Bind(sock, addr); err != nil {
panic(err)
}
if err := unix.Listen(sock, 1); err != nil {
panic(err)
}
conn, sender, err := unix.Accept(sock)
if err != nil {
panic(err)
}
fmt.Printf("connection accepted from %v %v\n", conn, sender)
但是,当我尝试连接时,Android 代码在
E/DartMessenger( 4026): Uncaught exception in binary message listener
E/DartMessenger( 4026): java.io.IOException: read failed, socket might closed or timeout, read ret: -1
E/DartMessenger( 4026): at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:776)
E/DartMessenger( 4026): at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:790)
E/DartMessenger( 4026): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:415)
E/DartMessenger( 4026): at com.muxable.flutter.l2cap.Connection.start(L2CAPPlugin.kt:42)
E/DartMessenger( 4026): at com.muxable.flutter.l2cap.L2CAPPlugin.onMethodCall(L2CAPPlugin.kt:146)
E/DartMessenger( 4026): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262)
E/DartMessenger( 4026): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:178)
E/DartMessenger( 4026): at io.flutter.embedding.engine.dart.DartMessenger.lambda$handleMessageFromDart$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:206)
E/DartMessenger( 4026): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)
E/DartMessenger( 4026): at android.os.Handler.handleCallback(Handler.java:938)
E/DartMessenger( 4026): at android.os.Handler.dispatchMessage(Handler.java:99)
E/DartMessenger( 4026): at android.os.Looper.loopOnce(Looper.java:201)
E/DartMessenger( 4026): at android.os.Looper.loop(Looper.java:288)
E/DartMessenger( 4026): at android.app.ActivityThread.main(ActivityThread.java:7838)
E/DartMessenger( 4026): at java.lang.reflect.Method.invoke(Native Method)
E/DartMessenger( 4026): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/DartMessenger( 4026): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
我实际上已经能够从另一台计算机进行连接,这让我认为存在与协议相关的问题?特别是我无法完全理解如何确保 L2CAP 服务器在 Android 似乎需要的 BLE 上运行。
我可以从另一台机器成功连接
import bluetooth
sock=bluetooth.BluetoothSocket(bluetooth.L2CAP)
bd_addr = "54:8D:5A:96:4E:29"
port = 0x0031
sock.connect((bd_addr, port))
sock.send("hello!!")
sock.close()