今天介绍homecenter的设计,就是主控部分。主控部分实现接收语音模块输入,蓝牙模块输入,红外接口发射,WiFi访问智能设备访问。接口输入容易,都采用串口输入,然后查配置文件,向对应的智能设备ip地址发送控制命令。
1、配置部分
wifi路由器配置,通过设置esp32模块为AP模式,通过网页浏览器,就可以访问到esp32模块,通过网页设置WiFi的名称和密码。最后记录下,WiFi的信息,以后esp32就可以连接上WiFi。
def connectAp():
content = b'''
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>用户登录.html</title>
</head>
<body>
<p>输入wifi路由信息</p>
<form name="wifimsg"action="#" method="get">
路由器名称:
<input type="text" name="wifi" value=""/>
路由器密码:
<input type="text" name="password" value=""/>
<input type="submit" name="tijiao" value="ok"/>
</form>
</body>
</html>
'''
ap = network.WLAN(network.AP_IF)
ap.config(essid='HUAWEI1', authmode=4, password='12345678')
ap.active(True)
if not ap.isconnected():
print('connecting to network...')
start = time.time()
while not ap.isconnected():
time.sleep(1)
if time.time()-start > 30:
print("connect STA timeout!")
break
if ap.isconnected():
print('network config:', ap.ifconfig())
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(socket.getaddrinfo("0.0.0.0", 80)[0][-1])
s.listen(5)
print('接入热点后可从浏览器访问下面地址:')
print(ap.ifconfig()[0])
print('')
fl=open("Ap.txt","w")
while True:
client_sock, client_addr = s.accept()
print('Client address:', client_addr)
while True:
h = client_sock.readline()
getline=h.decode('utf8')
x=getline.find('wifi=')
y=getline.find("password")
z=getline.find("tijiao")
if((x>0) and (y>0) and (z>0)):
wifiname=getline[x:y-1]
password=getline[y:z-1]
print(wifiname)
print(password)
fl.write(wifiname+"|"+password)
fl.close()
print("file write\r\n")
fl=open("Ap.txt","r")
print(fl.read())
fl.close;
print(getline, end='')
return
if h == b'' or h == b'\r\n':
break
client_sock.write(responseHeaders)
client_sock.write(content)
client_sock.close()
读取WiFi路由器可以通过以下程序。
def getwifiAp():
fl=open("Ap.txt",'r')
tempstr=fl.read()
fl.close()
x=tempstr.find('wifi=')
y=tempstr.find('password=')
essid=tempstr[5:y-1]
password=tempstr[y+9:]
return essid,password
2、关于查找可用智能控制器
由于智能控制器是否在线,需要通过测试,当然有更好更完善的办法,如Upnp的方法,本项目采用比较简单的办法,直接枚举出内部网络的ip地址。访问特定范围ip地址,只要响应正确,就是存在自己的控制器。里面要用到poll,把超时设置成为2秒钟时间,当访问的ip没有超时,且存在反馈,就可以记录该智能控制器存在,最后以json记录在下面文件。
print(Online_web)
with open("Online_web.json", "w", encoding='utf-8') as f:
f.write(json.dumps(Online_web))
f.close()
poll机制设置部分。
print("connecting")
poller.register(s, select.POLLIN|select.POLLOUT)
res = poller.poll(2000)
poller.unregister(s)
print("connect server at",addr)
3、向智能设备发出控制命令 这部分是整个系统的核心,前面工作都是准备,为了方便配置,为了控制工程中不出现问题。控制阶段也可能出现问题,因此我们也需要做好相应的错误控制,确保系统在任何故障情况不引起系统崩溃,也就是系统的故障处理或者叫健康管理。看下面程序,通过try和except防止系统出错,还要把连接命令加上超时2秒的设置,里面很多打印命令只是供系统调试使用。最后记得关闭一些资源,释放多余的空间等,才能确保系统稳定运行。
try:
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print(addr[i])
if not connect_on2s(s,addr[i]):
time.sleep_ms(100);
continue
s.settimeout(4)
except OSError as msg:
print('timeout2')
s.close()
s = None
continue
delta = time.ticks_diff(time.ticks_ms(), start)
print("time :{:d}".format(delta))
if s is None:
print('could not open socket')
s.close
time.sleep(1)
4、红外控制功能 红外控制采用现成的网上程序,该程序可以采用内部计数器生产38khz载波信号,只要把对应的红外控制码发送到程序就可以,简单好用。我目前只能通过采用示波器读出,红外接收的码,然后写入到程序里面,实现简单控制。采用esp32接收红外码,经过学习,然后放出去,还没有调试好。下载地址忘记了,你们自己网上找吧,这是他的介绍,是个开源的程序。
__init__.py Nonblocking IR blaster
事实证明,micropython确实很稳定了,而且插入c语音的函数也非常方便,估计大有前途。 我的homecenter玩具,还欠缺的功能是语音提示和显示。 下期介绍智能控制器设计。
|