随着物联网技术的不断进步,智能家居系统正逐渐成为现实。本文将介绍如何使用Raspberry Pi和.NET Core技术构建一个智能家居系统。将探讨开发策略、环境设置、API设计、容器化部署以及红外遥控的集成。
首先,需要在Raspberry Pi主机上安装Raspbian GNU/Linux 9.1 Stretch Lite操作系统。此外,将使用.NET Core 2.1 Preview 1版本来构建应用程序。详细的RPI设置可以在找到,也可以参考。
采用API First Design策略,使用SwaggerHub自动生成ASP.NET Core Web服务器。Thing规格定义了智能家居应用中使用的Thing胚胎的最小要求。每次API更改后,SwaggerHub都会自动生成更新的代码,以构建home-srv Docker镜像,并最终推送到DockerHub。
在一台快速的Windows x64机器上完成多阶段Docker镜像构建,生成linux-arm框架的代码。然后将镜像推送到云端,并从Raspberry Pi的Linux环境中拉取。在x64和linux-arm两端执行的docker-compose命令有助于正确构建、部署和运行容器。
IoT.Home.Thing,由RemoteAPI驱动,模拟传统的红外遥控器。Linux Infrared Remote Control for Raspberry Pi在RPI主机和home-srv容器中安装,扩展了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 Pi设计的.NET/Mono IO库,由Raspberry#社区发起。它已经被更新到.NET Standard 1.6兼容性,由Ramon Balaguer进行。为了针对RPI项目使用.NET Core 2,相同的库代码再次升级,现在升级到.NET Core 2.1 Preview 1。基于Michaltalaga的,增加了对RPi3/BCM2835的支持。可以在中查看可用的模块。测试没有包括在内。
HC-SR04是一个超声波模块,提供非接触式测量功能,测量距离从2到400厘米。如下图所示,它有四个引脚:Vcc和Ground、触发脉冲输入、回波脉冲输出。如下图所示的时序图,其工作原理是:在触发输入处发出至少10微秒的高电平脉冲,模块自动发送八个40 kHz声波,模块检测是否有信号返回并为声波离开并返回传感器的时间提高回波输出引脚。然后,通过知道声速为340 m/s来计算传感器到障碍物的距离。仅作为演示目的,HC-SR04连接到GPIO引脚:触发脉冲输入连接到GPIO20,连接器引脚38;回波脉冲输出连接到GPIO21,连接器引脚40。然后,GetHeaterState代码被修改为使用Raspberry#IO库中的HC-SR04距离探测器。
以下是使用HC-SR04距离探测器的C#代码示例:
///
///
///
/// gets the state of the heater
///
///
///
///
/// heater state
///
[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("{0:0.0}cm".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);
}
IoT.Home.Thing现在配备了强大的软件。