1

我正在尝试通过蓝牙访问从 Neurosky Mindset 传输的串行数据流。这是使用此处提到的 ThinkGear 通信协议的一个步骤:

http://developer.neurosky.com/docs/doku.php?id=which_api_is_right_for_me

有几个程序应该为我做这件事(Puzzlebox、Mindstream 等),我要么有明显无法解决的依赖问题,要么他们没有完全按照我的意愿做。

我可以使用 blueman(特别是 blueman-manager)将 Mindset 与我的机器配对,我可以将串行端口连接到 /dev/rfcomm0。我首先想知道的是:我如何从这个数据流中读取数据。如果我在设备上运行 sdptool 记录,我会得到以下输出:

服务名称:Dev B Service RecHandle:0x10005 服务类 ID 列表:“串行端口”(0x1101) 协议描述符列表:“L2CAP”(0x0100)“RFCOMM”(0x0003) 通道:3 语言库属性列表:code_ISO639:0x656e 编码: 0x6a base_offset: 0x100

(我得到的不止这些,但那是我想要访问的服务。)

我想我的主要问题是:如果 cat /dev/rfcomm0 什么都不显示,这是否意味着没有数据正在传输?问题是因为它是原始的而没有显示吗?如果正在传输,是否有一个命令可以保证给我任何串行数据?是否有启动 SPP 传输的蓝牙标准命令(我已经搜索了 bluez 的文档,但效果并不理想)?

我已将所有内容都以 root 和常规方式运行,因此似乎无法修复它。

任何帮助将不胜感激。

4

4 回答 4

1

好的,花了一些时间来让 MindSet 可靠地连接起来。

命令行蓝牙工具或多或少没用。读取 Mindset 的唯一可重复方法(通过 BlueMan 配对后)是这样做:

  bash$ sudo /etc/init.d/bluetooth stop
  bash$ sudo /etc/init.d/bluetooth start
  bash$ sudo rfcomm connect /dev/rfcomm0 00:13:##:##:##:## 1
  bash$ ./mindset_capture.rb

...但是在接收到有效的 ThinkGear 数据包之前就达到了 EOF。

相反,使用 Blueman 配对。

设置:

  1. bash$ blueman-manager &
  2. 在 MindSet 上启用配对
  3. 在 BlueMan 中单击搜索
  4. 选择 MindSet 设备
  5. 点击配对
  6. 输入密码 (0000)

连接:

  1. bash$ blueman-manager &
  2. 右键单击 MindSet 并选择“连接到:Dev B”(串行连接器图标)
  3. 运行捕获实用程序(例如 bash$ ./mindset_capture.rb)
  4. 右键单击 MindSet 并选择“断开连接:开发 B”
  5. 退出布鲁曼
  6. 重新启动蓝牙以释放 rfcomm0(感谢 BlueMan!)

    bash$ sudo /etc/init.d/蓝牙停止;sudo /etc/init.d/蓝牙启动

拥有一个完全命令行驱动的解决方案不是更好吗?是的,是的。不幸的是,Linux 上的蓝牙堆栈似乎处于 GUI 工具和命令行工具不合作的状态 - 并且命令行工具不支持配对(* 更新 - 见评论)。

从设备中读取很简单。它连续传输字节,因此从它读取,直到遇到两个 SYNC 字节 (0xAA),这标志着数据包的开始。数据包的结构在 MDT 中提供的minding_communications_protocol.pdf中进行了描述。

从 MindSet 读取的 Ruby 代码:

  require 'rubygems'      # gem install serialport
  require 'serialport' 
  conn = SerialPort.new "/dev/rfcomm0", 57600
  while true
    next if conn.readbyte != 0xAA
    next if conn.readbyte != 0xAA
    while true
      c = conn.readbyte
      break if c == 0xAA
      puts "%02X" % c
    end
  end 

它并不完美,因为它没有真正的解析,但这就是从设备读取字节的方式。

于 2013-04-18T07:43:22.973 回答
0

经过一番麻烦后,我发现许多新的微型蓝牙适配器(包括耳机随附的和我已经拥有的)中的芯片组无法处理插入 USB 集线器,必须直接插入树莓派——尽管它确实出现在设备列表中。一旦我将它从集线器 bluez-simple-agent 中移出,它就可以很好地工作并且没有大惊小怪。

于 2013-05-28T13:44:41.517 回答
0

我有旧的 NeuroSky Mindwave 和 BrainLink_Lite 神经小工具,在这里我使用了 BrainLink。Neurosky 和 ​​Brainlink 使用相同的协议以相同的方式工作,因为 BrainLink 使用了 NeuroSky 芯片 ( TGAM )。我按照下一条路解决了这个问题:

首先我得到:

$ dmesg | tail -n 50
....
[243709.823581] Bluetooth: hci0: BCM: chip id 63
[243709.839507] Bluetooth: hci0: ShisiusStation
[243709.840576] Bluetooth: hci0: BCM20702A1 (001.002.014) build 0000
[243709.840606] bluetooth hci0: Direct firmware load for brcm/BCM20702A1-13d3-3404.hcd failed with error -2
[243709.840608] Bluetooth: hci0: BCM: Patch brcm/BCM20702A1-13d3-3404.hcd not found
...

通过blueman-manager连接后,我进入dmesg 输出

[254803.943803] Bluetooth: TIOCGSERIAL is not supported
[254804.299425] Bluetooth: bad checksum in packet
[254817.417375] Bluetooth: TIOCGSERIAL is not supported
[254817.417498] Bluetooth: TIOCGSERIAL is not supported
[254823.416967] Bluetooth: TIOCGSERIAL is not supported
[254865.049149] ERROR @wl_inform_single_bss : cfg80211_inform_bss_frame error

没关系!顺便说一句,我无法通过以下方式连接到 BrainLink 大约 1-2 秒

  bash$ sudo rfcomm connect /dev/rfcomm0 8C:DE:52:44:AB:23 1

我还修补了我的蓝牙设备错误(brcm/BCM20702A1-13d3-3404.hcd 的直接固件加载失败,错误 -2)在该文档链接之后(没有描述的模块重新编译)

wget https://www.dropbox.com/s/krg2ulkxdrqxham/bluetooth-hogfan.tar.gz
tar -zxvf bluetooth-hogfan.tar.gz
cd bluetooth
sudo cp fw-13d3_3404.hcd /lib/firmware/brcm
sudo cp fw-13d3_3404.hcd /lib/firmware/brcm/BCM20702A1-13d3-3404.hcd
sudo modprobe -r btusb
sudo modprobe btusb

结果,我可以使用通道 6(不是 1、2、3、4、5,...)连接 BT。我不知道为什么。

# in real rfcomm0 became rfcomm59 by the end of experimintations.
sudo rfcomm connect rfcomm0 8C:DE:52:44:AB:23 6
Connected /dev/rfcomm0 to 8C:DE:52:44:AB:23 on channel 6
Press CTRL-C for hangup

在另一个外壳中:

$: sudo cat /dev/rfcomm0 | hexdump -C
...
000f7f80  00 7b 02 aa aa 04 80 02  00 2c 51 aa aa 04 80 02  |.{.......,Q.....|
000f7f90  ff f9 85 aa aa 04 80 02  ff f9 85 aa aa 04 80 02  |................|
000f7fa0  00 44 39 aa aa 04 80 02  00 5b 22 aa aa 04 80 02  |.D9......[".....|
000f7fb0  00 31 4c aa aa 04 80 02  00 07 76 aa aa 04 80 02  |.1L.......v.....|
000f7fc0  ff ba c4 aa aa 04 80 02  ff 7e 00 aa aa 04 80 02  |.........~......|
000f7fd0  ff b3 cb aa aa 04 80 02  ff f9 85 aa aa 04 80 02  |................|
000f7fe0  00 1b 62 aa aa 04 80 02  00 45 38 aa aa 04 80 02  |..b......E8.....|
000f7ff0  00 36 47 aa aa 04 80 02  00 27 56 aa aa 04 80 02  |.6G......'V.....|
000f8000  00 66 17 aa aa 04 80 02  00 c5 b8 aa aa 04 80 02  |.f..............|
000f8010  00 e6 97 aa aa 04 80 02  00 91 ec aa aa 04 80 02  |................|
000f8020  ff f3 8b aa aa 04 80 02  ff d3 ab aa aa 04 80 02  |................|
000f8030  00 28 55 aa aa 04 80 02  00 36 47 aa aa 04 80 02  |.(U......6G.....|
...

数据含义的详细信息在此处此处此处进行了描述。有时它可以长时间正常工作,有时神经串行流会带来EOF,因此在断开连接后的一段时间内读取 /dev/rfcomm0 很有用。如果连接到通道 3,我得到:

sudo rfcomm connect rfcomm0 8C:DE:52:44:AB:23 3
Connected /dev/rfcomm43 to 8C:DE:52:44:AB:23 on channel 3
Press CTRL-C for hangup
# since 10 secs it is disconnect....
Disconnected

输出是:

$ sudo cat /dev/rfcomm43 | hexdump -C
00000000  55 04 00 38 00 00 c4 55  04 00 38 00 00 c4 55 04  |U..8...U..8...U.|
00000010  00 38 00 00 c4 55 04 00  38 00 00 c4 55 04 00 38  |.8...U..8...U..8|
...
000000a0  c4 55 04 00 38 00 00 c4  55 04 00 38 00 00 c4     |.U..8...U..8...|
000000af
# (and disconnect)

顺便说一句,我尝试运行NeuroPy 示例并且只得到了一次注意力测量:)。接下来我还要做:

sudo chmod 777 /dev/rfcomm0
sudo python neuropyexample.py

在所有描述的实验中,BrainLink 已从 blueman 配对设备中删除。我还在 TuSion via-Art 神经应用程序开发过程中进行了测试。这里是 Facebook社区组我的最后一句话:

# Ubuntu 16.04 
$ uname -a
Linux SlavikBoss 4.4.0-81-generic #104-Ubuntu SMP Wed Jun 14 08:17:06 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
于 2017-07-05T10:55:29.070 回答
0

我参考了 Jo Ja 的回答解决了这个问题。详细过程如下:

  1. hcitool scan ---找到你的brainlink的地址。如果它不起作用,请再试一次,或者使用您计算机上 的蓝牙 这是ubuntu中蓝牙的图像

    $ hcitool scan Scanning ... B0:C0:90:B3:ED:7A DESKTOP-JA7BUAI 0D:00:18:A1:54:DD BrainLink_Lite

  2. sudo rfcomm connect /dev/rfcomm0 0D:00:18:A1:54:DD 2 -----最后一个数字2表示将你的brainlink连接到通道2,这可能与计算机不同,我猜原因是蓝牙的频率范围是从2401mhz到2479mhz,每个通道占1MHz,总共79个通道。因此,您应该尝试在您的计算机中使用哪个频道。

    $ sudo rfcomm connect /dev/rfcomm0 0D:00:18:A1:54:DD 2 Connected /dev/rfcomm0 to 0D:00:18:A1:54:DD on channel 2 Press CTRL-C for hangup

    /dev/rfcomm1 或 /dev/rfcomm2 或其他数字都可以,然后 rfcommX 将出现在'/dev/'的路径中,并在断开连接时消失。

    使用命令$ rfcomm -i --device,可以看到你的brainlink已经连接到0C:DD:24:16:ED:69(你本地的蓝牙地址)

    $ rfcomm -i --device rfcomm0: 0C:DD:24:16:ED:69 -> 0D:00:18:A1:54:DD channel 2 connected [reuse-dlc release-on-hup tty-attached]

  3. 在另一个外壳中:

    sudo cat /dev/rfcomm0 | hexdump -C 00000000 7a aa aa 04 80 02 00 6c aa aa 04 80 02 00 21 5c |z......l......!\| 00000010 aa aa 04 80 02 00 31 4c aa aa 04 80 02 00 35 48 |......1L......5H| 00000020 aa aa 04 80 02 00 6a aa aa 04 80 02 ff ef 8f aa |......j.........| 00000030 aa 04 80 02 00 06 77 aa aa 04 80 02 00 34 49 aa |......w......4I.| 00000040 aa 04 80 02 63 aa aa 04 80 02 00 0a 70 aa aa 04 |....c.......p...| 00000050 80 02 00 17 66 aa aa 04 80 02 00 16 67 aa aa 04 |....f.......g...| 00000060 80 02 00 24 59 aa aa 04 80 02 00 34 49 aa aa 04 |...$Y......4I...| 00000070 80 02 00 3b 42 aa aa 04 80 02 00 31 4c aa aa 04 |...;B......1L...| 00000080 80 02 00 6a aa aa 04 80 02 00 01 7c aa aa 04 80 |...j.......|....| 00000090 02 00 6a aa aa 04 80 02 00 20 5d aa aa 04 80 02 |..j...... ].....| 000000a0 00 04 79 aa aa 04 80 02 ff f5 89 aa aa 04 80 02 |..y.............|

    如果输出如下所示,说明您在第 2 步中没有选择正确的通道,您应该在计算机中尝试正确的通道:

    $ sudo cat /dev/rfcomm0 | hexdump -C 00000000 ff 55 02 00 ee 10 ff 55 02 00 ee 10 ff 55 02 00 |.U.....U.....U..| 00000010 ee 10 ff 55 02 00 ee 10 ff 55 02 00 ee 10 ff 55 |...U.....U.....U| 00000020 02 00 ee 10 ff 55 02 00 ee 10 ff 55 02 00 ee 10 |.....U.....U....| 00000030 ff 55 02 00 ee 10 ff 55 02 00 ee 10 ff 55 02 00 |.U.....U.....U..| 00000040 ee 10 ff 55 02 00 ee 10 ff 55 02 00 ee 10 ff 55 |...U.....U.....U| 00000050 02 00 ee 10 ff 55 02 00 ee 10 ff 55 02 00 ee 10 |.....U.....U....| 00000060 ff 55 02 00 ee 10 ff 55 02 00 ee 10 ff 55 02 00 |.U.....U.....U..| 00000070 ee 10 ff 55 02 00 ee 10 ff 55 02 00 ee 10 ff 55 |...U.....U.....U|

  4. 运行NeuroPy 示例并引起注意。NeuroPy 示例在 python2 中工作,您应该对其进行更改以使其在 python3 中工作

    $ sudo python neuropyexample.py

    不要忘记在 sudo 模式下运行,并$ sudo cat /dev/rfcomm0 | hexdump -C提前使用 ctrl+c 停止终端。

于 2020-03-31T03:08:21.617 回答