从某种程度上来说,我是一个懒人,智能音箱在很大程度上满足了本人“懒”的需求。无奈的事,依旧有很多电器无法接入智能音箱的生态,比如服务器。

关于服务器的远程开关,尝试了很多方案,演化大致如下:从开始的WOL,到后来的ipmi,以及本文的homebridge方案。

严格来说,homebridge是一个转接平台,能作为一个主控让无法直接支持homekit的设备接入apple的生态,大致如下图。+--------+ +------------+ +---------+

| iphone |-----| Homebridge |-----| Homekit |

+--------+ +------------+ +---------+

本文并不涉及homekit API以及IPMI协议细节的分析,只分享方案。

插件配置

homebridge对接server的方案需要依赖一个插件homebridge-http-switch,当然读者要是有时间,完全可以自己定制。这个插件主要功能就是将power up、power down、power status这3个行为转换为Http请求,无非就是把服务器当做一个开关,相关homebridge的配置如下:"accessories": [

{

"accessory": "HTTP-SWITCH",

"name": "服务器",

"switchType": "stateful",

"statusPattern": "{\"succuess\":true,\"data\":{\"status\":\"on\"}}",

"onUrl": "http://10.0.0.3:65123/v1/power/up",

"offUrl": "http://10.0.0.3:65123/v1/power/soft",

"statusUrl": "http://10.0.0.3:65123/v1/power/status"

}

]

如果你想要用siri进行控制,那么建议你把name设置为中文,否则siri的智障会让你崩溃。statusPattern主要就是用来判断status API返回的结果是否表示on这个状态。

ipmi API服务

读到这里,大家应该已经能够猜到还需要一个API服务控制服务器的开关,具体的思路是将请求转换为ipmi命令。关于API服务,我是用gin开发的,为了节省不必要的时间开销,直接使用了vmware的ipmitool封装——goipmi,这个没有文档,大概看下代码就行了,附上我使用的,大致如下:func doPowerStatus() *IpmiResult {

cl, err := ipmi.NewClient(&conn)

if err != nil {

return newIpmiResult(err)

}

defer cl.Close()

res := &ipmi.ChassisStatusResponse{}

req := &ipmi.Request{

NetworkFunction: ipmi.NetworkFunctionChassis,

Command: ipmi.CommandChassisStatus,

Data: &ipmi.ChassisStatusRequest{},

}

err = cl.Send(req, res)

if err != nil {

return newIpmiResult(err)

}

power := IpmiPowerStatus {}

if res.IsSystemPowerOn() {

power.Status = "on"

} else {

power.Status = "off"

}

return newIpmiResult(&power)

}

func doPowerOperator(op string) *IpmiResult {

cl, err := ipmi.NewClient(&conn)

if err != nil {

return newIpmiResult(err)

}

defer cl.Close()

var cmd ipmi.ChassisControl

switch op {

case "up":

cmd = ipmi.ControlPowerUp

case "down":

cmd = ipmi.ControlPowerDown

case "reset":

cmd = ipmi.ControlPowerHardReset

case "cycle":

cmd = ipmi.ControlPowerCycle

case "soft":

cmd = ipmi.ControlPowerAcpiSoft

}

res := &ipmi.ChassisControlResponse{}

req := &ipmi.Request{

NetworkFunction: ipmi.NetworkFunctionChassis,

Command: ipmi.CommandChassisControl,

Data: &ipmi.ChassisControlRequest{cmd},

}

err = cl.Send(req, res)

if err != nil {

return newIpmiResult(err)

}

if res.CompletionCode != ipmi.CommandCompleted {

return newIpmiResult(

errors.New(res.CompletionCode.Error()))

}

return newIpmiResult(nil)

}点击开启会调用命令ipmitool power up,等同于按了开机按钮;

点击关闭会调用命令ipmitool power soft,发送acpi down event,让os进入关机流程;

获取状态会调用命令ipmitool power status。

ipmitool的使用方法请参考manual。

总结

可以看到,添加设备并重启homebridge后,在home app里面会出现一个开关的图案,由于提供了power status请求,因此这个服务是无状态的,每次打开app的时候,均会产生请求获取服务器的电源状态。

接入homekit之后的另一个好处就是,可以使用siri或者homepod进行控制了,真的是懒人必备。目前,goipmi没有对于sensor命令的封装,暂时无法实现更加完善的监控功能,先不折腾了。

对于没有bmc的主板,先别沮丧,我也有方案:power up - 使用WOL,网卡通常是支持的

power down - 直接remote ssh shutdown

power status - ping或者arping

这套方案的最大缺陷是,开发板是单点,要是挂了,就会无法控制homebridge下挂载的设备。

Enjoy coding!

siri服务器位置,使用siri控制服务器开关的方案相关推荐

  1. 听“Siri之父”讲述Siri背后的故事

    听"Siri之父"讲述Siri背后的故事 Adam Cheyer是人工智能领域里的先驱,他生命中的绝大多数时间都奉献给了他所谓的"口头陈述目标",至今他依然为此 ...

  2. 网站位置服务器,如何查看网站的服务器位置

    如何查看网站的服务器位置 内容精选 换一换 华为云主机迁移服务帮助中心,为用户提供产品简介.快速入门.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用主机迁移服务. 用 ...

  3. Rhel7 Ldap为本地用户认证方式,设置域、服务器位置和下载key

    Rhel7 Ldap为本地用户认证方式,设置域.服务器位置和下载key yum -y install sssd authconfig-gtk krb5-workstation system-confi ...

  4. 错误:无法打开web项目”****“,文件路径“****”与url“**”不符。这两者要映射到相同的服务器位置。...

    问题出现的环境: 现在解决方案中有3个项目(2个类库,1个web),因为原来搭建项目的服务器要做别的用,所以要做个项目"迁移". 在现在的服务器上安装完开发环境,拷贝过来项目文件, ...

  5. 如何查询游戏的服务器位置,怎么查看游戏服务器位置

    怎么查看游戏服务器位置 内容精选 换一换 本章节介绍如何通过控制台查看云手机实例的详细信息.登录管理控制台.在管理控制台左上角,选择待查看云手机所在的区域.在服务列表页,选择"计算 > ...

  6. 班德尔服务器最新所在地,lol班德尔城服务器在哪-班德尔城服务器位置

    lol班德尔城服务器在哪?有很多玩家在游戏中对这个问题不太清楚.接下来就由香辣鸡腿堡给大家带来lol班德尔城服务器位置,感兴趣的小伙伴们一起来看看吧! lol班德尔城服务器地点 LOL中有很多服务器, ...

  7. 天刀各大服务器位置,天涯明月刀手游可以查看到好友所在区吗 好友服务器位置查看方法[多图]...

    天涯明月刀手游其实是可以查看到好友所在服务器的哦,这个方法有很多玩家不知道哦,今天就来分享给大家详细技巧吧,希望对各位有所帮助哦~快来看看咯! 天涯明月刀手游好友服务器位置查看方法 天涯明月刀手游查看 ...

  8. 华硕服务器第三届“IT硬件平台搭建大赛”获奖方案

    华硕服务器第三届"IT硬件平台搭建大赛" 奖项            编号          方案名称  一等奖 1号方案 绿色奥运综合信息服务平台 最佳节能设计奖 2号方案 绿色 ...

  9. mysql io 100_MySQL服务器 IO 100%的分析与优化方案

    压力测试过程中,如果因为资源使用瓶颈等问题引发最直接性能问题是业务交易响应时间偏大,TPS逐渐降低等.而问题定位分析通常情况下,最优先排查的是监控服务器资源利用率,例如先用TOP 或者nmon等查看C ...

最新文章

  1. 可以由指令直接指定的I/O端口数(一共256个,从0到255一共256个端口号)
  2. 请简单叙述微型计算机的诞生,2012湖南省计算机等级考试试题 二级C试题考资料...
  3. java面向对象结课总结_java面向对象课程总结
  4. 【数据结构与算法】双链表V3.0的Java实现
  5. 要成为一个 Java 架构师得学习哪些知识?
  6. 关于配置两台无线路由器
  7. 关于Silverlight安装问题之四
  8. c#类的方法表的建立和方法的调用
  9. 行业揭秘:A股日内“T+0” 赚钱的方法
  10. Tomcat热部署三种方式的详细说明
  11. 火狐浏览器 android版,火狐浏览器手机版
  12. 6.3 探索性空间数据分析
  13. 基于变量推理的知识图路径推理分析
  14. 万年历我java输出实现_用java实现简单的万年历输出的代码
  15. 喜报丨内蒙古谱尼医学获批开展临床基因扩增检验技术
  16. 云服务器的实用功能——弹性伸缩
  17. powerbi输入数据_PowerBI数据编辑与管理
  18. Vue仿Bibibili首页
  19. 360安全卫士,还有这么多,小兄弟?
  20. Java使用poi和jfreechart生成excel图表图片

热门文章

  1. Vue3+nodejs全栈项目(资金管理系统)——后端篇(一)登录、注册
  2. 电脑黑屏无信号,接着主机风扇嗡嗡转不停,解决方案
  3. 函数的递归调用举例之汉诺塔问题模型
  4. OpenWrt make menuconfig 构建过程
  5. 鸟哥的linux私房菜 lvm,linux鸟哥的私房菜学习笔记之LVM学习
  6. 【UnityGamePlay】Unity中的时间
  7. javascript 事件机制,同步异步
  8. 徘徊在大数据时代门外
  9. mysql 组复制详解,MySQL组复制:魔力解释v2
  10. C语言 编辑题:平均数计算器