我正在尝试通过蓝牙访问从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,因此似乎无法修复它。
非常感谢任何帮助。
答案 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配对。
设定:
连接:
重新启动蓝牙以释放rfcomm0(谢谢,BlueMan!)
bash $ sudo /etc/init.d/bluetooth stop; sudo /etc/init.d/bluetooth start
拥有一个完全命令行驱动的解决方案不是更好吗?是的,是的。不幸的是,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.....|
...
数据含义的详细信息描述为here,here和here。有时它长时间工作正常,有时神经串行流会带来 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的回答解决了这个问题。 详细过程如下:
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
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]
在另一个外壳中:
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|
运行NeuroPy example并引起注意。 NeuroPy示例在python2中可用,您应该对其进行更改以使其在python3中可用
$ sudo python neuropyexample.py
别忘了以sudo模式运行,并提前使用ctrl + c停止$ sudo cat /dev/rfcomm0 | hexdump -C
终端。