通过蓝牙发送数据

4
我对如何通过蓝牙连接发送数据有点困惑。在Android API文档中,来自Bluetooth Chat示例的class BluetoothChat.java构造了一个Handler对象。其中包含一个switch语句和一个MESSAGE_WRITE case。我需要实现类似的代码才能发送字符串吗?为每个要发送的字符串编写一个case语句?特别是我想要发送(name,value)对,以便知道发送了什么以及它的值是多少。我该如何实现这一点呢?如果像示例一样多次调用BluetoothChatService.write(String.getBytes())来发送...?那么我怎么知道哪些字符串与哪些名称相关联呢?请帮忙。
3个回答

2
我正在使用谷歌的协议缓冲区在我的Android应用程序中通过蓝牙连接发送结构化数据。protobuf会负责为您确定如何序列化消息,因此您只需要发送一个字节值(消息长度)和序列化的消息即可;该库会在另一端处理反序列化消息并填充自定义对象的字段。一定要看一下它;它使编写自定义蓝牙套接字协议变得非常容易。

你是否发现需要将消息分成更小的“块”,以支持最小BLE消息长度为23? - Chris

0

对于简单的字符串对(例如名称),您可以使用某些字符来定义第一个字符串停止和下一个字符串开始的位置。

例如,我使用以下格式将一组3个字符串从一个设备发送到另一个设备:

String toSend = partOne + ":" + partTwo + ":" + partThree;

在另一台设备上,要获取您发送的字符串,请使用String.split()方法,如下所示:
String parts[] = received.split(":",3);

第二个参数是限制分割的最大次数。在这个例子中,有3个字符串,所以最多分割3次。

这样做的缺点是你需要使用一些字符,这些字符在除了最后一个字符串之外的所有字符串中都永远不会出现。

在我的应用程序中,我使用这种方法来发送有关文本消息的数据,前两部分是电话号码和时间戳,因此其中永远不可能有冒号。对于名称,换行符可能会起作用。

如果您要发送更复杂的数据,请一定使用类似 Protocol Buffers 的东西。


回顾过去,我的意思是将数据序列化。我在年轻时写下了这个,那时我还不知道序列化的存在。今天我建议使用JSON。 - Tortel

0

将键值对序列化为任何允许字节表示的格式,例如XML或JSON。甚至可以使用自定义格式,对于字符串对来说并不困难。然后发送它。


像这样的东西:MyObject实现Serializable接口 { String name; String value; MyObject(String name, String value) { this.name=name; this.value=value; } String getName() { return name; } String getVal() { return value; }}然后在蓝牙代码中:MyObject pair = new MyObject("a","b");OutputStream.write(pair.getBytes()); - user817129

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接