背景介绍

hi 大家好,我是三合,作为一个非著名懒人,每天上完班回到家,瘫在沙发上一动都不想动,去开个灯我都嫌累,此时,智能家居拯救了我,只需要在手机点点点,开关灯,空调,窗帘就都搞定了,一开始我用的是开源的home assistan,俗称HA,搭配上hass-xiaomi-miot以及hap-python这几个插件,就可以将米家的智能家居设备接入苹果的homekit生态,整体而言在苹果手机上使用体验非常好,但是有一个致命的问题,每隔一段时间,米家的设备在homekit上就会失效,需要我重置,为此没少被老婆埋怨这智能家居怎么这么难用,然后ha又是python写的,说句实话,我不太喜欢这种动态语言,各种奇怪用法,看得我云里雾里,更谈不上调试了,此时我就在想,如果我用c#写homeKit和米家的sdk,自己搞一个智能家居,岂不美哉,毕竟有了原生api,那就有了无限可能。有了这个奇怪的想法后,我首先上github上搜索了c#的智能家居sdk,发现c#在智能家居这个领域,几乎一片空白,更谈不上原生的sdk了,基本都是python的项目,即使有一些c#的,也需要搭配ha或者HAP-NodeJS使用, 没办法,我只能参考hass-xiaomi-miot这个项目移植了米家的sdk并命名为【MiHome.Net】,以及参考hap-python这个项目移植了苹果homekit的sdk并命名为【Homekit.Net】,MiHome.Net还在为开源前作最后的代码修改,今天发布的,正是苹果homekit的sdk【Homekit.Net】,接下来,我将介绍他的用法。

HomeKit中的一些基本概念

HomeKit中每一个智能家居称为一个配件(Accessory),每个配件拥有多个服务(Services),每个服务又有多个特征(characteristics),所有配件都有配件信息服务,这个服务里包含了2个特性,1名字,2固件版本号,并且配件根据功能还有另外一些独有的服务,我们以一个开关为例,开关本身就是一个配件,配件种类是switch,他就拥有一个服务叫Switch,这个服务下面,有一个特性叫on,也就是开关,我们给这个特性赋值true,就代表开,赋值false,就代表关。

Homekit.Net存在的意义

通过本依赖包,用户可以通过代码模拟出各种各样的智能家居设备,并添加到苹果手机的家庭app中,这样我们就能在手机上控制这些模拟的智能家居设备执行一些我们在代码里配置好的操作,比如我们可以通过代码控制电脑打开或者关闭某个应用,然后利用本库封装为一个开关,那么我们就可以用家庭app中的这个模拟开关来控制应用了。有了原生api,大家就可以尽情的发挥想象力去搞事情了,比如DIY一个自动喂鱼机?

Getting Started

Nuget

接下来我将演示如何使用【Homekit.Net】,你可以运行以下命令在你的项目中安装 Homekit.Net 。

PM> Install-Package Homekit.Net

支持框架

net 6,net 8

示例

通过继承类Accessory,我们就可以自定义一个自己的配件,在下面的示例中,我们定义一个开关,在构造函数中,我们加载一个名为Switch的服务,并且定义配件类型为开关,从switch服务中获取on这个特性,通过操作on这个特性,我们就可以通过代码模拟开关状态变化了,并且可以在苹果手机的家庭app上看到开关状态的变化。

public class Switch : Accessory
{
private bool IsOn;
private Timer timer;
public Characteristics CurrentOnCharacteristics { get; set; } public event Action<object> OnChange;
public Switch(AccessoryDriver accessoryDriver, string name, int? aid = null) : base(accessoryDriver, name, aid)
{
//加载switch开关服务
var service = AddPreloadService("Switch");
//定义配件种类为开关
Category = Category.CATEGORY_SWITCH;
//从switch服务中获取on这个特性
CurrentOnCharacteristics = service.GetCharacteristics("On");
//添加开关状态被家庭app改变后的回调函数
CurrentOnCharacteristics.SetValueCallback = (o =>
{
OnChange(o);
this.IsOn = (bool)o ;
});
//定义一个定时器,定时改变开关状态,用来模拟开关状态变化
//timer = new Timer(Test, default, TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30));
} public void Test(object? state)
{
var random = new Random();
var number = random.Next(1, 50);
var isOn = number % 2 == 0;
CurrentOnCharacteristics.SetValue(isOn);
timer.Change(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30));
}
}

接下来,我们再来一个示例,定义一个温度传感器,在构造函数中,我们加载一个名为TemperatureSensor的服务,并且定义配件类型为传感器,从TemperatureSensor服务中获取CurrentTemperature(当前温度)这个特性,通过代码操作CurrentTemperature这个特性,我们就可以模拟温度变化,并且在苹果手机的家庭app上看到温度变化了。

public class TemperatureSensor : Accessory
{ public Characteristics CurrentTemperatureCharacteristics { get; set; } private Timer timer;
public TemperatureSensor(AccessoryDriver accessoryDriver, string name, CancellationToken token = default) : base(accessoryDriver, name)
{
//加载TemperatureSensor温度服务
var service = AddPreloadService("TemperatureSensor");
//定义配件种类为传感器
Category = Category.CATEGORY_SENSOR;
//从TemperatureSensor服务中获取CurrentTemperature(当前温度)这个特性
CurrentTemperatureCharacteristics = service.GetCharacteristics("CurrentTemperature");
//设置温度为1
CurrentTemperatureCharacteristics.SetValue(1);
//定义一个定时器,定时改变温度,用来模拟温度变化
timer = new Timer(Test, token, TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30)); } public void Test(object? state)
{
if (state is CancellationToken token && token.IsCancellationRequested)
{
return;
}
// Console.WriteLine(DateTime.Now+"触发了定时任务");
var random = new Random();
var wd = random.Next(1, 50);
// Console.WriteLine($"设置温度为{wd}度");
CurrentTemperatureCharacteristics.SetValue(wd);
timer.Change(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30));
}
}

更多的配件类型,欢迎大家自行解锁,配件的所有服务和特征汇总,可以在程序运行起来后,查看Resources文件夹下的json文件

配件定义结束以后,我们就要让这个配件跑起来了,新建一个控制台程序,代码如下:

 internal class Program
{
private async static Task SingleAccessory()
{ var cts = new CancellationTokenSource();
//先定义驱动
var driver = new AccessoryDriver(port: 6555);
//定义配件
var switchAccessory1 = new Switch(driver, "switch开关");
//添加开关状态被苹果手机的家庭app改变后的回调
switchAccessory1.OnChange += async (o) =>
{
Console.WriteLine("The switch state has changed.开关状态变化了");
}; driver.AddAccessory(switchAccessory1);
await driver.StartAsync(cts.Token);
} private async static Task MultipleAccessories()
{ var cts = new CancellationTokenSource();
//先定义驱动
var driver = new AccessoryDriver(port: 6554);
//定义网关
var bridge = new Bridge(driver, "网关");
//定义配件1开关
var switchAccessory1 = new Switch(driver, "开关switch");
bridge.AddAccessory(switchAccessory1);
//添加开关状态被苹果手机的家庭app改变后的回调
switchAccessory1.OnChange += async (o) =>
{
Console.WriteLine("The switch state has changed.开关状态变化了");
};
//定义配件2传感器
var temperatureSensor= new TemperatureSensor(driver, "传感器TemperatureSensor");
bridge.AddAccessory(temperatureSensor);
driver.AddAccessory(bridge);
await driver.StartAsync(cts.Token);
} async static Task Main(string[] args)
{
//Test Multiple Accessories 测试单配件
await SingleAccessory();
//Test Multiple Accessories 测试多配件
//await MultipleAccessories(); }
}

以上这段代码分为2个部分,SingleAccessory单配件示例,和MultipleAccessories多配件示例,大体流程就是首先定义一个驱动,接着实例化之前定义的配件,并且把配件加入到驱动中,最后启动驱动即可。启动后效果如下图,他会在控制台上打印出一个二维码,

接着我们使用苹果手机的家庭app扫描这个二维码,即可添加我们代码中自定义的配件。

如果我们想在程序中定义多个配件,那么参考MultipleAccessories方法,首先得定义一个网关,接着把我们定义的多个配件添加到网关里,最后再启动驱动。

开源地址,欢迎star

本项目基于MIT协议开源,地址为

https://github.com/TripleView/HomeKit.Net

同时感谢以下项目

  1. HAP-Python

  2. ZeroConfig

写在最后

如果各位靓仔觉得这个项目不错,欢迎一键三连(推荐,star,关注)

他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk【Homekit.Net】1.0.0发布,快来打造你的私人智能家居吧的更多相关文章

  1. DS Scheduler 0.7 发布,Linux 调度系统 - 开源中国社区

    DS Scheduler 0.7 发布,Linux 调度系统 - 开源中国社区 DS Scheduler 0.7 发布,Linux 调度系统

  2. PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区

    PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区 PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具

  3. Rudiments 0.42 发布,C++ 常用工具包 - 开源中国社区

    Rudiments 0.42 发布,C++ 常用工具包 - 开源中国社区 Rudiments 0.42 发布,C++ 常用工具包

  4. Pyocr 0.2 发布,Python 的 OCR 库 - 开源中国社区

    Pyocr 0.2 发布,Python 的 OCR 库 - 开源中国社区 Pyocr 0.2 发布,Python 的 OCR 库

  5. 这年头做开源项目,被冷嘲热讽,FreeSql 0.0.4

    FreeSql 项目大概在20天前想着要做的,今天发布0.0.4在群里被一位大神讽刺. 这位无名氏哥们的观点,先声明这不是找安慰的文章,更加不是报复打击的目的. 1 所以这个比EF好在哪里 2 毕竟E ...

  6. LitepalNewDemo【开源数据库ORM框架-LitePal2.0.0版本的使用】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo使用的是LitePal2.0.0版本,对于旧项目如何升级到2.0.0版本,请阅读<赶快使用LitePal 2.0版本 ...

  7. 开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))

    开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))   Flex,Fms3系列文章导航 Flex,Fms3相关文章索引 本篇是视频聊天,会议开发实 ...

  8. 五年磨一剑:Java 开源博客 Solo 1.0.0 发布了!

    从 Solo 第一个版本发布至今,已经过去 5 年了.今天我们非常自豪地宣布,Solo 1.0.0 正式发布,感谢一直以来关注 B3log 开源的朋友! 目前 B3log 开源有三款产品: GitHu ...

  9. .NET Core下的开源分布式任务调度系统ScheduleMaster-v2.0低调发布

    从1月份首次公开介绍这个项目到现在也快4个月了,期间做了一些修修补补整体没什么大的改动.2.0算是发布之后第一个大的版本更新,带来了许多新功能新特性,也修复了一些已知的bug,在此感谢在博客.Issu ...

  10. itest(爱测试) 开源一站式敏捷测试管理平台&极简项目管理,重大升级(接口测试)6.0.0 发布

    itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...

随机推荐

  1. MDC实现微服务链路追踪

    一.问题背景 在微服务架构中,我们没办法快速定位用户在一次请求中对应的所有日志,在排查生产问题的时候会非常困难,那是因为我们在输出的日志的时候没把请求的唯一标示输出到我们的日志中,导致我们没办法根据一 ...

  2. idea editor tabs 标题头 多行显示,全部显示出来 (vscode也放一个)

  3. 摆脱鼠标系列 - 浏览器操作 - Vimium C 插件 f 显示链接字母 jk上下移动

    为什么 摆脱鼠标系列 - 浏览器操作 - Vimium C 插件 f 显示链接字母 jk上下移动 百度搜索资料的时候,争取少用鼠标 关闭当前页签 x 左边页签 J 右边页签 K 搜索 /关键字回车 n

  4. Dyno File Utils - VSCode Extension 新建目录 新建文件 很好用

    Dyno File Utils - VSCode Extension 新建目录 新建文件 很好用 快捷键 绑定了 ctrl + n

  5. 基于stm32的spi接口dma 数据收发实例解析

    一 前记 SPI接口平时用的比较少,再加上对CUBEMX不是很熟悉,这里踩了不少坑才把问题解决.针对遇到了不少问题,是要值得梳理一下了. 二 源码解析 1 SPI的DMA发送端配置: 2 主函数源码: ...

  6. 用python进行二进制bin文件合并

    一 基本概念 bin文件合并是嵌入式中常用的,这里给一个实例. 二  实例分析 import os import argparse import hashlib offset1 = 0x0010000 ...

  7. 性能优化:编译器优化选项 -O2/-O3 究竟有多强大?

    之前的"性能优化的一般策略及方法"一文中介绍了多种性能优化的方法.根据以往的项目经验,开启编译器优化选项可能是立竿见影.成本最低.效果最好的方式了. 这么说可能还不够直观,举个真实 ...

  8. 《TencentNCNN系列》 之工作原理简要解析(以LeNet-5为例)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  9. [Atcoder - Distinct Trio ] 动态规划

    记f[i][j] 为前i个元素能构成的j个不同元素对的个数.对于题目j<=3;这样就有转移方程. import java.io.BufferedReader; import java.io.IO ...

  10. 记录--vue3问题:如何实现微信扫码授权登录?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.需求 微信扫码授权,如果允许授权,则登录成功,跳转到首页. 二.问题 1.微信扫码授权有几种实现方式? 2.说一下这几种实现方式的原理 ...