嵌入式技术论坛
直播中

王飞云

7年用户 1450经验值
私信 关注
[经验]

网络编程+Eric+onenet鱼缸系统与百度语言合成学习

1 使用mqtt去连接onenet云平台

连接onenet云平台
配置mqtt package

1.jpg

配置webclient

1.jpg

配置cjson

1.jpg

注册onenet账号,配置设备

创建一个产品

1.jpg

在产品里面选择添加设备

1.jpg

在设备管理里面找到刚刚添加的设备,选择查看详情

1.jpg

选择添加APIKey,APIKey名称和关联设备是相对应的

1.jpg

标记需要记录的信息,标号与onenet配置时候一一对应

1.jpg

配置onenet package

根据上图标号对应信息,一一配置到工程中

1.jpg

Enable OneNET sample:开启 OneNET 示例代码
Enable support MQTT protocol:开启 MQTT 协议连接 OneNET 支持
Enable OneNET automatic register device:开启 OneNET 自动注册设备功能
device id:配置云端创建设备时获取的 设备ID
auth info:配置云端创建产品时 用户自定义的鉴权信息 (每个产品的每个设备唯一)
api key:配置云端创建设备时获取的 APIkey
product id:配置云端创建产品时获取的 产品ID
master/product apikey:配置云端创建产品时获取的 产品APIKey
使用mdk5编译工程下载程序
输入指令:onenet_mqtt_init 初始化mqttt
输入指令:onenet_upload_cycle 发送指令给云平台

1.jpg

在云平台界面查看设备状态

1.jpg

连接成功,同时发送数据到云平台

遇到错误

OneNet Send data failed! Webclient connect URI

1.jpg

通过debug发现程序在这个地方出错

1.jpg

通过上面出错的地方可以判断可能是是文件系统的最大fd数目不够,增大fd数目

1.jpg

错误解决

注意事项

未启用自动注册功能,在 menuconfig 选项中配置的 device id、api key、product id、auth info 等信息需要和 OneNET 云端新建产品和新建设备时获取的信息一致。

初始化 OneNET package 之前需要设备联网成功。

使用命令行接受cloud的数据
在初始化时,命令响应回调函数默认指向了空,想要接收命令,必须设置命令响应回调函数,在 shell 中输入命令onenet_set_cmd_rsp,就把示例文件里的命令响应回调函数挂载上了,这个响应函数在接收到命令后会把命令打印出来。

1.jpg

2.jpg

2 OneNet智能鱼缸系统

RGB灯光控制,使鱼缸能够发出绚丽多彩灯光,让人赏心悦目。

解决方案:云端下发指令,控制LED灯光效果。

温度监测,温度上报云端,同时自动控制加热器维持温度。

解决方案:云端下发指令,设置自动温度阈值,同时云端显示温度变化。

智能投食,可以远程控制投食,也可以本地投食,同时将投食记录上报。

解决方案:云端下发指令,控制投食,同时按键检测触发投食,将投食记录上报。

使用json格式指令控制

解决方案:使用cjson解析指令

使用json格式定义指令

灯光控制
{“object”:”set_rgb”,”message”:”red”}
{“object”:”set_rgb”,”message”:”green”}
{“object”:”set_rgb”,”message”:”blue”}
{“object”:”set_rgb”,”message”:”off”}

温度控制
{“object”:”set_temperature”,”message”:50}
{“object”:”report_temperature”,”message”:35}

投食控制
{“object”:”feed_fish”,”message”:50}
{“object”:”report_feed_fish”,”message”:50}

代码清单
附件 at_onenet_test.c

通过onenet控制led

1.jpg

填入json控制指令

1.jpg

开发板打印log,同时开发板的led伴随相应的变化

1.jpg

控制成功!!!

通过onenet查看温度变化与喂鱼情况

按下开发板的SW1按键,喂鱼并把喂鱼情况上报

1.jpg

在onenet查看喂鱼上报信息

1.jpg

信息一一对应!

使用onenet的图形界面,让系统更形象

在主界面选择:应用管理,然后在选择:创建应用

用折线图表示温度变化

1.jpg

用柱状图表示投食重量

1.jpg

以上两个图都要注意选择对应的数据流

用按键来控制开关

1.jpg

开关控制填入对应的json控制指令即可!

运行效果

1.jpg

系统雏形完成,更多详细功能根据实际应用开发。

3 百度语言合成

使用百度语音合成功能,将一段文字合成为语言,同时下载到开发板中

进入控制台后,在百度语言里面,创建应用

1.jpg

查看创建的应用,获取如下关键信息

1.jpg

获取token
首先在您创建的应用中查找Api Key 和 SecretKey。

比如:

1.jpg

将上面地址输入浏览器得到:

{
"access_token":"24.edb60e804472c7d646b33c05a888a024.2592000.1536845082.282335-11665378",
"session_key":"9mzdXqEJ9EoiEVbiBQ3okHuqXx/ee5N1lm6cc3faMr7Th5S4PMJVW+S3Pr0UXqyF7ZvXA0ou+7x7FP54kBTkyieDWnUI5A==",
"scope":"public brain_all_scope audio_voice_assistant_get audio_tts_post wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian ApsMisTest_Test\u6743\u9650 vis-classify_flower lpq_\u5f00\u653e cop_helloScope ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar oauth_tp_app",
"refresh_token":"25.4f4982edf13c6e5055668d1a06751ea0.315360000.1849613082.282335-11665378",
"session_secret":"c871047f8a549c1664d3948202b299c7",
"expires_in":2592000
}

提取关键信息token:

"access_token":"24.edb60e804472c7d646b33c05a888a024.2592000.1536845082.282335-11665378"

访问合成接口

需要翻译的内容转换成urlencode(百度能找到许多转换工具)
比如:床前明月光疑是地上霜举头望明月低头思故乡
urlencode:

%e5%ba%8a%e5%89%8d%e6%98%8e%e6%9c%88%e5%85%89%e7%96%91%e6%98%af%e5%9c%b0%e4%b8%8a%e9%9c%9c%e4%b8%be%e5%a4%b4%e6%9c%9b%e6%98%8e%e6%9c%88%e4%bd%8e%e5%a4%b4%e6%80%9d%e6%95%85%e4%b9%a1

1.jpg

合成接口
lan=zh&ctp=1&cuid=abcdxxx&tok=24.edb60e804472c7d646b33c05a888a024.2592000.1536845082.282335-11665378&tex=%e5%ba%8a%e5%89%8d%e6%98%8e%e6%9c%88%e5%85%89%e7%96%91%e6%98%af%e5%9c%b0%e4%b8%8a%e9%9c%9c%e4%b8%be%e5%a4%b4%e6%9c%9b%e6%98%8e%e6%9c%88%e4%bd%8e%e5%a4%b4%e6%80%9d%e6%95%85%e4%b9%a1&vol=9&per=0&spd=5&pit=5&aue=3

浏览器输入接口查看实际效果

1.jpg

使用代码实现
附件:at_audio_test.c
运行代码

1.jpg

文件下载成功!!!

遇到错误

(header_ptr->magic & RT_MEMHEAP_MASK) == RT_MEMHEAP_MAGIC) assertion failed at function:rt_memheap_free, line number:525

1.jpg

原因:下载文件比我申请的缓冲区大
解决:把缓冲区增大,比下载文件大,由原来的4k改到10k

1.jpg

关于这个语言合成,百度提供有详细的操作过程,其中关键地方是
根据自己创建的产品,获取到对应的两把key。

根据两把key合并出一个token获取网址。

根据获取到的token合并成一个网址去请求语言合成。

这个网址包含了token,还有文字信息的urlencode。合成之后,就可以使用http去下载文件了。

尚未解决问题

在使用AT socket的情况下,使用webclient去访问https。
使用百度语音合成的时候,获取token的时候需要用到https方式,目前我调试webclient的TLS功能,运行tls_test发现运行失败,报了以下的一些错误

1.jpg

我按要求增大了TLS这个缓存,但是还是无效

1.jpg

原作者:EricYYG

更多回帖

发帖
×
20
完善资料,
赚取积分