我正在尝试在树莓派上编译和测试azure-iot-sdk-c。如何在树莓派上编译它,然后运行SDK中提供的E2E测试?
答案 0 :(得分:0)
为了实现这一目标,您可以采取几种方法。您可以下载用于Pi的交叉编译器,并将源代码仅保留在开发计算机上。然后,当您想在Pi上运行代码/测试时,可以使用交叉编译器生成可以在Pi上运行的输出,将可执行文件传输到Pi,然后将结果返回给开发机器。这种方法可能会非常快,并且如果您的项目包含许多文件,则可能是解决该问题的好方法。设置交叉编译器并不是一件最简单的事情,但是网上有许多有案可查的案例,说明已经有这样做的人了。
另一种方法是在开发机器上开发源代码,但在Pi本身上为Pi构建代码。这样就无需设置交叉编译器,并使将测试结果返回到开发计算机非常简单。
您可以使用文本编辑器在开发机器上开发代码。然后rsync将您的源文件传输到Raspberry Pi。最后,您可以在开发机器和Pi上安装Ruby和Ceedling(C单元测试工具),以帮助运行测试。这是实现这一切的方法。
此步骤很重要,因为它使您可以将文件从开发计算机传输到Pi并远程执行命令,而不必每次都输入用户名和密码。首先,请确保您在开发计算机上生成了SSH密钥。如果您不确定或不确定,请查看此出色的GitHub article that explains how to generate one。
现在,如果在开发计算机上打开〜/ .ssh(或Windows上的/user/directory/.ssh)目录,则应该有一个名为rd_isa.pub的文件。这是SSH密钥的“公开”部分。您需要将此文件传输到Raspberry Pi,以便它可以将您识别为批准的用户。使用以下命令执行此操作:
scp〜/ .ssh / id_rsa.pub user@remote.host:pubkey.txt
请确保在Raspberry Pi上用用户名替换“用户”,并用Pi的IP地址替换“ remote.host”。
完成此操作后,需要将密钥添加到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,该实用程序允许您在两台计算机之间同步目录。当我们在本地计算机上进行更改时,rsync会将这些更改传输到Pi进行测试。 rsync非常聪明,它仅可以传输自上次传输以来已更新的文件,这将加快处理过程。为了使rsync正常工作,必须将其同时安装在开发计算机和Raspberry Pi上。要将其安装在Pi上,请执行以下命令。
sudo apt-get install rsync
在您的开发计算机上安装rsync的过程会因运行的操作系统而异。在Mac上,它已经安装。一些Linux发行版也随之提供。另一方面,Windows落后于游戏。在Google上搜索“在Windows上安装rsync”以获取有关设置的说明。
Ruby是开发机器和目标需要安装的另一个组件。 Ruby是Ceedling用于自动执行单元测试的脚本语言。再次,请参阅所有Google,以获取有关在您的开发机器上安装最新版本的说明。要在Raspberry Pi上安装Ruby,请使用以下命令:
sudo apt-get install ruby
Rake是一个Ruby gem(软件包),提供类似于“ make”的构建自动化支持。一旦安装了Ruby,Rake的安装就像输入以下命令一样简单:
sudo gem install rake
最后,我们已经可以在本地编写代码并使用“ rake test:all”命令在开发计算机上执行测试。
我们最后要做的是设置一个自定义的rake任务,该任务将在Pi上运行测试,而无需手动SSH进入它。在Ceedling项目的根目录中查找,您将看到一个名为Rakefile.rb的文件。这是我们放置自定义耙任务的地方。在文件底部添加以下内容:
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
这实际上定义了三个耙任务。第一个是update_pi_src,它是使用rsync更新Pi上源代码的任务。第二个是run_all_tests_pi,它使用SSH执行必要的命令来编译代码并在Pi上运行测试。第三个任务pi_test_all只是将前两个结合在一起的包装器。
希望有帮助。