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

标签 linux bluetooth serial-port

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

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 服务记录句柄:0x10005 服务类别 ID 列表: “串行端口”(0x1101) 协议(protocol)描述符列表: “L2CAP”(0x0100) “RFCOMM”(0x0003) channel :3 语言基础属性列表: 代码_ISO639:0x656e 编码:0x6a 基本偏移量:0x100

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

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

我已经以 root 和常规身份运行所有内容,因此似乎无法解决问题。

任何帮助将不胜感激。

最佳答案

好的,花了一些时间才使 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)

连接:

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

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

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

从设备读取数据非常简单。它连续传输字节,因此要从中读取数据,直到遇到两个 SYNC 字节 (0xAA),这标志着数据包的开始。数据包的结构在 MDT 中提供的 mindset_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 

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

关于linux - 在 Linux 中通过蓝牙访问 Neurosky Mindset 的串行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799076/

相关文章:

c - 您如何理解 mlockall 手册页?

linux - 刷新CPU缓存而不使缓存失效?

linux - %pre 部分在 kickstart 安装中不起作用

ruby-on-rails - 每当 gem cronjob 不从/etc/environment 加载 PATH

java - 我如何在一秒内实时获得蓝牙 RSSI 10 次,持续 10 秒

android - 我可以使用 RFCOMM 蓝牙协议(protocol)在 iOS 设备和其他设备之间共享数据吗?

java - 尝试将 BeaconParser 添加到 AltBeacon 库时出现异常

c - 串行端口 : Read data problem with loopback, 未读取任何内容

visual-studio-2010 - 使用Visual Studio 2010和C的串行通信(用于Arduino)

c# - 从蓝牙设备获取错误的串行端口名称 (c#)