在linux中通过蓝牙访问Neurosky Mindset的串行数据

时间:2013-04-03 22:06:52

标签: linux bluetooth serial-port

我正在尝试通过蓝牙访问从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 语言库Attr列表:   code_ISO639:0x656e   编码:0x6a   base_offset:0x100

(我得到的不止这些,但这是我正在尝试访问的服务。)

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

我已将所有内容都设置为root和regular,因此似乎无法修复它。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

好的,需要花一点时间才能让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. 输入PIN码(0000)
  7. 连接:

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

      bash $ sudo /etc/init.d/bluetooth stop; sudo /etc/init.d/bluetooth start

    7. 拥有一个完全命令行驱动的解决方案不是更好吗?是的,是的。不幸的是,Linux上的蓝牙堆栈似乎处于GUI工具和命令行工具不合作的状态 - 命令行工具不支持配对(* UPDATE - 请参阅注释)。

      从设备读取很简单。它不断传输字节,因此从它读取,直到遇到两个SYNC字节(0xAA),它标记数据包的开头。数据包的结构在 mindset_communications_protocol.pdf 中描述,它在MDT中提供。

      用于从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 
      

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

答案 1 :(得分:0)

经过很多麻烦我发现许多小型新蓝牙加密狗的芯片组(包括耳机附带的那个和我已经拥有的另一个)无法处理插入USB集线器,必须是直接插入覆盆子pi - 即使它确实显示在设备列表中。一旦我将它从集线器中移开,bluez-simple-agent工作得很漂亮而且没有大惊小怪。

答案 2 :(得分: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),doc link之后(没有描述模块重新编译)

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

在另一个shell中:

$: 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.....|
...

数据含义的详细信息描述为hereherehere。有时它长时间工作正常,有时神经串行流会带来 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 example并且只获得一次关注度量:)。我还要做下一步:

sudo chmod 777 /dev/rfcomm0
sudo python neuropyexample.py
在所有描述的实验期间,

BrainLink从blueman配对设备中删除。我也在TuSion via-Art neuroapp开发过程中测试过。这是Facebook community group我的最后一句:

# 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

答案 3 :(得分:0)

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

  1. hcitool扫描---查找您的大脑联系地址。如果它不起作用,请重试,或在计算机上使用蓝牙 here is the image of bluetooth in 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表示将您的大脑链接连接到通道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,可以看到您的大脑链接已连接到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 example并引起注意。 NeuroPy示例在python2中可用,您应该对其进行更改以使其在python3中可用

    $ sudo python neuropyexample.py

    别忘了以sudo模式运行,并提前使用ctrl + c停止$ sudo cat /dev/rfcomm0 | hexdump -C终端。