小米智能家庭接入亚马逊Echo

效果:效果视频

本文讲述到的器材:Echo Dot(当然也可以接入其他设备),极路由1S(已经开启极客模式,理论上只要能进入ssh的路由器都可以),小米网关,温湿度传感器

此文的方法是DIY一个测试版Skill,会将设备直接暴露在公网上,安全性很差,而且账户认证什么的都是写死的,只适合自己玩,而且外网接口千万不要外泄。

原文地址:http://blog.csdn.net/luhanglei/article/details/60140972

1.首先,把小米网关的“开发者模式”打开(小米网关页面→更多(三个点)→关于→狂点插件版本号),到这里网关就可以被发现且局域网控制了。

2.然后下载绿米官方的通信文档:点击这里下载通信文档

发现设备,把以下java代码放进eclipse里跑就可以看见局域网内的网关信息

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class Discover {public static void main(String[] args) throws IOException, InterruptedException {// TODO 自动生成的方法存根InetAddress ia = InetAddress.getByName("224.0.0.50");final MulticastSocket clientSocket = new MulticastSocket();clientSocket.joinGroup(ia);new Thread() {@Overridepublic void run() {try {listen(clientSocket);} catch (IOException e) {e.printStackTrace();}}}.start();StringBuffer sb = new StringBuffer();sb.append("{\"cmd\":\"whois\"}");DatagramPacket sendPacket = new DatagramPacket(sb.toString().getBytes(), sb.toString().length(), ia, 4321);// 1982clientSocket.send(sendPacket);}static void listen(DatagramSocket clientSocket) throws IOException {byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);clientSocket.receive(receivePacket);String response = new String(receivePacket.getData());System.out.println(response);System.exit(0);}}


应答信息里有网关的IP和端口号

发送单播信息获取设备列表,同样是java代码放进去跑,需要把其中的ip和端口号换掉,也就是把“IPIPIP”和“PORT”替换掉

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class Gateway {public static void main(String[] args) throws IOException, InterruptedException {// TODO 自动生成的方法存根InetAddress ia = InetAddress.getByName("IPIPIP");// final MulticastSocket clientSocket = new MulticastSocket();final DatagramSocket clientSocket = new DatagramSocket();// clientSocket.joinGroup(ia);new Thread() {@Overridepublic void run() {try {listen(clientSocket);} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}}.start();StringBuffer sb = new StringBuffer();sb.append("{\"cmd\":\"get_id_list\"}");DatagramPacket sendPacket = new DatagramPacket(sb.toString().getBytes(), sb.toString().length(), ia, PORT);clientSocket.send(sendPacket);}static void listen(DatagramSocket clientSocket) throws IOException {byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);clientSocket.receive(receivePacket);String response = new String(receivePacket.getData());System.out.println(response);System.exit(0);}}


代码执行以后,会收到如图回复


data中有网关下所有设备的信息,通过把"{\"cmd\":\"get_id_list\"}"命令修改为"{\"cmd\":\"read\",\"sid\":\"设备的ID\"}"可以看到设备的信息,从而可以判断出设备是什么。因为此文主要通过温湿度传感器进行示例,我将继续以温湿度传感器为例子进行描述。

通过文档可以看到开发者模式的通信方式是在局域网内进行UDP通信。而亚马逊的echo dot必须要通过云服务去控制设备,并不支持在局域网内进行操作。因此我们要做的就是让网关可以在公网被访问到。把tcp进行内网穿透的软件很多,比如ngrok、frp、花生壳(内网版)等,但udp的内网穿透却不像tcp那么成熟,即便支持,也不是很稳定。我尝试过用frp进行udp内网穿透,刚运行的时候反应迅速,但过了一夜之后就失联了。由于对路由器的系统不是很了解,一直以为我的路由器在不刷机的情况下不能自由的运行程序,因为缩水版linux安装运行环境也很麻烦,没怎么尝试过。直到看到frp直接下载就能运行以后,才知道原来可以通过go语言编译成mips32le版本在极路由之类的路由器上直接运行。

于是赶紧学了一点go语言,实现了一个在路由器某个端口监听TCP,将消息通过UDP转发给网关的程序。最后工作流程如下:

Amazon Lambda →TCP→路由器内网穿透软件→我写的tcp2udp→网关,打通了一条相对稳定的通路。

我把编译后的程序传在了CSDN下载中:tcp2udp(仅限mips32le芯片的路由器,其他的如果需要可以在评论里留下平台我再编译)

首先,我在内网穿透服务新建一个到我路由器12143端口的通道。如果使用ngrok,配置如下,其他类似(最后的55555为服务提供者提供的端口号,如果自己搭的服务器,相信你知道什么意思):

tcp,127.0.0.1,12143,55555

配置完成之后,相当于服务器的55555端口和路由器的12143端口打通了。下面要做的,就是用tcp2udp把路由器的12143端口监听器来,如果有消息来,发给网关。

把文件放到存储卡里,比如我放到了存储卡里的tcp2udp文件夹下,那我就需要在路由器的shell里CD到这个文件夹,然后执行它。


打开程序所在文件夹(文件夹名字是tcp2udp,里面还有tcp2udp的程序,只是个名字,任意起)

cd /tmp/storage/mmcblk0/tcp2udp

执行(-p是端口号,-t是网关的ip和端口号,最后的&符号是添加进队列在后台运行,不至于关掉ssh后就被干掉)

./tcp2udp -p 12143 -t 192.168.199.162:9898 &
出现像上图中的样子,就是执行成功了。这时候把第二段java代码中的ip和端口号换成内网穿透服务器的地址和端口号,则也能工作。

最后一步,接入echo dot,创建skill的步骤在前两篇关于echo开发的博文中说过,这次类似。

Lambda的创建在下文中有,但触发器要用custom skill,因为smart home对于获取温湿度的接口并不支持:

点击打开链接

创建custom skill的过程下文中有介绍,自己用,则不需要使用账户,可以选不用账户

点击打开链接

我在lamda中的代码如下,已经实现了获取温度和湿度

import socket
import json
def lambda_handler(event, context):# TODO implementslots = event['request']['intent']['slots']isTemperature = 0isHumidity = 0if slots['firstval']['value']=="temperature" :isTemperature = 1elif slots['firstval']['value']=="humidity":isHumidity = 1if slots['secondval'].has_key("value"):if slots['secondval']['value']=="temperature" :isTemperature = 1elif slots['secondval']['value']=="humidity":isHumidity = 1address = ('内网穿透服务器地址', 内网穿透服务器端口)  s = socket.socket() s.connect(address)  s.send('{"cmd":"read","sid":"温湿度传感器ID"}')data= s.recv(1024) d = json.loads(json.loads(data)['data'])print dtemperature = float(d['temperature'])/100humidity = float(d['humidity'])/100res = {}res['version'] = "1.0"speechText = ""if (isTemperature==1) and (isHumidity==1):speechText = "The temperature is "+str(temperature)+" degree, and the humidity is "+str(humidity)+" percent."elif isTemperature==1:speechText = "The temperature is "+str(temperature)+" degree."else:speechText = "The humidity is "+str(humidity)+" percent."outputSpeech = {}outputSpeech['type'] = "PlainText"outputSpeech['text'] = speechTextcard = {}card['type'] = "Simple"card['title'] = "Smart Home"card['content'] = speechTextresp = {}resp['outputSpeech'] = outputSpeechresp['card'] = cardres['response'] = respreturn res


原文地址:http://blog.csdn.net/luhanglei/article/details/60140972


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41536.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

除了绿米它也能连接homekit,智汀到底有什么本领?

智能家居这个词近几年非常地火热,越来越多地智能家居出现在我们的视野当中。 当然我们可能还没有生活在“智能家居”的世界中,但是我们正在实现这一目标。 消费者开始为家中配备连接的灯,锁,警报器,摄像机&#xff0…

树莓派 + Home Assistant + HomeKit 从零开始打造个人智能家居系统 篇二:初步配置 Home Assistant 并连接小米设备与 HomeKit

树莓派 Home Assistant HomeKit 从零开始打造个人智能家居系统 篇二:初步配置 Home Assistant 并连接小米设备与 HomeKit 通过本篇教程,你将完成对 Home Assistant 的初步配置,接入小米智能家居设备,并在安装配置 Home Bridge …

智汀如何让绿米Aqara无线开关一键联动不同品牌的智能设备?以智汀窗帘电机、星辰智能台灯为例

上期跟大家说过智汀可以不通过Home Assistant系统就可以接入不同品牌的智能家居设备,那究竟 是如何接入的呢?今天小编就手把手教学: 要注意,一定要先在智汀家庭云APP里安装好智慧中心(SA)。 打开APP 场景…

一站式、整套智能家居解决方案——HomeKit?绿米?华为还是智汀?

越来越多的智能家居消费者希望能够获取一站式、一整套智能家居解决方案。有需求就有市场,现在一般的大厂大品牌都有全套的智能家居解决方案,比如HomeKit、绿米、华为和智汀等。 先给大家说一下如何基于苹果的HomeKit生态系统去搭建全屋智能——首先是Ye…

炎炎夏日教你利用小米智能家居配件+树莓派4接入Apple HomeKit

前言 Apple HomeKit智能家居方案,是苹果2016年在WWDC大会上提出来的,至今已经6个年头。在国内一直是不温不火的状态,除了有小米智能家居的米家方案等一大堆国内厂商跟进外,苹果特有的“贵”也是其阻碍因素之一,一个智…

绿米Aqara、智汀、Homekit等设备如何完成一键跨品牌联动

前言 一直以来只要提到智能家居,很多人的认知就是能使家中原有的家电变为智能化。本文将带大家来了解绿米Aqara、智汀、Homekit等设备如何完成一键跨品牌联动? 在操作之前,我们先来回顾下米家设备:Aqara作为唯一个能够连接HomeK…

如何将homekit接入安卓设备,homeassistant和智汀来帮忙

随着科技的发展,智能家居也开始慢慢火了起来,被越来越多的人所熟知。 在接触到智能家居的时候,大家或许都有一种我也弄来试试的冲动,所以会不会遇到以下的一些问题。 大家是不是常常有这些烦恼:家里装修买了智能设备…

绿米、易来和Yeelight设备之间的互相联动离不开智汀

不知道作为智能家居用户的你有没有这种经历:新买回来的智能设备,除了刚拿到它那天好奇耍了一会,后面再也没有用过,买的时候有多高兴,买回来就有多痛苦,特别是我们多少都有点消费冲动的hhh。 其实很多朋友不…

绿米Aqara智能设备还能这样玩?

大家好,今天给大家介绍的是绿米Aqara旗下的产品,我们都知道Aqara目前已经接入了小爱同学、天猫精灵、Apple Homekit等知名生态,因此可以实现多种生态的语音控制。但是通过我们后面测试发现目前只有小爱同学可以实现全局的控制,而天…

米家接入HomeKit系列一:接入基本原理与开篇

系列文章 米家接入HomeKit系列一:接入基本原理与开篇 米家接入HomeKit系列二:通过群辉NAS的Docker搭建HomeAssistant 米家接入HomeKit系列三:HomeAssistant接入米家网关 米家接入HomeKit系列四:HomeBridge搭建、配置与接入米家…

loT行业生死竞速:Aqara绿米得用户得天下

作者 | 曾响铃 文 | 响铃说 日前,社科院发布了一份“2022年秋季中国宏观经济形势分析”报告,报告中指出当前,世界经济增长预期下挫,全球通胀居高不下,而中国经济整体仍呈持续恢复状态,但经济内增长动能仍…

不用Home Assistant让小米智能家居接入HomeKit

这种方法不难,但支持的设备比较少,如果家里小米智能家居设备较多,又没有绿米网关的话,就还是算了吧。 方法是通过开源平台智汀的 Smart Assistant 装在 X86 主机或者群晖之类的设备上,然后加入 HomeKit 的插件包&#…

把对讲门铃(控制底楼铁门)接入米家服务器

今天讲个跟SDR或者无人机无关的东西,技术含量不高,但是方便了我的生活。 现在家门有智能锁,汽车也可以远程解锁发动,NFC门禁也可以用某些手机复制,唯独楼下的铁门,必须用老式对讲门铃控制。 也就是说其它钥…

除了绿米它也能接入homekit?这四款传感器带你玩转智能家居

随着科技发展,智能家居让你有意想不到的家居体验。当中让智能家居达到最个人化,最贴合每个人的生活所需,就是一个能控制所家电的生态系统App了。 仅用通过一个App让家自由调配各种适合自己的“场景模式”,一键便可做到多个智能设备…

不用Home Assistant,智汀也开源接入HomeKit、绿米设备?

相信智能家居用户无人不知Home Assistant,Home Assistant是一个构建智慧空间的神器,是一个成熟完整的基于 Python 的智能家居系统,设备支持度高,支持自动化(Automation)、群组化(Group)、UI 客制…

用安卓手机控制 HomeKit 智能设备?绿米Aqara设备接入智汀家庭云保姆级教程

今天跟大家讲一下 HomeKit 系统的使用。众所周知,苹果智能设备本身就是支持接入 HomeKit 的,也就是说用户可以通过苹果手机里面的家庭将设备接入,然后进行操作控制。 但用过的朋友应该知道,这样的操作有明显的局限性,…

交互式视频风格化 水记

交互式视频风格化 水记 《Interactive Video Stylization Using Few-Shot Patch-Based Training》 项目主页: Interactive Video Stylization https://github.com/OndrejTexler/Few-Shot-Patch-Based-Training https://github.com/OndrejTexler/Few-Shot-Patch…

如何用树莓派做一个家庭语音助手/智能音箱

一、前言 这学期闲来无事,于是搞了个简单的家庭语音助手,其主要实现的功能有: 语音唤醒;控制家电;询问时间和日期;询问天气情况;查询垃圾分类;播报新闻;微信小程序远程…

英伟达 gsync demo NVIDIA 钟摆测试

英伟达 gsync demo NVIDIA 钟摆测试 不知道为什么网上没有共享资源的帖子 共享一下网址 顺带记录作用 https://www.nvidia.com/coolstuff/demos#!/ 进去就第一个就是钟摆测试,还有好多英伟达的其他demo 觉得方便的可以点赞支持一下

英伟达RTX 4070最新测评来了!光追效果更棒,但仅限于2k游戏

萧箫 发自 凹非寺量子位 | 公众号 QbitAI 英伟达RTX 4070开卖,4799元的价格也是让不少人心动。 由于之前矿难一波,英伟达30系显卡失去了不少人的信任,大伙儿的目光也都放在了40系显卡上。 现在4070性价比卡终于姗姗来迟,它实际性能…