在 Linux 机器上制作蓝牙 GATT 服务器是使用 BlueZ 完成的。使用现代 (5.50) BlueZ 的首选方法是通过 dbus API。
关于此主题的文档指出:
GATT 本地和远程服务共享相同的高级 D-Bus API。本地是指由 BlueZ 插件或外部应用程序导出的基于 GATT 的服务。远程是指对端导出的 GATT 服务。
我将其解释为:
无论本地服务和(Linux机器是服务器,其他设备通过蓝牙连接到它)远程服务(Linux机器是客户端,它通过蓝牙连接到其他设备)派代表参加了DBUS
这为问题设定了基本假设。
bluez 源代码提供了一个example-gatt-server。您可以执行一个示例,它会正常工作并将您的 Linux 机器置于 GATT 服务器中。
在该示例中,引用了任意命名的 dbus 对象。它的名字是/org/bluez/example/service
从文档中我希望一旦./example-gatt-server
成功运行应该有一个/org/bluez/example/service
地方。
事实并非如此:
~$ busctl tree org.bluez
??/org
??/org/bluez
??/org/bluez/hci0
Run Code Online (Sandbox Code Playgroud)
我正在使用外部设备确认 Linux 机器充当 GATT 服务器,但未/org/bluez/example/service
列出。
为什么/org/bluez/example/service
在 下找不到对象org.bluez
?
我只是在学习文件系统,据说目录只是一个普通文件,它保留了文件-inode 对的列表。
如果我尝试Downloads
使用以下任何一项打开目录cat
less
tail
,它只会输出它的目录并且无法打开。
思路怎么读呢?
我试图确定make install
内核的作用以及内核编译后的实际“安装”意味着什么。
问题是,我真的不能识别目标(Makefile文件参考)在“安装” Makefile
。
user@user-VirtualBox:~/Downloads/linux-3.14.1$ grep install: Makefile
firmware_install: FORCE
headers_install: __headers
modules_install: _modinst_ _modinst_post
modules modules_install: FORCE
modules_install: _emodinst_ _emodinst_post
Run Code Online (Sandbox Code Playgroud)
我应该从中得出什么结论?
我正在调试来自设备文件的二进制流。我希望将输出实时打印为十六进制值。
到目前为止,我已经使用过,tail -f /dev/ttyAPP2 | hexdump -C
但是在我开始在输出中丢失一些字节之后,我明白这可能是一个糟糕的选择,因为它在找到换行符之前不会刷新数据。
有一个非官方的二进制尾,但我目前无法使用这种方法,我正在寻找如何用其他方式实现这一目标的建议?
首先将 tty 设置为原始模式。
stty -F /dev/ttyAPP2 raw
Run Code Online (Sandbox Code Playgroud)
这是我在听设备时得到的(这是真实的输出)
root@Vdevice:/dev# hexdump -C < /dev/ttyAPP2
00000000 55 00 21 00 02 26 00 02 0b 00 09 02 06 01 00 01
00000010 99 0c ec 45 4f 01 03 47 41 54 45 57 41 59 43 54
Run Code Online (Sandbox Code Playgroud)
但是,预期的包应该是(这不是真正的输出):
root@Vdevice:/dev# hexdump -C < /dev/ttyAPP2
00000000 55 00 21 00 02 26 00 02 0b 00 09 02 06 …
Run Code Online (Sandbox Code Playgroud) 我有一系列失败/有时失败的 SD 卡。它们要么提供以下dmesg
输出之一:
完全死掉的(不要在 处列出/dev/mmcblk0
):
[ +0,000010] mmc0: error -110 whilst initializing SD card
[ +2,819983] mmc0: card never left busy state
Run Code Online (Sandbox Code Playgroud)
失败的(偶尔仍然可以安装):
[Jun16 06:28] mmc0: new high speed SDHC card at address 0001
[ +0,000339] mmcblk0: mmc0:0001 00000 3.68 GiB
[ +0,002835] mmcblk0: p1 p2 p3 p4
[ +10,256689] mmcblk0: timed out sending r/w cmd command, card status 0x900
[ +11,264358] mmcblk0: timed out sending r/w cmd command, card status 0x900
[ +0,000016] print_req_error: I/O …
Run Code Online (Sandbox Code Playgroud) 我正在尝试对驱动器进行网络备份。这个过程有两台机器。
电脑1:
电脑2:
我在 PC2 上执行以下操作:
sshfs root@PC1:/dev ~/Desktop/netdisk/
Run Code Online (Sandbox Code Playgroud)
安装得很好。我在 ~/Destkop/netdisk/ 中有可用的 sdb。下一步:
sudo dd if=~/Destkop/netdisk/sdb | gzip -c > ~/Destkop/ddbackup/image.gz
Run Code Online (Sandbox Code Playgroud)
产生错误:
dd: opening `netdisk/sdb': Permission denied
Run Code Online (Sandbox Code Playgroud)
当我检查 sdb 的权限时:
brw-rw---- 1 root disk 0, 0 Jan 3 10:47 sdb
Run Code Online (Sandbox Code Playgroud)
由于我以root@ PC1 的身份通过 ssh 连接到 PC1,这是否意味着我对作为 sshfs 挂载的文件具有 root 访问权限?
从这个例子看来它没有,这里有我遗漏的概念吗?
或者是否有可能克服错误,因为代码不在内核的整体部分?
A 在闪存驱动器上有一个根文件系统(文件系统 - 图像包含文件夹结构和内容)。闪存驱动器使用 UBI 作为底层文件系统文件系统 - 数据块映射到文件的方式,就像你说你使用的是 ext4)。
rootfs on / type rootfs (rw)
ubi0:root on / type ubifs (rw,sync)
Run Code Online (Sandbox Code Playgroud)
当有一个物理驱动器作为第一个参数时,我知道如何使用 dd 进行备份(例如。而不是rootfs
有一个/dev/sda
),但是在这里我不知道如何在当前场景中寻址驱动器(什么是的路径rootfs
)。
我如何检测到哪个文件footfs
或ubi0:root
对应于哪个文件?
有一个很好的问答来解释“真实”、“用户”和“系统”之间的关系。
它解释了为什么“真实”会发生变化的原因,并将“用户”和“系统”定义为进程在处理器上实际运行的时间。
现在让我们完全忽略“真实”。我注意到多次运行同一个应用程序时,它给出了不同的“系统”和“用户”。
$time dummy_app
user 0m0.032s
sys 0m0.064s
$time dummy_app
user 0m0.020s
sys 0m0.084s
Run Code Online (Sandbox Code Playgroud)
dummy_app 只是一个从 0 到 100000 计数的 for 循环。
同一个二进制文件的执行会在处理器上花费不同时间的原因是什么?换句话说,为什么同一个应用程序的“用户”和“系统”不总是相同的?
我试图了解符号表如何与 ELF 中的 .data 部分相关。首先是一些我作为基础的假设。
符号是映射到实际二进制值(CPU 对其进行操作)的函数或变量的人类可读(或“写在源文件中”)表示。
这是一个例子
//simple.c
int var_global_init = 5;
int main(void)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
让我们构建它并检查二进制文件:
$ gcc simple.c -o simple
$ objdump -t simple | grep var_global_init
0000000000201010 g O .data 0000000000000004 var_global_init
Run Code Online (Sandbox Code Playgroud)
它列出了.data
ELF 文件部分中的符号。ELF 文档的第 20 页
将该.data
部分定义为:
这些部分保存有助于程序内存映像的初始化数据。
好吧,这样的搭配。那么我问自己Does this mean that the symbol table is
embedded in the .data section?
。但这似乎被下面的例子反驳了:
$ readelf -s simple
Symbol table '.symtab' contains 66 entries:
....
50: 0000000000201010 4 …
Run Code Online (Sandbox Code Playgroud)