AppInventor与掌控板通过wifi通信
本帖最后由 szjuliet 于 2019-4-2 12:57 编辑App Inventor与掌控板的板载传感器的通信,如,光感,LED,蜂鸣,按钮等已经有了很好的解决方案:通过张路老师编写的tinywebio.py能够与掌控板上所有板载元器件进行通信,包括写入和读出。
我们这里所要讨论的是App Inventor与掌控板自由发送信息,这样做的好处是能够灵活的向掌控板发送信息(命令或参数),控制掌控板的程序运行,这样能够极大的扩充掌控板的输入。掌控板可以根据用户输入的命令和参数处理多个不同的任务了。
掌控板不但功能相当强大,而且学习生态非常的好,帮助文档很详尽,可操作性强,即使是初学者也可以很轻松的根据帮助文档进行学习。本教程就是基于掌控板的官方帮助文档之网络部分来开发的。
参考资料:10. 网络
资料链接
10.3. 套接字-TCP
1. App Inventor程序编写
a.组件设计:
我们的示例程序只完成最基本的发送和接收功能,所以组件设计相对比较简单。在客户端这里,需要一个组件(文本输入框)来发送用户输入的内容,还需要一个组件(标签)来显示掌控板回传的信息。组件设计如下图:
b. 逻辑设计:
定义变量ip,用于存放掌控板的IP地址。这个地址在掌控板运行程序后会显示在监视窗口,记录下来填在代码块中。当然我们还可以使用文本输入框,在app运行时让用户填入,本例不再赘述。
当按钮send点击时,将标签的文本框清空,设置掌控板的IP地址,设置web客户端的网址,调用GET请求,将用户输入的内容传给掌控板。
当web客户端获得文本后,将响应内容显示到标签的文本中。
2. 掌控板程序编写
我们使用mPythonX来编写程序:
import network
import socket
from mpython import *
oled.fill(0) #清屏
oled.show()
wlan=network.WLAN(network.STA_IF)
ListenSocket=None
port=6832 #设置服务器的端口号
Head=b'HTTP/1.0 200 OK\r\n' #设置http头尾
HeadEnd=b'\r\n'
try:
wlan.active(True)
wlan.connect("ssid","password") #此处填写掌控板所处局域网的ssid和password
print('connecting to network...')
while(wlan.ifconfig()=='0.0.0.0'):
time.sleep_ms(500)
print('.',end="")
print('WiFi Connection Successful,Network Config:%s' %str(wlan.ifconfig())) #掌控板连接路由器结束
ip= wlan.ifconfig() #掌控板连接成功后的网络属性
ListenSocket = socket.socket()
ListenSocket.bind((ip,port)) #监听套接字绑定IP地址和端口
ListenSocket.listen(5)
ListenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#创建套接字
print ('http waiting...')
oled.DispChar("%s:%s" %(ip,port),0,0) #掌控板显示本机IP地址
oled.DispChar('accepting.....',0,16)
oled.show()
while True:
clientConn,clientAddr = ListenSocket.accept() #获取客户端的套接字和地址
print("Client address:", clientAddr)
print("Client socket:", clientConn)
req = clientConn.recv(1024)#从客户端套接字中读取1024字节数据
print("Request:")
print(req)
reqs=bytes.decode(req)
data_cut = reqs
str1 = 'HTTP'
position = data_cut.index(str1)
data_cut = data_cut #将用户输入的内容从http中分离出来
print(data_cut)
oled.DispChar(data_cut,0,48) # 将接收到文本oled显示出来
oled.show()
oled.fill_rect(0,48,128,16,0)
clientConn.send(Head.decode()+HeadEnd.decode()+"Hello,Juliet!") #向手机发送信息
clientConn.close() #关闭套接字
except:
print("except")
oled.fill(0)
oled.DispChar("except",0,0)
oled.show()
if(ListenSocket):
ListenSocket.close()
wlan.disconnect()
3. 测试
[*]将掌控板接上电脑,点击端口号的“连接串口”
[*]连接成功后会显示“断开连接”,点击“调试代码”,程序开始运行
[*]REPL首先显示 connecting to network... ,如果成功连接到wifi,则显示掌控板的网络配置:IP地址,子网掩码,网关和DNS,并显示http waiting。同时掌控板显示本机的IP地址及端口号,并显示"accepting"。说明掌控板已经准备好接收数据。
[*]手机通过AI伴侣连接到项目,成功后手机界面如下:
[*]在文本输入框中输入要发送的信息:
[*]点击按钮“点击发送”后,信息发送给掌控板,掌控板收到信息后向手机回传信息"Hello Juliet!"
[*]与此同时,在mPythonX的REPL窗口,会显示接收到的数据,同时对数据切片,将输入的文本分离出来并显示在REPL及掌控板的oled屏上。
4. 拓展
当然用同样的方法我们可以向掌控板发送一组数据,掌控板根据逻辑进行判断并做出反馈。比如下面我们发送RGB值来点亮板载LED灯:
点击“将颜色传给掌控板”后,掌控板上的3个LED灯按发送过来的RGB数值点亮
App Inventor与掌控板的板载传感器的通信很赞,App Inventor传一份?
{:5_144:} rzegkly 发表于 2019-4-1 15:21
App Inventor与掌控板的板载传感器的通信很赞,App Inventor传一份?
好,我周末有空再写个帖子发上来~~ 楼主,我复制了代码 进行调试 显示这个错误, 同样用的0.2.4 版本什么原因呢 w1 发表于 2019-4-4 16:49
楼主,我复制了代码 进行调试 显示这个错误, 同样用的0.2.4 版本什么原因呢 ...
我也遇到过,程序不存在语法错误,重新再点“调试代码”又正常,不知道是不是软件的bug。 哈哈,教程很赞啊。{:5_148:}
页:
[1]