14206| 6
|
[教程] 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来编写程序: [mw_shl_code=python,true]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.0'): time.sleep_ms(500) print('.',end="") print('WiFi Connection Successful,Network Config:%s' %str(wlan.ifconfig())) #掌控板连接路由器结束 ip= wlan.ifconfig()[0] #掌控板连接成功后的网络属性 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[5:] str1 = 'HTTP' position = data_cut.index(str1) data_cut = data_cut[0:position] #将用户输入的内容从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()[/mw_shl_code] 3. 测试
4. 拓展 当然用同样的方法我们可以向掌控板发送一组数据,掌控板根据逻辑进行判断并做出反馈。比如下面我们发送RGB值来点亮板载LED灯: 点击“将颜色传给掌控板”后,掌控板上的3个LED灯按发送过来的RGB数值点亮 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed