首页 > 解决方案 > 如何在 Raspberry Pi 上运行 Azure IoT C SDK 的端到端测试?

问题描述

我正在尝试在树莓派上编译和测试 azure-iot-sdk-c。如何在树莓派上编译,然后运行 ​​SDK 中提供的端到端测试?

标签: cazureiotazure-iot-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} &amp;&amp; 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 只是结合了前两个的包装器。

希望能帮助到你。


推荐阅读