gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:11 26 4
gpt4 key购买 nike

我正在尝试通过蓝牙访问从 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 records,我会得到以下输出:

服务名称:开发 B服务记录句柄:0x10005服务类别 ID 列表: “串口”(0x1101)协议(protocol)描述符列表: “L2CAP”(0x0100) “RFCOMM”(0x0003) channel :3语言基础属性列表: 代码_ISO639:0x656e 编码:0x6a base_offset: 0x100

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

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

我已经以 root 和常规方式运行所有内容,所以这似乎无法解决问题。

如有任何帮助,我们将不胜感激。

最佳答案

好吧,花了一些时间才让 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 并选择“断开连接:Dev B”
  5. 退出 Blueman
  6. 重启蓝牙以释放 rfcomm0(感谢 BlueMan!)

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

拥有一个完全由命令行驱动的解决方案不是更好吗?是的,是的。不幸的是,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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com