1引言
1.1编写目的
采用图表等形式简要介绍软硬件设计基本结构,作为后续二次开发的基础材料。
1.2背景
本项目为了解决STM机上禁止代客操作而客户又因UI界面元素复杂对按钮查找不方便之间的矛盾。项目硬件上主要由离线语音识别模块和WIFI模块组成,使用UART,SOCKET等通信方式传递控制信息,采用C/S架构,通过将语音信息转至视觉信心,辅助客户办理业务。
1.3定义
离线语音识别:采用不联网的本地语音模型对语音进行模式匹配,输入匹配结果。
辅助指示:通过对语音识别的内容进行封装传输于STM机上显式的标识按钮位置。
STM机:自主柜员机。
2总体设计
2.1需求规定
语音识别模块:
输入:语音条目
输出:UART 串口信息
处理功能: 对语音信息进行匹配得到待UART发送的数据
功能性能需求:高识别率,识别迅速
输入:UART 串口信息
输出:SOCKET 通信 SOCK_STREAM
处理功能:
a. 接受串口信息,对串口信读取后经处理后通过SOCKET发送至WIFI模块2
b. 根据按钮选择要链接的WIFI模块2
功能性能需求:两块WIFI模块链接速度迅速,SCOKCT链接稳定传输无误
输入:SOCKET 通信 SOCK_STREAM
输出:GPIO控制信息或UART 串口信息
处理功能:
a. 接受SOCKET信息,读取后使STM机对应UI界面元素高亮
b. 可以穿行的接受多个WIFI模块1的控制信息
功能性能需求:两块WIFI模块链接速度迅速,SCOKCT链接稳定传输无误,产生对STM机UI元素的控制信息
2.2运行环境
软件环境:
开发语言:C++,MicroPython
使用服务:SOCKET UART
2.3基本设计概念和处理流程
基本设计概念:
使用两块WIFI模块间的SOCKET通信传递控制信息,服务端通过按钮选择要链接的客户端,服务端检测链接成功后即可开始客户端的信心传输工作。离线语音芯片将语音指令转换为二进制信息通过WIFI从客户端传递至服务端,客户端响应产生对STM机UI元素的控制信息
流程图:
-
使用按钮选择链接对应的服务端
-
等待WIFI链接成功
-
说出语音指令
-
语音指令经芯片处理后由客户端发送至服务端
-
服务端接受信息UI界面相应
-
如改比业务完成选择结束
-
断开两块WIFI芯片(服务端,客户端)的链
2.4结构
硬件结构分为服务端和客户端两个部分:
客户端为服务人员携带的便携设设备,应使用电池供电。主要组成部分为语音识别芯片VB-01以及ESP-32WIFI模块(拾音器以及喇叭未画出)。负责语音信息的接受产生控制信息以及对控制信息的传输,在客户端设备上可由按钮选择需要链接的STM机客户端对其进行控制。
服务端由一块ESP-8266芯片和UART转USB器组成,负责将从客户端接受到的控制信息转换成控制UI界面的控制信息。
关系结构:
一对一通信:一个客户端于一个服务端链接,产生控制信息,点对点通信。
多对一通信:多个客户端于一个服务端链接,并行的传递控制信息。
2.5尚未问决的问题
说明在概要设计过程中尚未解决而设计者认为在系统完成之前必须解决的各个问题。
-
未考虑到传输过程中的安全性以及与STM机连接的到形式和在该机上运行的服务程序的传输协议和接入方式。
-
未设计详细的PCB走线,原型模型使用开发板以杜邦线形式链接。按键较少,对应方式为一对一对于多机的链接有一定问题。
-
离线语音识别芯片的语音条目目前支持只有50条可以考虑使用存储空间更大的芯片。
3软件设计
客户端源码:
#通过按钮链接网络测试
import time
import network
import utime
from machine import Pin
def uartGet():
from machine import UART
# 初始化一个UART对象
uart = UART(2, baudrate=115200, rx=16, tx=17, timeout=10)
#初始化socket 对象
import socket
client = socket.socket()
client.connect(('192.168.4.1', 10000))
while True:
if uart.any():
bin_data = uart.readline()
print(bin_data)
client.send(bin_data)
def connectnetWifi(essid,password):
sta_if = network.WLAN(network.STA_IF) # 配置wifi模式为station
if not sta_if.isconnected(): # 判断有无连接
print('connecting to network...')
sta_if.active(True) # 激活wifi接口
sta_if.connect(essid, password) # 连接现有wifi网络,需要替换为已知的热点名称和密码
while not sta_if.isconnected():
utime.sleep(1) # 未连接上就等待一下,直到连接成功
print("essid: {},password: {}".format(essid,password))
print(sta_if.config("essid"))
print('network config:', sta_if.ifconfig()) # 输出当前wifi网络给自己分配的网络参数
print('------------------------------------')
def disconnectWifi():
'''
断开网络连接
'''
sta_if = network.WLAN(network.STA_IF)
if sta_if.isconnected():
sta_if.disconnect()
print('the network had been disconnect')
#初始化 按钮对应的针脚
pressKey1 = Pin(32)
pressKey2 = Pin(33)
pressKey3 = Pin(14)
pressKey4 = Pin(12)
flag = True
while True:
if flag == True:
if pressKey1.value()==1:
print("1")
flag = False
if pressKey1.value()==1:
print("2")
flag = False
if pressKey3.value()==1:
disconnectWifi()
print('3')
flag = False
connectnetWifi('ESP-32','1234567890')
uartGet()
if pressKey4.value()==1:
disconnectWifi()
print("4")
flag = False
connectnetWifi('ESP-8266', '1234567890')
# socketClinet()
#每次接受的数据为持续的000 或111 通过判断只输出单次的结果
if pressKey1.value()==0 and pressKey2.value() == 0 and pressKey3.value()==0 and pressKey4.value()==0:
flag = True
服务端源码:
import network
import socket
import time
# SSID = "7-704" # 修改为你的WiFi名称
# PASSWORD = "qmy980902" # 修改为你WiFi密码
port = 10000 # 端口号
wlan = None # wlan
listenSocket = None # 套接字
from machine import UART
import time
uart = UART(1,baudrate=9600)
import network
ap = network.WLAN(network.AP_IF) # 指定用ap模式
ap.active(True) # 启用wifi前需要先激活接口
ap.config(essid="ESP-32") # 设置热点名称
ap.config(authmode=3, password='1234567890') # 设置认证模式与密码
print(ap.ifconfig())
# Catch exceptions,stop program if interrupted accidentally in the 'try'
try:
# connectWifi(SSID, PASSWORD)
ip = ap.ifconfig()[0] # 获取IP地址
listenSocket = socket.socket() # 创建套接字
print("bind ip:{} port:{}".format(ip,port))
listenSocket.bind((ip, port)) # 绑定地址和端口号
listenSocket.listen(2) # 监听套接字
listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置套接字
print('tcp waiting...')
while True:
print("accepting.....")
conn, addr = listenSocket.accept() # 接收连接请求,返回收发数据的套接字对象和客户端地址
print(addr, "connected")
while True:
data = conn.recv(1024) # 接收数据(1024字节大小)
if (len(data) == 0): # 判断客户端是否断开连接
print("closesocket")
conn.close() # 关闭套接字
break
print(data)
print(type(data))
print("send uart data")
uart.write(data)
# ret = conn.send(data) # 发送数据
except:
if (listenSocket): # 判断套接字是否为空
listenSocket.close() # 关闭套接字
演示视频:
https://www.bilibili.com/video/BV1tf4y1M7Ae?spm_id_from=333.999.0.0
网友评论