IoT Starter Raspberry Pi Core






4.76/5 (6投票s)
IoT Starter Pi Core 为 Raspberry Pi 开发了一个由 Swagger Hub 自动生成的 ASP.NET Core Web 服务。
引言
在这个以 Linux 上的 Raspberry Pi 为目标的项目中,我们采用了 API First 设计策略,利用 Swagger Hub 自动生成 ASP.NET Core Web 服务器。在 Windows 10 上运行的 Visual Studio 结合快速的 x64 CPU 是这个入门套件的关键优势。在此项目之前,已有相关研究,请参阅以下链接:
背景
有关 IoT Starter 的更多详情,请参阅以下文章和仓库:
- Netduino Plus 2 的 IoT 入门核心
- https://github.com/josemotta/IoT.Starter
- https://github.com/josemotta/IoT.Starter.Np2.Core
- https://github.com/josemotta/IoT.Home.Netduino
Raspberry Pi 的 IoT API
从 Swagger API 定义开始,使用 SwaggerHub 开发了一个 ASP.NET Core Web API。代码自动生成并推送到 github。然后,它被一台 Windows x64 机器加载,并升级到 ASP.NET Core 2.0,使用了 Visual Studio 2017。
在快速的 Windows x64 机器上实现了多阶段 Docker 镜像构建,为 linux-arm 生成代码。相同的 VS 解决方案包含 Web 服务器和 Web UI 的独立项目。两个 Docker 镜像都被推送到云端,然后被拉回到安装了 Raspbian 9.1 stretch 的 Raspberry Pi 上。
以下是该项目的预期工作流程,它将包含建模、编程和开发、部署和测试等活动的周期。主要目标总结如下:
建模
- API 在 SwaggerHub 上设计,请在此处查看文件:此处
- SwaggerHub 自动生成 Web 服务存根
- SwaggerHub 直接连接到 GitHub 仓库
- SwaggerHub 配置为将代码推送到 Github 上的 'swag' 分支
在 Windows 10 x64 上进行开发
-
安装 Docker
Web服务
- 从 Github 拉取 Swaggerhub 生成的代码
- 升级到 .NET Core 2 框架和 Docker 支持
- 将 swag 分支的代码合并到 master
- 为 Web 服务创建多阶段 Docker 构建
- 在 x64 机器上为 linux-arm 框架编译
- 将 Docker 镜像推送到云端:home-web
Web UI
- 基于默认的 razor pages 应用生成另一个项目
- 为 Web UI 添加多阶段 Docker 构建
- 将 Docker 镜像推送到云端:home-ui
在 Linux 的 Raspberry Pi 上部署
- Raspbian GNU/Linux 9.1 (stretch)
- 安装 Docker
- 运行 home-web 和 home-ui 的两个 Docker 镜像
测试
- 回到 x64 机器
- 通过任何浏览器访问 home-web 和 home-ui
在 Raspberry Pi 上同时运行两个镜像
一台安装了 Raspbian 9.1 stretch 的 Raspberry Pi 连接到与 x64 机器相同的局域网。已安装 Docker,并且下面显示的命令会激活 home-ui 和 home-web 镜像。它们分别开始监听端口 80 和 5010。
命令开始清除所有 docker 容器和镜像
root@lumi:~# docker stop $(docker ps -a -q)
d687099cc4df
05a351957bda
eb9a76c7c834
root@lumi:~# docker rm $(docker ps -a -q)
d687099cc4df
05a351957bda
eb9a76c7c834
root@lumi:~# docker rmi --force $(docker images -q)
Untagged: josemottalopes/home-web:latest
Untagged: josemottalopes/home-web@sha256:74aec90ed6a11f567aa8d62ffaea640fbdeb17704e474a9c000bb96ae72ceca6
Deleted: sha256:88f48c67c247db06f555014f5bdbd0fec76418f99d8e3a6d9402574ddf67edfc
Deleted: sha256:975185cce94e4c6195cf1977d1dccfac4300d10a7d9b3d784146ddaf7cc3f00a
Deleted: sha256:40c2b44171227ea087362888d4762791b2c15a18000c914e8f340bf98dc8cc51
Untagged: josemottalopes/home-ui:latest
Untagged: josemottalopes/home-ui@sha256:ecc1fa65c4d88f23794c528e669631ff2a4d03a8be3327608317d16453b78143
Deleted: sha256:7eb1d110bcc4047eae1d76b32dff1277d3d56244dc41bf79073819be5b7a5b56
Deleted: sha256:623da47a649523f1ddd665a729004b95acf2d492c3febbaa9bad6c606b3a5c88
Deleted: sha256:82526805c29cbe6512e8fcf184e6743c2c71d806df016af30ef2ec1e34178eac
Untagged: josemottalopes/home-web@sha256:cb36cf1b6b7bceb45f0889bae614bcbbf19f6c4445f51f185622b7e5e4dd86be
Deleted: sha256:032d614f3fc0f6bd656de95c50333e2d21ac34db30f91ed771e228f4f439c00a
Deleted: sha256:96fe25beadd9cb5d8addf865649b3fed6f14df768f233c49cb1f678c857a9f58
Deleted: sha256:8f5f132e4fc566d4a0ac7e941c5b0c384ee9afd010d233882b0be97b81d0d149
Untagged: josemottalopes/home-web@sha256:5a87e73708e2ac67b3560defe65595694a9e5e49a23595c5a08482ea1faad577
Deleted: sha256:5a774d2f95f6fa473e1d341a0af3f42ce9265385d9a5b30d125eaf9a5b3cdede
Deleted: sha256:8d183a855f79509984b3bf808a525249cb88d4cfeff27959dfb231387460ea44
Deleted: sha256:89bd29e762daf375f4d73c7d231dbef9650845f98d77dc4e50a3f8a0f62b4a54
Deleted: sha256:50224a368775f0d05c4539350d6d692018c32627df45b13e43b68f42e4be445b
Deleted: sha256:cd6fedc1173aade60448959776c946bc28de703afef26adb61d296e88bfe6b2f
Deleted: sha256:f96ade99e9d01f22ce8fc2d4371da8e3b1ae01fe4a1654748f32338224341dc2
Deleted: sha256:ccd48fa5ba354572eff0c0cf514f83187f859b2199ebcb8bf02573642f8186cb
然后所有项目都启动,将镜像从 DockerHub 下载到 Raspberry Pi。您可以注意到 home-ui 项目与 home-web 项目共享四个镜像,无需再次下载。
root@lumi:~# alias
alias yhomeui='docker run --privileged -p 80:80 -d josemottalopes/home-ui:latest'
alias yhomeweb='docker run --privileged -p 5010:5010 -d josemottalopes/home-web:latest'
root@lumi:~# yhomeweb
Unable to find image 'josemottalopes/home-web:latest' locally
latest: Pulling from josemottalopes/home-web
0d9fbbfaa2cd: Pull complete
b015fdc7d33a: Pull complete
60aaa226f085: Pull complete
01963091a185: Pull complete
6f687f698add: Pull complete
7523740b666e: Pull complete
Digest: sha256:74aec90ed6a11f567aa8d62ffaea640fbdeb17704e474a9c000bb96ae72ceca6
Status: Downloaded newer image for josemottalopes/home-web:latest
73780b8675a51c3eb7e1b5485934fe6060e05d7a4144c33e4ba873a0dc92972d
root@lumi:~# yhomeui
Unable to find image 'josemottalopes/home-ui:latest' locally
latest: Pulling from josemottalopes/home-ui
0d9fbbfaa2cd: Already exists
b015fdc7d33a: Already exists
60aaa226f085: Already exists
01963091a185: Already exists
9ba45e81e264: Pull complete
2e769f6ed072: Pull complete
Digest: sha256:ecc1fa65c4d88f23794c528e669631ff2a4d03a8be3327608317d16453b78143
Status: Downloaded newer image for josemottalopes/home-ui:latest
f43b25bff7ba4d0c52d5d5a3be6d3e294757ed3d2cc8157ee5fe81e710051a41
下面显示了 Docker 镜像和正在运行的容器
<font size="1">
root@lumi:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f43b25bff7ba josemottalopes/home-ui:latest "dotnet Home.UI.dll" 12 seconds ago Up 8 seconds 0.0.0.0:80->80/tcp sleepy_mayer
73780b8675a5 josemottalopes/home-web:latest "dotnet IO.Swagger..." About a minute ago Up About a minute 80/tcp, 0.0.0.0:5010->5010/tcp goofy_bassi
root@lumi:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
josemottalopes/home-web latest 88f48c67c247 21 hours ago 235MB
josemottalopes/home-ui latest 7eb1d110bcc4 21 hours ago 233MB
</font>
在浏览器中检查,我们看到 home-web 和 home-ui 这两个项目都在 Linux 的 Raspberry Pi 上运行。
升级 API
API 的更改通过编辑 Swaggerhub 上的 API 主文件进行。为了顺利更新项目,应进行以下配置,选择合适的仓库和一个名为 "swag
" 的新分支来存储更改。
请注意,有必要允许对某些文件夹(包括 models、controllers 和 wwwroot)拥有完全控制权,如下所示。
生成的文件可能包含一些垃圾,应妥善清理,包括之前 Visual Studio 版本的一些 .json 和 .sln 文件。
有时,Swaggerhub 生成的代码可能会出现一些破坏性更改。在这种情况下,Visual Studio(我使用的是 Community 2017 Preview2)可以自动将其转换为 ASP.NET Core 2.0。将 Swaggerhub Integration 的 Output Folder 更改为 "home2",并允许 VS 自动调整解决方案文件、库等。然后,在另一个安全步骤中将更改带入 "home"。
使用 Visual Studio 设置 Docker,为解决方案应用 "Add Docker support" 菜单。然后,可以相应地调整 docker-compose 和 dockerfile,为 Windows x64 机器上的顺畅运行调整配置。
结论
这个入门套件可以改进或建立与 Linux 平台上已完成的大量工作的联系。像 LIRC(Linux Infrared Remote Control for Raspberry Pi)这样的项目将很快得到探索。
现在,请尽情享受这个项目吧!
历史
- 2017 年 12 月 13 日:初始版本,仓库位于 https://github.com/josemotta/IoT.Starter.Pi.Core
- 2018 年 2 月 14 日:版本 1.1,仓库位于 https://github.com/josemotta/IoT.Starter.Pi.Thing