c - 如何在 Raspberry Pi 上运行 Azure IoT C SDK 的端到端测试?
问题描述
我正在尝试在树莓派上编译和测试 azure-iot-sdk-c。如何在树莓派上编译,然后运行 SDK 中提供的端到端测试?
解决方案
为了实现这一点,您可以采取几种方法。您可以为 Pi 下载一个交叉编译器,并将源代码仅保留在您的开发机器上。然后,当您想在 Pi 上运行代码/测试时,您将使用交叉编译器生成可以在 Pi 上运行的输出,将可执行文件传输到 Pi,并将结果返回给开发机器。这种方法可能会很快,如果您的项目包含许多文件,这可能是一个很好的方法。设置交叉编译器并不是最简单的事情,但是网上有很多记录在案的人已经这样做了。
另一种方法是在您的开发机器上开发源代码,但在 Pi 本身上为 Pi 构建代码。这消除了设置交叉编译器的需要,并且使将测试结果返回到您的开发机器变得非常简单。
您可以使用文本编辑器在开发机器上开发代码。然后 rsync 将源文件传输到 Raspberry Pi。最后,您可以在您的开发机器和 Pi 上安装 Ruby 和 Ceedling(一个 C 单元测试工具)以帮助运行测试。以下是如何让这一切发生。
- 设置 SSH 密钥
这一步很重要,因为它允许您将文件从开发机器传输到 Pi 并远程执行命令,而无需每次都输入用户名和密码。首先,确保您的开发机器上生成了 SSH 密钥。如果您不知道,或者不确定,请查看这篇出色的GitHub 文章,该文章解释了如何生成一个.
如果您在开发机器上打开 ~/.ssh(或 Windows 上的 /user/directory/.ssh)目录,您应该有一个名为 rd_isa.pub 的文件。这是 SSH 密钥的“公共”部分。您需要将此文件传输到 Raspberry Pi,以便它可以将您识别为已批准的用户。使用以下命令执行此操作:
scp ~/.ssh/id_rsa.pub user@remote.host:pubkey.txt
确保将“user”替换为 Raspberry Pi 上的用户名,将“remote.host”替换为 Pi 的 IP 地址。
完成后,您需要将密钥附加到 Pi 上的“authorized_keys”文件中。为此,您需要通过 SSH 连接到 Pi 并手动编辑/创建文件。可以这样做:
scp ~/.ssh/id_rsa.pub user@remote.host:pubkey.txt
ssh user@remote.host
mkdir ~/.ssh
cat pubkey.txt >> ~/.ssh/authorized_keys
rm ~/pubkey.txt
- 安装“rsync”</li>
下一步是安装 rsync,这是一个允许您在两台计算机之间同步目录的实用程序。当我们在本地机器上进行更改时,rsync 会将这些更改传输到 Pi 进行测试。rsync 足够聪明,只传输自上次传输以来已更新的文件,这将加快进程。要使 rsync 工作,它必须同时安装在您的开发机器和 Raspberry Pi 上。要将其安装在 Pi 上,请执行以下命令。
sudo apt-get install rsync
在您的开发机器上安装 rsync 的过程会因您运行的操作系统而有很大差异。在 Mac 上,它已经安装好了。一些 Linux 发行版也附带它。另一方面,Windows 有点落后。在 Google 上搜索“在 Windows 上安装 rsync”以获取有关设置的说明。
- 安装 Ruby
Ruby 是另一个需要由开发机器和目标安装的组件。Ruby 是 Ceedling 用于自动执行单元测试的一种脚本语言。同样,请参阅全面的 Google 以获取有关在您的开发机器上安装最新版本的说明。要在 Raspberry Pi 上安装 Ruby,请使用以下命令:
sudo apt-get install ruby
- 安装耙子
Rake 是一个 Ruby gem(包),它提供类似于“make”的构建自动化支持。安装 Ruby 后,Rake 的安装就像键入以下内容一样简单:
sudo gem install rake
- 设置一个 Ceedling 项目
最后,我们已经可以在本地编写代码并使用命令“rake test:all”在我们的开发机器上执行测试。
我们需要做的最后一件事是设置一个自定义 rake 任务,该任务将在 Pi 上运行测试,而无需手动 SSH 进入它。查看 Ceedling 项目的根目录,您将看到一个名为 Rakefile.rb 的文件。这是我们将放置自定义 rake 任务的地方。将以下内容添加到文件底部:
desc "Run rake test:all on RPi with latest changes"
desc "Update the RPi with the latest changes on dev machine."
task :update_pi_source do
#send the latest changes to the pi
puts cmd = "rsync -r -v . #{REMOTE_RPI_USER}@#{REMOTE_RPI_IP_ADDR}:#{REMOTE_RPI_PROJ_ROOT} --exclude=#{PROJECT_BUILD_ROOT}"
system(cmd)
end
desc "Run rake test:all in the project directory on the pi"
task :run_all_tests_pi do
#execute tests on the pi
puts cmd = "ssh #{REMOTE_RPI_USER}@#{REMOTE_RPI_IP_ADDR} "cd #{REMOTE_RPI_PROJ_ROOT} && rake test:all""
system(cmd)
end
task :pi_test_all > [:update_pi_source, :run_all_tests_pi] do
end
这实际上定义了三个 rake 任务。第一个,update_pi_src,是使用 rsync 更新 Pi 上的源代码的任务。第二个,run_all_tests_pi,使用 SSH 执行必要的命令来编译代码并在 Pi 上运行测试。第三个任务 pi_test_all 只是结合了前两个的包装器。
希望能帮助到你。
推荐阅读
- c# - 使用 Datetime.UTC 设置西中非时间
- android - Ubuntu:Android Studio 中的虚拟设备
- r - plotly_selected 在 R 中不起作用
- foreach - 如果列表行在 SwiftUI 中包含文本字段,则无法从 foreach 中删除元素
- android - Android 导航组件通过 safeArgs 和深度链接传递参数
- python - Django ORM - 按装饰器聚合
- installation - 为什么要在不同的环境中多次安装相同的应用程序?(Anaconda-Navigator)
- youtube-api - YouTube 数据 API v3:ChannelListResponse、PlaylistListResponse 和 PlaylistItemListResponse 的 etag 实现中断
- python - Python 3.9.0 不在终端中打印彩色文本
- c++ - 使用三元运算符时的C++ std::length_error?