树莓派的物联网家居设备





5.00/5 (11投票s)
基于 Raspberry Pi、Linux、Swagger、Docker 和 .NET Core 的家庭物联网设备
引言
在构建了 IoT.Starter.Pi.Thing 系列的物联网胚胎后,我们现在准备向物联网家庭智能迈出更重要的一步。开发策略和环境基于以下内容:
- Raspberry Pi:Raspbian GNU/Linux 9.1 Stretch Lite 已安装在 Raspberry Pi (RPI) 主机上,并且 debian:stretch-slim 镜像基于 .NET Core 2.1 Preview 1 构建。更多关于 RPI 设置的详细信息可在此处 这里 以及 wiki 中找到。
- Swagger:API First Design 策略用于开发一个由 SwaggerHub 自动生成的 ASP.NET Core Web 服务器。Thing specification 展示了在家庭智能应用程序中使用的 `Thing` 胚胎的最小要求。每次 API 更改后,SwaggerHub 会自动生成更新的代码来构建 `home-srv` docker 镜像,最终推送到 DockerHub。
- Docker:在快速的 Windows x64 机器上完成多阶段 docker 镜像构建,生成 Linux-arm 框架的代码。镜像被推送到云端,然后拉回到运行 Linux 的 Raspberry Pi 上。通过在 x64 和 Linux-arm 两端执行,docker-compose 命令有助于正确构建、部署和运行容器。
- Lirc:由 RemoteAPI 驱动的 `IoT.Home.Thing` 模拟了传统的红外遥控器。Linux 红外遥控器已安装在 RPI 主机和 `home-srv` 容器上,为 `Thing` 增加了 IR 遥控器及其相应的 IR 代码。
请查看 IoT.Starter.Pi.Thing 以获取有关先前开发的更多详细信息。
创建新存储库
这是一个机会,可以将 `IoT.Starter.Pi.Thing` 用作此新项目的起点。第一步只是复制整个源代码作为 `IoT.Home.Thing` 的起点。然后,基于之前的文件,创建 `home-compose.yml`,如下所示:
version: "3"
services:
io.swagger:
container_name: home-srv
image: josemottalopes/home-srv
build:
context: .
dockerfile: Lirc/srv.Dockerfile
ports:
- "5000:5000"
network_mode: bridge
privileged: true
restart: always
devices:
- /dev/mem:/dev/mem
volumes:
- /var/run/lirc:/var/run/lirc
environment:
- ASPNETCORE_ENVIRONMENT=Release
home.ui:
container_name: home-cli
image: josemottalopes/home-cli
build:
context: .
dockerfile: src/Home.UI/cli.Dockerfile
ports:
- "80:80"
network_mode: bridge
restart: always
environment:
- ASPNETCORE_ENVIRONMENT=Release
ssl.proxy:
container_name: ssl-proxy
image: josemottalopes/home-ssl
build:
context: .
dockerfile: Proxy/proxy.Dockerfile
ports:
- "443:443"
network_mode: bridge
restart: always
Raspberry# IO
当前的 Raspberry# IO 是一个适用于 Raspberry Pi 的 .NET/Mono IO 库,由 Raspberry# Community 发起。它已由 Ramon Balaguer 更新为 .NET Standard 1.6 兼容性。为了将 RPI 项目定位到 .NET Core 2,相同的库代码再次升级,现在是 .NET Core 2.1 Preview 1。
增加了对 RPI3/BCM2835 的支持,这是基于 Michaltalaga 的 帖子。以下模块可用,您可以在 home/src 中查看。测试未包含。
Raspberry.System
:包含处理器、主板、型号等的定义。Raspberry.IO
:包含数字和模拟引脚输入和输出的基本 I/O。Raspberry.IO.Interop
:Linux I/O 控制设备和内存管理。Raspberry.IO.GeneralPurpose
:通过内存访问 Raspberry Pi GPIO 引脚,支持边沿检测,允许亚毫秒级轮询输入引脚。Raspberry.IO.SerialPeripheralInterface
:提供 SPI 的初步支持,使用 Linux 内核 SPI 模块驱动程序。Raspberry.IO.InterIntegratedCircuit
:提供 I2C 的初步支持。Raspberry.IO.Components
:提供对各种组件的初步支持,包括将用作示例的 HC-SR04 距离检测器。
带 HC-SR04 的距离测量仪
HC-SR04 是一个超声波模块,提供非接触式测量功能,测量范围从 2 到 400 厘米。如图所示,它有四个引脚:
- Vcc 和 Ground
- 触发脉冲输入
- 回声脉冲输出
如时序图所示,基本工作原理是:
- 在触发输入上发出至少 10 微秒(microseconds)的高电平脉冲。
- 模块自动发送八个 40 kHz 的声波。
- 模块检测是否有信号返回,并根据声音发出和返回传感器所需的时间来提高回声输出引脚。
- 已知声速为 340 m/s,即可计算出传感器到障碍物的距离。
仅为演示目的,HC-SR04 已连接到 GPIO 引脚:
- 触发脉冲输入连接到 GPIO20,连接器引脚 38。
- 回声脉冲输出连接到 GPIO21,连接器引脚 40。
然后,`GetHeaterState` 代码被调整为使用 Raspberry#IO 库中的 HC-SR04 距离检测器。
/// <summary>
///
/// </summary>
/// <remarks>gets the state of the heater</remarks>
/// <param name="zoneId"></param>
/// <response code="200">heater state</response>
[HttpGet]
[Route("/motta/home/1.0.1/temperature/{zoneId}/heater")]
[ValidateModelState]
[SwaggerOperation("GetHeaterState")]
[SwaggerResponse(200, typeof(HeaterState), "heater state")]
public virtual IActionResult GetHeaterState([FromRoute]string zoneId)
{
const ConnectorPin triggerPin = ConnectorPin.P1Pin38;
const ConnectorPin echoPin = ConnectorPin.P1Pin40;
double distance = 0;
string state = null;
Console.WriteLine("info: HC-SR04 distance measure");
Console.WriteLine(" Trigger: {0}", triggerPin);
Console.WriteLine(" Echo: {0}", echoPin);
var driver = GpioConnectionSettings.DefaultDriver;
using (var connection = new HcSr04Connection(
driver.Out(triggerPin.ToProcessor()),
driver.In(echoPin.ToProcessor())))
try
{
distance = connection.GetDistance().Centimeters;
Console.WriteLine(string.Format("{0:0.0}cm", distance).PadRight(16));
//Console.CursorTop--;
}
catch (TimeoutException e)
{
state = "Timeout: " + e.Message;
}
if (state == null) state = string.Format("{0:0.0} cm", distance);
HeaterState hs = new HeaterState
{
Id = zoneId,
State = state
};
var hs_state = hs ?? default(HeaterState);
return new ObjectResult(hs_state);
}
最终结果可以通过 Swagger UI 获得,如下所示:
现在,`IoT.Home.Thing` 已配备了强大的软件,可用于改进家庭智能项目。
玩得开心!
喜欢吗?请给我一个 ⭐️!
历史
- 2018 年 3 月 13 日:初始版本,存储库位于 https://github.com/josemotta/IoT.Home.Thing。