首页 > 编程语言 >他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk【Homekit.Net】1.0.0发布,快来打造你的私人智能家居吧

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

时间:2024-04-19 09:23:43浏览次数:24  
标签:1.0 定义 智能家居 开关 配件 new var HomeKit

背景介绍

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,关注)

标签:1.0,定义,智能家居,开关,配件,new,var,HomeKit
From: https://www.cnblogs.com/hezp/p/18142099

相关文章

  • step by step系列之:openGauss1.0.1单机安装指南v1.2
    StepbyStep之:openGauss1.0.1单机安装指南v1.2在CentOS7.6上安装openGauss单机版配置操作系统满足安装要求硬件环境:虚拟机的内存8GB,4核心CPU,900G磁盘(非必须)软件环境:CentOS7.6关闭防火墙停止firewallsystemctlstopfirewalld.service禁止firewall开机启动......
  • kylin V10 SP3将openssl降级到1.0.2u
    前言kylinV10SP3的openssl版本较高OpenSSH_9.5p1,OpenSSL1.1.1f 31Mar2020,程序编译环境必须是OpenSSL1.0.2,故需要降级,记录一下。下载安装包下载openssl1.0.2u安装#解压tarzxvfopenssl-1.0.2u.tar.gz#安装cdopenssl-1.0.2u./config--prefix=/usr/local/sslmak......
  • ATM 1.0
    Author:Zenodate:2024/4/13time:9:42Author:Zenodate:2024/4/13time:8:00注册:存储到文件中用户名-登录密码-年龄-银行卡号(1314)-取款密码-余额(1000)登录:直接将用户信息从文件中取出,然后进行比对用户名-密码取款:验证你的取款密码,更改余额余额(1......
  • java: 无法访问org.mybatis.spring.annotation.MapperScan、类文件具有错误的版本 61.
    使用的Mybatis-spring依赖的版本3.0.1太高,将版本改为2.2.2<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><depende......
  • 1.0 多层感知机&BP传播 小记
    1.感知机与线性模型单层感知机的表达式和线性分类表达式等同,可以将一个单层感知机看作是一个线性分类器。单层感知机可以解决与、或、非的分类问题,但是不能解决异或分类(非线性)问题。howtosolvetheproblem:多个线性分类器解决线性不可分问题,即:多个单层感知机组合叠加解......
  • UJCMS 9.1.0 发布,国内开源 java cms
    许可协议从GPL-2改为Apache-2.0,更宽松的协议,方便用户将系统集成到自身的应用中。修复了已知bug,系统更加稳定。升级日志(9.1.0)修复前台全文搜索没有结果web.xmlsession过期时间从30分钟改成25分钟,部分漏洞扫描软件会将session过期时间大于等于30分钟判定为漏洞修复文章管理一......
  • Adobe Reader XI 11.0.23 简体中文版
    下载地址:AdobeReaderXI11.0.00简体中文版http://ardownload.adobe.com/pub/adobe/reader/win/11.x/11.0.00/zh_CN/AdbeRdr11000_zh_CN.exeAdobeReaderXI11.0.23补丁http://ardownload.adobe.com/pub/adobe/reader/win/11.x/11.0.23/misc/AdbeRdrUpd11023.msp注意:先请安......
  • openGauss1.1.0主备部署
    openGauss1.1.0主备部署openGauss1.1.0版本介绍:openGauss1.1.0定位为Update版本,与原来的1.0.1版本特性功能保持兼容。主要提供如下功能:继承功能:SQL标准语法、UPSERT、数据类型、XML类型、表、临时表、全局临时表、外部表、视图、物化视图、索引、外键、Gin索引、......
  • openGauss1.1.0主备集群节点的添加和删除
    openGauss1.1.0主备集群节点的添加和删除在上一篇文章《openGauss1.1.0主备部署(1主+2备+1级联备)》中,我们已经搭建了常见于生产环境的数据库架构(1主2备1级联备),如下图所示:本文将基于已搭建的主备环境进行集群节点的删除和添加操作,希望相关操作内容对大家有所帮助。......
  • 基于STM32的智能家居系统设计与实现:手机APP与语音控制家电
    基于STM32的智能家居系统设计与实现:手机APP与语音控制家电一、研究背景与意义随着科技的进步和人们生活水平的提高,智能家居系统逐渐成为现代家庭的新宠。智能家居系统通过集成各种智能设备和传感器,为用户提供更加便捷、舒适和安全的家居环境。本研究旨在设计一个基于STM32微......