szjuliet 发表于 2019-4-1 10:06:57

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数值点亮


rzegkly 发表于 2019-4-1 15:21:54


App Inventor与掌控板的板载传感器的通信很赞,App Inventor传一份?

粒子 发表于 2019-4-1 18:47:55

{:5_144:}

szjuliet 发表于 2019-4-2 08:37:11

rzegkly 发表于 2019-4-1 15:21
App Inventor与掌控板的板载传感器的通信很赞,App Inventor传一份?

好,我周末有空再写个帖子发上来~~

w1 发表于 2019-4-4 16:49:58

楼主,我复制了代码 进行调试 显示这个错误, 同样用的0.2.4 版本什么原因呢

szjuliet 发表于 2019-4-4 18:21:58

w1 发表于 2019-4-4 16:49
楼主,我复制了代码 进行调试 显示这个错误, 同样用的0.2.4 版本什么原因呢 ...

我也遇到过,程序不存在语法错误,重新再点“调试代码”又正常,不知道是不是软件的bug。

rzyzzxw 发表于 2019-4-8 08:17:07

哈哈,教程很赞啊。{:5_148:}
页: [1]
查看完整版本: AppInventor与掌控板通过wifi通信