【问题标题】:Bluetooth communication between android (Java) and Pythonandroid(Java)和Python之间的蓝牙通信
【发布时间】:2022-07-14 17:04:46
【问题描述】:

众所周知,BT 通信是我们在日常生活中使用的东西。多个设备在彼此之间发送复杂的数据,并且运行非常顺利。所以我想要实现的是发送几乎 4 个介于 0 和 255 之间的变量值,以使用以下代码从 Android 手机通过蓝牙控制我的灯光(颜色和亮度):

btSocket.getOutputStream().write(instructions.getBytes(StandardCharsets.UTF_8));

指令或值作为字符串发送。此函数实际上将字符串转换为逐行发送的字节,因此如果我使用来自 UART 的 Python 代码(因为我的 BT 模块使用这种类型的通信)在无限循环中读取它,如下所示:

while True:
    while uart.any():
         read_instruction = uart.readline().decode()

我得到这样的输出:

2
5
5

5
2

2

1

考虑到我只是想通过蓝牙控制 LED 灯条,这处理起来非常复杂且烦人。我知道有很多应用程序可以做到所有这些,但我想自己学习并制作一个。我已经在 Google 和 YT 上搜索了好几个小时,那里的所有人都在使用只给出简单指令的代码,例如 1 = 做某事,2 = 做其他事情,这很容易编程。但正如我已经提到的,BT 用于发送更复杂的数据甚至播放音乐,那么问题在哪里呢?我是否必须编写复杂的函数来将我的“行”数据处理为变量,或者我是否使用错误的函数来发送数据?或者也许是为了接收数据?

如果我总是发送相同的数据,例如 255,255,255,1,我会使用这样的函数:

while True:
    while uart.any():
         red = uart.read(3).decode()
         etc

但是数字从 0 变为 255,所以我不能给它们一个固定的长度。

感谢您的想法,我是初学者,所以可能我错过了一些我应该学习的非常简单和重要的东西。或者我只需要艰难地去做。

【问题讨论】:

  • to send pretty much 4 variable values between 0 and 255 从定义这些变量开始您的代码,因为目前还不清楚您在做什么。这些变量是整数吗?我们不知道。你没说。你从一个没有赋值的字符串开始,所以我们不知道会发生什么。
  • 实际上我确实在代码示例下方告诉了where instructions or values are sent as a String。抱歉,如果我没有提供示例而使您感到困惑。处理后的字符串如下所示:instructions = ("255 255 255 3");。我已经通过玩代码找到了解决方案,请您检查一下,如果我使用了正确的方法,请告诉我?谢谢
  • 如果你有四个数值,那么你可以只发送四个字节。我不明白你为什么要先将它们转换为字符串然后再转换回来。如果您只需要 4 个字节,为什么还要发送 14 个字节?此外,您仍然没有告诉您如何从四个变量值构建该字符串。或者你的四个变量值是什么类型。
  • 感谢您的意见,我基本上是初学者,所以我从错误中吸取教训。我知道 UART 无论如何都会接收字节,而且我必须在接收设备上处理它们的转换,所以我没有太在意发送字符串还是整数。您为我指明了正确的方向,谢谢。解决方案现已更新。如果有问题或相关问题,我很乐意收到负面反馈。

标签: python java android


【解决方案1】:

好的,正如@blackapps 所建议的那样,将整数值转换为字符串然后尝试在 Python 中将它们处理回 int 是一个非常愚蠢的想法。解决方法如下:

Java 代码:

int red, green, blue, br;

private void sendSignal ( int value ) {
    if ( btSocket != null ) {
        try {
            btSocket.getOutputStream().write(value);
        } catch (IOException e) {
            msg("Error");
        }
    }
}

sendSignal(red);
sendSignal(green);
sendSignal(blue);
sendSignal(br);

Python 代码:

def uart_to_int():
     while not uart.any():
          time.sleep(0.0001)
     read = uart.readline()
     return int.from_bytes(read, "little")

def led_light(color, brightness):
     #code taking care of LED stripe receiving color as (int, int, int)
     #and brigthness as int

while True:
     rgb = (uart_to_int(), uart_to_int(), uart_to_int())
     brightness = uart_to_int()
     led_light(rgb, brightness)

结果完全符合需要:

rgb = (255,30,88)
brigthness = 20

这显然不是一个万无一失的解决方案,如果我收到损坏的数据,我将不得不添加一些检查。但通常这是解决问题的方法

快乐的日子!

【讨论】:

    【解决方案2】:

    我看到您已经设法建立蓝牙连接。我也在尝试将 java 客户端与 python 服务器连接。您介意与我分享您的代码吗?

    【讨论】:

      猜你喜欢
      • 2015-05-24
      • 1970-01-01
      • 2013-01-15
      • 2013-03-07
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多