『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 10755|回复: 10

[基础教程] 小爱Play 开用ESP8266开SSH通过notered接入hass折腾记录

[复制链接]

35

主题

153

帖子

1078

积分

金牌会员

Rank: 6Rank: 6

积分
1078
金钱
925
HASS币
10
发表于 2019-12-29 15:54:20 | 显示全部楼层 |阅读模式

1,小爱Play 有tx,rx,gnd,5v的大焊盘。可以方便焊接
2,小爱Play计算MD5后的密码用的guid和普通的不一样。这里感谢提供那一串GUID的大神wqh227,再次提供了一个小爱Play可以用的GUID:
      A20EDC68-62E5-70C6-76E8-75879721B8EC 方法和之前一样。md5(sn+guid) 取前14位 md5计算可以去:https://md5jiami.51240.com/
3,esp固件是群中大佬罗桂文提供的。并且可以接入mqtt。还能简单的通过ttl执行一些命令,也可参考 https://bbs.hassbian.com/forum.php?mod=viewthread&tid=8903
4,小爱Play所用的mico.sh需要修改一下。参考帖子 https://bbs.hassbian.com/thread-7878-1-1.html  否则会报错
5,新版notered接入地址有所改变。需要把http://192.168.3.2:1880/miai 添加一个endpoint的路径。改成 http://192.168.3.2:1880/endpoint/miai。折腾了好久才发现的这个问题。

基本教程参考如下文章:
1,抄下小爱play的sn 并且加上GUID后去网站计算32位的md5,取前14位(小写)
2,烧录esp固件,当然用自己算出来的密码,定义好串口gpio
3,先用小爱的ttl口用usb转ttl 和电脑连接。第一是验证密码是否正确。第二是生成一个ssh的key文件。命令行 dropbearkey -t rsa -f /data/dropbear_rsa_host_key  ,顺便在用dropbear -r /data/dropbear_rsa_host_key开启ssh后测试连接一下是否正常。ssh的密码也是和ttl同样的
4,安装拦截脚本。可以不用install.sh,直接下载mico.sh后修改参数和上面提到的notered地址,密码和修改的一处代码后放入/data/mico.sh。然后执行 chmod +x /data/mico.sh 来给文件添加执行权限。并且执行sh /data/mico.sh 测试是否正常
5,小爱tx连esp中定义的rx。   rx连esp的tx  , gnd连5v转3.3v小板的gnd和esp的gnd   小爱的5v连 电源小板(电源可以用1117芯片的板子或其他的,另外我测量了一下小爱play的主板。似乎有几个地方直接提供了3.3v的电压,但是怕电流不够,所以还是用了个电源板来转)
6,开机一切正常的话,等esp固件工作完毕后就可以用ssh连接小爱了。

ps:目前不知道如何通过sh来终止小爱play的ota升级。因为计划任务文件是只读的。无法直接修改。

评分

参与人数 2金钱 +27 收起 理由
Jerrylee + 7 感谢楼主分享!
+ 20 墙都不扶,就服楼主!

查看全部评分

回复

使用道具 举报

18

主题

690

帖子

3782

积分

元老级技术达人

积分
3782
金钱
3082
HASS币
60
发表于 2019-12-29 18:22:47 | 显示全部楼层
这个可以玩玩。
回复

使用道具 举报

0

主题

2

帖子

27

积分

新手上路

Rank: 1

积分
27
金钱
25
HASS币
0
发表于 2019-12-30 00:08:42 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

39

主题

2052

帖子

7709

积分

元老级技术达人

积分
7709
金钱
5642
HASS币
110
发表于 2019-12-30 09:04:01 | 显示全部楼层
你们密码都咋算的啊 小爱闹钟也想要~
回复

使用道具 举报

2

主题

171

帖子

1169

积分

金牌会员

Rank: 6Rank: 6

积分
1169
金钱
998
HASS币
10
发表于 2019-12-30 13:15:31 | 显示全部楼层
真是越玩越大了.    連最新的 "小愛play" 版,  也可以被Hack了.     只是玩了1-2年以來,  這種欄截方式還只能算是堪用.     沒辦法連續幾個月都不重啟,  且隨傳髓到.      後來就把小愛音箱收起來了.    現在只用天貓精靈.   以oauth2方式直連家裡的HA.   非常穩定及可靠.

而電源問題,  其實可以使用我原本推薦的 Arduino ProMini.    不過要記得選 5V, 16MHZ版本,   才能應付57600的速率.  如使用esp8266 , 那耗電至少10倍以上.   就需要額外的LDO.  

然後那程序我是用了雙串口(其中一個為模擬).     模擬串口只是為了方便把小愛的TTL輸出,  中轉出來而已.
如果不需要,  連 軟件串口庫  都不用引入起來了.

你們繼續加油吧,   我就不折騰小愛了...     
回复

使用道具 举报

0

主题

17

帖子

456

积分

中级会员

Rank: 3Rank: 3

积分
456
金钱
439
HASS币
0
发表于 2020-1-1 22:37:33 | 显示全部楼层
感谢分享,收藏备用
回复

使用道具 举报

0

主题

15

帖子

76

积分

注册会员

Rank: 2

积分
76
金钱
61
HASS币
0
发表于 2020-1-22 10:36:40 | 显示全部楼层
周年庆发了个play 正好拿来折腾
回复

使用道具 举报

1

主题

36

帖子

156

积分

注册会员

Rank: 2

积分
156
金钱
120
HASS币
0
发表于 2020-6-6 12:50:13 | 显示全部楼层
感谢,原来是guid不对
回复

使用道具 举报

4

主题

100

帖子

806

积分

高级会员

Rank: 4

积分
806
金钱
706
HASS币
0
发表于 2020-7-10 23:18:19 | 显示全部楼层
求一个旧版的小爱同学Play固件下载地址...自动更新完了劫持失效了...
回复

使用道具 举报

0

主题

17

帖子

456

积分

中级会员

Rank: 3Rank: 3

积分
456
金钱
439
HASS币
0
发表于 2020-7-18 11:15:52 | 显示全部楼层
抚音 发表于 2020-7-10 23:18
求一个旧版的小爱同学Play固件下载地址...自动更新完了劫持失效了...

我这里是更新到了1.68.1,uuid变成了5775B10D-15C0-7827-97B9-88EA07FCA97A,拦截脚本原来的log文件失效,新的可以监听/tmp/mico_aivs_lab/instruction.log文件。由于我不需要小爱的返回值所以只拦截查询内容发送到原来的res参数,可以参考

# @author FlashSoft
# == 自定义配置========================================
# 设定拦截词,以竖线分割每个拦截词,被拦截的内容会转发给nodered服务器进行处理
keywords=""
# 配置nodered的接收地址
nodered_url="https://xxx.com/miai"
# 配置从nodered更新拦截词的间隔,单位秒
# 0代表不更新,一直使用本地拦截词
# 大于0则更新,会从上面设定的nodered_url去获取拦截词,并覆盖本地的拦截词
keywords_update_timeout=60
# == /自定义配置========================================
first_run=1
nodered_auth="user:pass"
res_file="/tmp/mico_aivs_lab/instruction.log"

# 解决可能存在第一次文件不存在问题
touch $res_file
res_md5=""
last_time=`date +%s`

echo "== 拦截词: $keywords"
echo "== NodeRed地址:$nodered_url"
echo "== 更新拦截词时间间隔 $keywords_update_timeout 秒"

while true;do
  # 计算md5值 
  new_md5=`md5sum $res_file | awk '{print $1}'`
  # 如果是第一次,就赋值比较用的md5
  [ -z $res_md5 ] && res_md5=$new_md5
  # 如果md5不等则文件变化
  if [[ $new_md5 != $res_md5 ]];then
    # 记录md5变化后结果
    res_md5=$new_md5

    # 获取res内容
    res_content=`cat $res_file|grep "is_final"|grep true`
    if [[ -z $res_content ]];then
        continue
    fi
    echo $res_content
    echo "" > $res_file && res_md5=`md5sum $res_file | awk '{print $1}'`
    # 如果拦截词不为空,且匹配到了拦截词则试图拦截
    if ([[ ! -z $keywords ]] && [[ ! -z `echo "$res_content"|awk 'match($0,/'$keywords'/){print 1}'` ]]);then
      echo "== 试图停止"
      # 若干循环,直到resume成功一次直接跳出
      seq 1 200 | while read line;do
        code=`ubus call mediaplayer player_play_operation {"action":"resume"}|awk -F 'code":' '{print $2}'`
        if [[ "$code" -eq "0" ]];then
          echo "== 停止成功"
          break
        fi
        usleep 50
      done

      # 记录播放状态并暂停,方便在HA服务器处理逻辑的时候不会插播音乐,0为未播放,1为播放中,2为暂停
      play_status=`ubus -t 1 call mediaplayer player_get_play_status | awk -F 'status' '{print $2}' | cut -c 5`
      # echo $play_status
      ubus call mediaplayer player_play_operation {"action":"pause"} > /dev/null 2>&1

      ubus call mibrain text_to_speech "{"text":"稍等","save":0}" > /dev/null 2>&1
      # @todo:
      # 转发asr和res给服务端接口,远端可以处理控制逻辑完成后返回需要播报的TTS文本
      # 2秒连接超时,4秒传输超时
      tts=`curl --insecure -u "$nodered_auth" –connect-timeout 2 -m 4 -s  --data-urlencode "res=$res_content" $nodered_url`
      echo "== 请求完成"

      # # 如果远端返回内容不为空则用TTS播报之
      if [[ -n "$tts" ]];then
        echo "== 播报TTS | TTS内容: $tts"
        ubus call mibrain text_to_speech "{"text":"$tts","save":0}" > /dev/null 2>&1
        # 最长20秒TTS播报时间,20秒内如果播报完成跳出
        seq 1 20 | while read line;do
          media_type=`ubus -t 1 call mediaplayer player_get_play_status|awk -F 'media_type' '{print $2}'|cut -c 5`
          if [ "${media_type}" = "" ] || [ "${media_type}" -ne "1" ];then
            echo "== 播报TTS结束"
            break
          fi
          sleep 1
        done
      fi

      # 如果之前音乐是播放的则接着播放
      if [[ "$play_status" -eq "1" ]];then
        echo "== 继续播放音乐"
        # 这里延迟一秒是因为前面处理如果太快,可能引起恢复播放不成功
        sleep 1
        ubus call mediaplayer player_play_operation {"action":"play"} > /dev/null 2>&1
      fi
    fi
  fi

  # 以某频度去更新拦截词
  if [[ "$keywords_update_timeout" -gt "0" ]];then
    now=`date +%s`
    step=`expr $now - $last_time`
    # 根据设定时间间隔获取更新词
    if [ "$first_run" -gt "0" ] || [ "$step" -gt "$keywords_update_timeout" ];then
        keywords=`curl --insecure -u "$nodered_auth" –connect-timeout 2 -m 4 -s $nodered_url`
        echo "== 更新关键词 | 关键词内容: $keywords"
        last_time=`date +%s`
        first_run=0
    fi
  fi
  usleep 10
done








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-2 14:30 , Processed in 0.100073 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表