最近研究物联网相关的东西,做了个小原型,称它为智能管家,能用语音控制设备以及手机APP控制设备。

先看看结构图:

功能描述:

  1. 通过语音控制器,说话,比如说出“帮我开灯”,led灯就量,或者说出“把这个灯给关了”,led灯就灭了
  2. 手机APP上有手动开关来控制led灯的亮和灭
  3. 支持全国范围覆盖,既不能局限于家里的LAN

目前为止,用到的设备主要就是ESPDuino。

ESPDuino:WIFI+Arduino

相关:

  1. ESP8266-01/ESP-01虽然很便宜但是用起来很麻烦,所以弃用
  2. Arduino Yun/Tian虽然功能强大,但是太贵700、800的节奏,弃用(不过这2个是带操作系统的,linino,基于openwrt)
  3. ESPDuino: 不带OS,集成WIFI功能,方便还便宜,大概40左右

分别来介绍下,分为:

  1. OneNet部分
  2. 手机APP部分
  3. 语音控制器部分
  4. ESPDuino执行部分

OneNet部分:

这里我们的主要工作是建立设备,记录下api_key,产品Id这些,并且我们使用的是MQTT协议进行通信(在产品定义中有)(需要新建产品以及新建设备2个步骤)

手机APP部分

由于不会app开发,并且onenet提供了简单的app平台,因此就用onenet的来做,如下,新增一个应用后进入设计app界面:

上图中代表,此时点击 ON button就会下发指令到设备espduino,并且指令为   开灯  字符串, OFF button则为指令  关灯  字符串。

然后保存,需要在手机上看的话,需要安装onenet的app,需要自己找找,最终效果截图:

手机app部分也算完工了,很简陋,但是能控制就好。

语音控制器部分

这个部分分成了2个部分:语音解析文本及命令解析、命令下发;

语音解析文本及命令解析程序:

用的是讯飞语音api,c代码,我是用MFC做了个GUI程序,把demo代码嵌进去,把文本解析成相应的命令,如“开灯”、“关灯”

命令下发程序:

接收MFC发来的命令,比如“开灯”、“关灯”,然后调用onenet的api来下发指令到设备

这部分是用C#做的,因为有很方便的现成的库,很容易的几行代码就搞定

由于MFC比较复杂,这部分的我就截几段我认为关键的代码吧:

MFC代码:

static void show_result(char *string, char is_over)
{COORD orig, current;CONSOLE_SCREEN_BUFFER_INFO info;HANDLE w = GetStdHandle(STD_OUTPUT_HANDLE);GetConsoleScreenBufferInfo(w, &info);current = info.dwCursorPosition;if (current.X == last_pos.X && current.Y == last_pos.Y) {SetConsoleCursorPosition(w, begin_pos);}else {/* changed by other routines, use the new pos as start */begin_pos = current;}if (is_over)SetConsoleTextAttribute(w, FOREGROUND_GREEN);//printf("Result: [ %s ]\n", string);printf(string);if (is_over){CString s = CString(string);//AfxMessageBox(LPCTSTR(s));HWND m_hWnd = pFrame->m_hWnd;//->GetMainWnd()->m_hWnd;SetDlgItemText(m_hWnd, IDC_STATIC, LPCTSTR(s));SetDlgItemText(m_hWnd, IDC_STATIC_ACTION, LPCTSTR(s));CString cmd = CString("C:\\Users\\Danny\\Desktop\\research\\Windows_iat1220_5c82a0db\\samples\\mqtt-publish\\bin\\Debug\\mqtt-publish.exe ");if(s.Find(_T("开"))>=0&& s.Find(_T("灯")) >= 0)cmd += "开灯";else if (s.Find(_T("关")) >= 0 && s.Find(_T("灯")) >= 0)cmd += "关灯";elsecmd += "UNKNOWN";USES_CONVERSION;LPCSTR lpcstr = (LPCSTR)T2A(cmd);WinExec(lpcstr, SW_HIDE);//PostMessage(pFrame->GetMainWnd()->m_hWnd, WM_MY_MESSAGE, NULL, NULL);}if (is_over)SetConsoleTextAttribute(w, info.wAttributes);GetConsoleScreenBufferInfo(w, &info);last_pos = info.dwCursorPosition;
}  

上面的mqtt-publish.exe就是C#写的下发指令到设备的程序,核心代码:

static void Main(string[] args){if (args.Length == 0)return;string cmd = args[0];SendCmdRequest request = new SendCmdRequest();request.CmdContent = cmd;request.DeviceID = 520355898;request.IsByte = true;request.Protocol = Scheme.HTTP;DefaultOneNETClient client = new DefaultOneNETClient("api.heclouds.com", "vYKWEtx7jELTP2V4o=s1NgE1EdA=");var response=client.Execute(request);Console.WriteLine(response.Body);}

C#很简单,红色部分是需要根据自己的onenet来改的,需要对应上,用到的nuget库:

ESPDuino部分

花费的时间最多的地方是这个部分,其次是MFC部分

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <PubSubClient.h>const char *ssid = "你的wifi name";
const char *password = "你的wifi密码";const char* mqtt_server = "183.230.40.39";
const char* mqtt_device_id="520355898";
const char* mqtt_product_id="223168";
const char* mqtt_api_key="vYKWEtx7jELTP2V4o=s1NgE1EdA=";WiFiClient client;
PubSubClient mqttClient(client);long lastMsg = 0;
char msg_buf[200];
char dataTemplete[]="{\"kq\":%d}";
char msgJson[75];
char debug_buf[200];
int i;
unsigned short json_len=0;
uint8_t* packet_p;
uint8_t debug_buffer_start_index = 0;void setup() {Serial.begin(115200);pinMode(BUILTIN_LED, OUTPUT);delay(10);WifiConnected();initMQTT();
}void initMQTT()
{mqttClient.setServer(mqtt_server, 6002);mqttClient.connect(mqtt_device_id,mqtt_product_id,mqtt_api_key);mqttClient.setCallback(callback);
}void callback(char* topic, byte* payload, unsigned int length) {Serial.print("Message arrived [");Serial.print(topic);Serial.print("] ");for (int i = 0; i < length; i++) {Serial.print((char)payload[i]);}Serial.println();String s_payload=String((char *)payload).substring(0, length);Serial.println(s_payload);//开灯命令?   if (s_payload.equals("关灯")||s_payload.equals("\"关灯\"")) {digitalWrite(BUILTIN_LED, LOW);} else if (s_payload.equals("开灯")||s_payload.equals("\"开灯\"")){digitalWrite(BUILTIN_LED, HIGH);}}void reconnect() {// Loop until we're reconnectedwhile (!mqttClient.connected()) {Serial.print("Attempting MQTT connection...");if (mqttClient.connect(mqtt_device_id,mqtt_product_id,mqtt_api_key)) {  //One net user name as product ID , and password as APIKeySerial.println("connected");// Once connected, publish an announcement...mqttClient.publish("outTopic", "hello world");// ... and resubscribemqttClient.subscribe("inTopic");} else {Serial.print("failed, rc=");Serial.print(mqttClient.state());Serial.println(" try again in 5 seconds");// Wait 5 seconds before retryingdelay(5000);}}
}void loop() {if (!mqttClient.connected()) {reconnect();}mqttClient.loop();long now = millis();if (now - lastMsg > 2000) {lastMsg = now;int kqValue=analogRead(A0);snprintf(msgJson,sizeof(msgJson),dataTemplete,kqValue);json_len=strlen(msgJson); //packet length count the end char '\0'msg_buf[0]=char(0x03);  //palyLoad packet byte 1, one_net mqtt Publish packet payload byte 1, type3 , json type2msg_buf[1]=char(json_len>>8);  //high 8 bits of json_len (16bits as short int type)msg_buf[2]=char(json_len&0xff); //low 8 bits of json_len (16bits as short int type)// snprintf(msg_buf+3,40,dataTemplete,value);memcpy(msg_buf+3,msgJson,strlen(msgJson));msg_buf[3+strlen(msgJson)] = 0;Serial.print("Publish message: ");Serial.println(msgJson);mqttClient.publish("$dp",(uint8_t*)msg_buf,3+strlen(msgJson),false); }
}void WifiConnected()
{WiFi.disconnect();WiFi.mode(WIFI_STA);Serial.println();Serial.print("Connecting to");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_DISCONNECTED){delay(500);Serial.print(".");}randomSeed(micros());Serial.println(""); Serial.println("WIFI connected"); Serial.println(WiFi.localIP());}  

至此,可以语音控制和手机控制了。

后续扩展命令会较容易,可以move到C#部分来做,如果觉得语音转文本有不准的地方,目前的想法是通过神经网络来做识别,而不是通过目前的这种很挫的判断办法

OK,完工。

有要代码的就找我发给你。

  

转载于:https://www.cnblogs.com/aarond/p/home-agent.html

智能管家(原型)- 语音控制设备相关推荐

  1. 玩转树莓派 —智能家居(语音控制电器开关 及语音模块的二次开发)

    本文内容为玩转树莓派 -智能家居(语音控制电器开关 及语音模块的二次开发) 1.语音模块 本人使用的是ld3320二代语音识别开发板 通过和电脑连接的是ttl转接口 连接的时候 大家注意l连接方式 2 ...

  2. 2022-2028全球与中国语音控制设备市场现状及未来发展趋势

    本文研究全球及中国市场语音控制设备现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美.欧洲.中国.日本.东南亚和印度等地区的现状及未来发展趋势.  2021年全球语音控制设备市场销售额 ...

  3. “物联网开发实战”学习笔记-(四)智能音箱制作和语音控制

    "物联网开发实战"学习笔记-(四)智能音箱制作和语音控制 这次来造一个属于自己的智能音箱,这里详细介绍了智能音箱的语音控制的实现. 智能音箱的技术架构 智能音箱主要涉及拾音.前端信 ...

  4. 智能家居语音控制及人脸识别报告设计(树莓派)

    智能家居语音控制及人脸识别 目录 摘要................................................................................. ...

  5. 简单三步,教你如何用小度音箱语音控制智汀设备?

    前言 在我们日常生活中,常常听到最多的就就是语音控制设备了,比如,用唤醒词"小度小度"唤醒小度音箱,这时可以看到音箱亮起蓝色的Logo光圈,然后再说"打开/关闭+设备名称 ...

  6. 小度计算机笔记,“一场无速记发布会”,小度真无线智能耳机革新语音笔记功能...

    "人工智能有标签.我们之前使用的耳机,买的时候什么样,将来不用的时候还是什么样.但小度真无线智能耳机有人工智能技术加持,是不断成长的.功能越来越多的人工智能耳机."10月29日,小 ...

  7. 开发者说 | AI操控机器人系列第三期——语音控制(另附直播预约通道)

    预约通道: 课程正文: 摘要: 在AI操控机器人系列第二期的人体跟随教程中,身为地平线资深程序员的奶爸朱靠,使用地平线发布的机器人开发平台TogetherROS软件栈,搭建了人体跟随机器人. 同为开发 ...

  8. CI130X智能语音芯片应用于智能面板,支持红外设备离线语音控制、场景控制等功能

    随着人们生活水平的提高,用户对产品的追求呈现多元化趋势,不仅仅只关注面板开关去控制的灯具亮灭,更注重产品的使用体验感.面板控制也演变了多种方式,从机械开关,轻触按键,手持遥控器到手机端APP,智能语音 ...

  9. DIY 智能家居语音助理 —— 语音控制万物

    本文作者:默. 开源电子平台兴起以来,诞生了不少的创客们,他们用天马行空的想象力,创造出各种新鲜有趣的作品,他们热衷于改变千篇一律的生活,享受科技创造带来的乐趣.其中与我们的生活息息相关的就包括智能家 ...

  10. 智能语音的扫地机器人介简_岚豹激光智能扫地机器人之语音控制

    01岚豹智能扫地机语音控制 想必大家都看过复仇者联盟电影,都羡慕钢铁侠妮妮有一个无所不能.聪明智能的Jarvis管家,有什么需求一句话就能搞定.现在大家不用再羡慕,只要你开口指令,我也能闻声启动,这就 ...

最新文章

  1. 201602021344_《Javascript柯里化uncurrying()(将内置方法独立成为一个通用方法)》
  2. 书评 - 《展望敏捷软件测试》
  3. F - Heron and His Triangle UVALive - 8206
  4. rust的权限柜怎么做_潍坊装修知识~二胎家庭不做上下铺,把两张床靠墙放,中间做收纳柜,你感觉怎么样?...
  5. 6-MyBatis基础
  6. How to make everyone is happy
  7. leetcode探索二叉树(一)
  8. 关于nginx不能随服务器启动而正常启动的修复脚本
  9. Win10(winser2019)关闭驱动数字签名方法
  10. layui开关按钮及代码实现
  11. autojs遍历当前页面所有控件_伙伴系统:页面分配器
  12. 电脑一直跳出 不支持16位的应用程序该如何解决
  13. 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
  14. php thrift 编译,Thrift 源码编译
  15. C# 操作Word——设置Word文档背景色(纯色、渐变色、图片背景色)
  16. 六个做PPT离不开的辅助插件,一秒让你的PPT逼格满满!
  17. 客户问我,他都已经提供了那么多硬盘,你们之前也说可以存满90天,为什么监控录像还是没有90天?
  18. python数学建模
  19. fiddler抓取不了PC端微信小程序的包解决方法
  20. Airtest做微信小程序自动化(AirtestIDE)

热门文章

  1. 汇编语言上机考试三星题——负数变成绝对值,并以十进制方式输出。
  2. C语言图形颜色编程|颜色
  3. C# 串口助手中英文显示问题
  4. 2022京东3.8节如何给不同SKU打水印?
  5. 体验一个人自驾游思考人生
  6. 错误的太极观念造成膝盖损伤
  7. 计算机电源多低无法使用吗,怎么确定电脑电源供电不足?
  8. TI AWR1642学习笔记7 TSW1400采集原始数据
  9. 事物(Transaction)
  10. 智能制造案例——面向重型机械车间智能制造系统解决方案