Skip to content

搞英语 → 看世界

翻译英文优质信息和名人推特

Menu
  • 首页
  • 作者列表
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
Menu

Android蓝牙连接

Posted on 2025-08-27

假设有人来找你,说:“我需要你的帮助。我有一个基于树莓派的机器人,我想开发一个自定义的安卓应用来控制它。” 如果你像我一样,会想到必须更新安卓开发者工具,并且会怀疑自己是否还记得如何签署清单。这可不是什么好主意。当然,你可以买现成的工具让事情变得更容易,但那样就不是自定义的了,你必须接受它的工作方式。但事实证明,对于简单的事情,你可以使用一个旧的谷歌实验室项目,令人惊讶的是,它仍然活跃并且运行良好:麻省理工学院的App Inventor——不幸的是,它的首字母缩写应该是 AI,但为了避免混淆,我就叫它 Inventor 吧。

Inventor 是什么?它存在于你的浏览器中。你可以使用拖放功能布局一个模拟的手机屏幕,就像使用 QT Designer 或 Visual Basic 一样。你可以使用类似 Scratch 的块语言切换视图并附加操作。你可以在模拟器中或真机上进行无线调试。然后,当你准备就绪时,你可以拖放一个 APK 文件供人们下载。你更喜欢 iPhone 吗?虽然它还不够成熟,但还是有一些支持的。特别是,你似乎无法轻松地与他人共享你的 iPhone 应用。

它完美吗?不,还是有一些小瑕疵。但它运行良好,只要稍加耐心,就能开发出非常棒的应用程序。它们能像一些手工杰作一样高效吗?可能不行。这重要吗?可能不重要。我觉得它名声不好是因为那些色彩缤纷的积木。它肯定是为孩子们设计的。嗯,说实话,确实如此。但它做得不错,就像TinkerCad或乐高一样,对孩子来说足够简单,但你可以用它做一些非常神奇的事情。

多快?

创建一个简单的 Android 应用有多快?一旦习惯了,速度非常快,而且有很多教程。出于好玩,我为我最喜欢的网站编写了一个小型自定义 Web 浏览器。从图片上看不太清楚,但确实包含几个组件。底部的 Web 浏览器很明显,还有三个椭圆形按钮。Hackaday 的标志也是可点击的(它会带你回到主页)。你看不到的是,有一个默认的屏幕组件。它采用垂直布局,将工具栏与 Web 浏览器堆叠在一起。工具栏本身是水平布局(如你所见,颜色为黄色)。

底部的黑条和最顶部的黑条是假手机的一部分,但如果您想要更多的工作空间,也可以选择假显示器或平板电脑。

您看不到的是还有两个隐藏的组件。一个是时钟。如果您在主页上停留一小时,应用就会刷新页面。还有一个分享组件,分享按钮会用到它。您可以在下面看到该应用的三个视图。这三个视图分别是:一个设计视图(用于直观地构建界面)、一个块视图(用于编写代码)以及在真实手机上运行的最终结果。

代码

把所有这些放到屏幕上只花了几分钟。当然,我调整了字体和颜色,但仅仅是完成基本的布局就花了不到五分钟。那么代码呢?正如你所见,它也很简单。

浅褐色的方框用于控制结构,例如事件处理程序和 if/then 块。紫色的方框用于子程序调用,您可以定义自己的子程序,尽管这里不需要。绿色的块是属性,例如浏览器的 URL。如果您愿意,可以自己尝试一下。

无需将其变成完整的 Inventor 教程,而是查看 YouTube 频道上任何非常出色的教程,例如下面的教程。

故事的一半

之前我提到过,你的朋友想要一个能与 Raspberry Pi 通信的机器人控制器。我对这件事的难度感到很惊讶,但这不是 Inventor 的错。有三个显而易见的选择:系统可以发出 Web 请求,或者通过蓝牙连接。它也可以通过串口工作。

我犯了一个错误,决定使用蓝牙客户端组件来使用蓝牙串口。从 Inventor 的角度来看,这很容易,即使不是很复杂。但在 Linux 端却很麻烦。

曾经有一段时间,Linux 蓝牙堆栈 Bluez 提供了一种相当简单的方法来创建一个通过蓝牙通信的伪串行端口。互联网上流传着许多这样的例子。但 Bluez 出于某种原因认为这种方法不太好,因此弃用了它。现代 Linux 并不喜欢所有这些,它要求你创建一个能够从蓝牙堆栈接收总线消息的 dbus 程序。

公平地说……

好吧,平心而论,你可以重新加载蓝牙协议栈,并添加一个兼容标志——至少目前是这样——它仍然能以老方法工作。但你知道他们最终会关闭这个功能,所以我决定用正确的方法。不过,我没有硬抗,而是在 GitHub 上找到了一些代码,它们为 SPP(串行端口配置文件)创建了一个简单的客户端/服务器。我把它精简到只用作服务器,然后又加了一个单独的函数bt_main()你可以在其中编写处理数据流的代码。这样一来,所有那些花里胡哨的东西——而且有很多——就都不再妨碍你了。

您也可以在GitHub上找到我对原始代码的修改。查看 spp_bridge.c 文件,您会发现通过 dbus 与 Bluez 交互时有很多混乱的部分。它注册了一个Profile1接口,并为每个传入连接派生一个工作进程。该工作进程运行用户定义的bt_main()函数,该函数通常会被覆盖。该工作进程从蓝牙套接字读取数据,并通过普通的FILE *写入您的代码。您可以用同样的方式发送数据。

这是默认的 bt_main 函数:

 <div> <pre>int bt_main(int argc, char *argv[], FILE *in, FILE *out) { // 默认演示:回显行,以“ECHO:”为前缀    fprintf(stderr,“[bt_main] 默认回显模式。\n”);    设置vbuf(输出,NULL,_IOLBF,0);    charbuf[1024];    while(fgets(buf,sizeof(buf),in)){       fprintf(stderr,“[bt_main] RX:%s”,buf);       fprintf(out,"ECHO: %s",buf);       fflush(输出);       }    fprintf(stderr,“[bt_main] 输入已关闭。退出。\n”);    返回0; </pre> 
回想起来,或许最好直接使用 Bluez 服务器上的兼容标志来恢复旧的行为。至少,在它持续存在期间是这样。这需要找到系统启动 Bluez 服务的位置(现在可能是在 systemd 服务中),并在命令行中添加 -c 选项。也许有更新版本的 rfcomm 也支持最新的 Bluez 设置,但 KDE Neon 不支持。
另一方面,这确实有效。bt_main bt_main很容易编写,让你可以专注于解决问题,而不是如何建立和断开蓝牙连接。

下次

下次,我将向您展示一个更有趣的 bt_main 函数,以及一个通过自定义服务器发送和接收数据的 Android 应用。您可以将其作为基础,例如,创建一个自定义宏键盘或一个控制机器人的 Android 应用。

原文: https://hackaday.com/2025/08/27/the-android-bluetooth-connection/

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abhinav
  • Abigail Pain
  • Adam Fortuna
  • Alberto Gallego
  • Alex Wlchan
  • Answer.AI
  • Arne Bahlo
  • Ben Carlson
  • Ben Kuhn
  • Bert Hubert
  • Big Technology
  • Bits about Money
  • Brandon Skerritt
  • Brian Krebs
  • ByteByteGo
  • Chip Huyen
  • Chips and Cheese
  • Christopher Butler
  • Colin Percival
  • Cool Infographics
  • Dan Sinker
  • David Walsh
  • Dmitry Dolzhenko
  • Dustin Curtis
  • eighty twenty
  • Elad Gil
  • Ellie Huxtable
  • Ethan Dalool
  • Ethan Marcotte
  • Exponential View
  • FAIL Blog
  • Founder Weekly
  • Geoffrey Huntley
  • Geoffrey Litt
  • Greg Mankiw
  • HeardThat Blog
  • Henrique Dias
  • Herman Martinus
  • Hypercritical
  • IEEE Spectrum
  • Investment Talk
  • Jaz
  • Jeff Geerling
  • Jonas Hietala
  • Josh Comeau
  • Lenny Rachitsky
  • Li Haoyi
  • Liz Danzico
  • Lou Plummer
  • Luke Wroblewski
  • Maggie Appleton
  • Matt Baer
  • Matt Stoller
  • Matthias Endler
  • Mert Bulan
  • Mind Matters
  • Mostly metrics
  • Naval Ravikant
  • News Letter
  • NextDraft
  • Non_Interactive
  • Not Boring
  • One Useful Thing
  • Phil Eaton
  • Product Market Fit
  • Readwise
  • ReedyBear
  • Robert Heaton
  • Rohit Patel
  • Ruben Schade
  • Sage Economics
  • Sam Altman
  • Sam Rose
  • selfh.st
  • Shtetl-Optimized
  • Simon schreibt
  • Slashdot
  • Small Good Things
  • Steph Ango
  • Stephen Wolfram
  • Steve Blank
  • Taylor Troesh
  • Telegram Blog
  • The Macro Compass
  • The Pomp Letter
  • thesephist
  • Thinking Deep & Wide
  • Tim Kellogg
  • Understanding AI
  • Wes Kao
  • 英文媒体
  • 英文推特
  • 英文独立博客
©2025 搞英语 → 看世界 | Design: Newspaperly WordPress Theme