在探索.NET Core在Raspberry Pi上的应用时,意识到手动设置远程调试过程既繁琐又耗时。寻求一种更简便、更自动化的解决方案,其优势在于:简化操作流程,减少时间消耗,降低错误发生的可能性,轻松应对Raspbian新版本的更新,并且实现无头操作——即不需要显示器、键盘或鼠标。
虽然网络上有许多相关文章,但大多数都需要手动设置。目标是尽可能实现自动化,除了必须手动插入SD卡、启动设备等步骤外,其余过程都应通过运行脚本自动完成。正如Scott Hanselman所说:“一个好的(有点玩笑,但并非完全玩笑)程序员经验法则是——如果做了两次,那就自动化它。”
期望的设置能够实现以下目标:
使用VS Code已有几年时间,非常喜欢它,因此决定使用它(尽管也使用过各种版本的Visual Studio数十年,但这里不讨论它们的优缺点)。也很喜欢Powershell,但决定使用Bash来编写脚本,以实现尽可能的跨平台兼容性。需要配置VS Code以将bash设置为默认shell——最简单的方法是按Ctrl+Shift+P并输入default shell。这将提供命令提示符、Powershell或各种Linux选项。对而言,Git Bash效果最好,但其他选项也应该可行。
VS Code解决方案可以复制到开发机的任何位置。在Visual Studio Code中打开它时,使用File菜单中的Open Folder。
需要一种方法将Raspbian镜像传输到SD卡。推荐使用Raspberry PiImager。不必先下载镜像,但认为值得一试,否则可能发现自己会消耗大量互联网带宽(镜像文件即使压缩后也往往是几GB)。下载的镜像可以通过Use custom在镜像列表中访问。
需要一个Wi-Fi路由器,并需要知道SSID和PSK。假设已经拥有这些。显然,还需要一个Raspberry Pi和电源。在Raspberry Pi 3上测试了这个过程,但任何V2及以上版本的Raspberry Pi都应该可以。请注意,这不会在Raspberry Pi Zero上工作,因为它使用的是ARMV6,遗憾的是.NET Core不支持。如果Raspberry Pi没有内置Wi-Fi,还需要一个USB Wi-Fi适配器。
最后,需要下载最新版本的.NET CoreSDK。截至本文撰写时,是3.1版本。这应该复制到PiFiles文件夹中。需要ARM32版本,预计大小将超过100MB。
一旦有了一个新刷写的SD卡,就需要在插入Raspberry Pi之前进行一些额外的配置。这是任务1和2。要运行任务,按Ctrl+Shift+P并选择Tasks: Run Task。应该看到一个任务列表,如下所示:
Select task
1. Set Wifi Settings...
2. Modify SD Card for SSH access...
选择任务1“设置Wi-Fi设置...”,这将要求输入Wi-Fi SSID和PSK。当输入这些信息后,它们将被存储在settings.json中,所以不必再次输入。
然后选择任务2“修改SD卡以进行SSH访问...”,这将要求输入SD卡所在的驱动器。因为这将在bash脚本中访问,所以很可能是像/d或/mnt/d这样的路径。如果刚刚镜像了卡,可能需要重新插入,因为镜像程序在完成后会弹出它。运行任务2后,应该弹出卡并将其插入Raspberry Pi。启动Raspberry Pi并等待它启动,然后再进行下一步。
下一步是运行任务3“设置Raspberry Pi名称”。这将把主机名从默认的raspberrypi更改为选择的名称。还会问是否要设置静态IP地址。如果不想要静态IP,就留空。在Windows 10和本地主机名查找(mDNS)方面的经验参差不齐——不确定它是否像应该的那样可靠。然而,即使无法完全实现本地名称解析,也应该能够使用IP地址。与以前一样,这些设置被记住在settings.json中,所以不必重新输入。
设置新名称后,任务4“将公钥SSH添加到Raspberry Pi”将重新配置Raspberry Pi并将公钥ssh复制到它上面,这样(或VS工具)通过ssh连接时就不必输入密码了。将被问及是否要连接(输入yes),然后是Raspberry Pi密码(输入raspberry)。此时,Raspberry Pi将重新启动,所以在运行下一步之前需要等待。如果还没有设置ssh密钥,像这样的文章会告诉如何创建一个。现在应该能够登录而不必输入密码,但仅限于机器。
5. Raspberry Pi Dotnet install
任务5“Raspberry Pi Dotnet安装”将在Raspberry Pi上安装.NET Core SDK和VS调试器。这将需要一段时间,但一旦完成,现在就能够在Raspberry Pi本身或远程在主要开发机上编写.NET程序——显然远程会更有趣!
创建了两个示例程序。第一个是一个“Hello World”项目。这将同时在本地(即,在开发机上)和远程运行。运行它的最简单方法是选择左侧的Run图标并从下拉菜单中选择配置:
现在应该能够像在本地一样设置断点和调试:
为了运行Blink程序,需要将一个LED连接到GPIO引脚之一。Blink程序使用了出色的System.Device.Gpio库,应该会自动通过NuGet安装。