【MaixPY 教程】用mixly玩转k210——MixNo通过TCP/IP与掌控板进行通讯

前言
【MaixPy系列教程:】
在教程开始之前你需要了解套接字、和tcp协议及编程的原理:
什么是套接字?
Socket
是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
TCP协议简介
TCP协议,传输控制协议(Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通讯协议,由IETF的RFC 793定义。
TCP通信需要经过创建连接、数据传送、终止连接三个步骤。TCP通信模型中,在通信开始之前,一定要先创建相关连接,才能发送数据,类似于生活中,”打电话””。
套接字在工作时将连接的双方分为服务器端和客户端,即C/S模式,TCP通讯原理如下图:

准备阶段
整体思路:
用掌控板来做TCP服务器,MixNo 来做TCP客户端。(创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器)首先我们先用mpython编写程序为掌控板写TCP客户端来显示客户端的请求,用mixly【软件关注童芯创悟进行获取】编写MixNo的TCP客户端,向服务端发送消息
TCP服务器的编写
1 2 3 4 5 6 7 8 9
| TCP编程的服务端一般步骤是:
创建一个socket,用函数socket() 设置socket属性,用函数setsockopt() , 可选 绑定IP地址、端口等信息到socket上,用函数bind() 开启监听和设置最大监听数,用函数listen() 等待客户端請求一个连接,用函数accept() 收发数据,用函数send()和recv(),或者read()和write() 关闭网络连接
|
首先打开mpython,先让配置掌控板的网络(可以是sta模式,或者AP模式),然后套接字初始化。:

1 2 3 4 5
| socket(socket_family, socket_type, protocol)
|

1 2 3 4 5 6
| mywifi.sta.ifconfig() 用于获得当前链接网络的静态IP地址信息,返回类型为4元素元组,我們用元组中的第一项来做服务器的IP地址。 IP地址:192.168.0.4 NETMASK(子网掩码): 255.255.255.0 GATEWAY(网关):192.168.0.1 DNS:类似本地的host文件。公网DNS注册域名。 注意:返回的数据是一个4元组,元组中的每一项都是字符串格式。
|

1 2 3 4 5
| conn,addr = listenSocket.accept()
需要注意的是:在服务器未接收到任何客户端的访问请求时,程序将停留在该位置,只有有新的请求产生时,程序才能向下进行。所以,如果掌控板在这种情况下,需要处理一些实时程序的话,需要建立定时器中断和外部中断,否则无法对自定义程序进行有效处理。 ocket.recv()接收客户端发来的数据。最大数据量是1024 注意:socket.recv()接收到的数据是二进制字符串格式(与正常的字符串有些差别,需要使用decode()函数来将其解码转化为正常的字符串)
|
TCP客户端的编写
1 2 3 4 5 6 7 8 9
| TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket() 2、设置socket属性,用函数setsockopt() , 可选 3、绑定IP地址、端口等信息到socket上,用函数bind() , 可选 4、设置要连接的对方的IP地址和端口等属性 5、连接服务器,用函数connect() 6、收发数据,用函数send()和recv(),或者read()和write() 7、关闭网络连接
|
首先打开mixly,设置MixNo需要连接的wifi网络(和服务器同一网络),初始化套接字:

客户端有了套接字后,马上就可以调用connect()函数去连接服务器(ps:以元组或者列表的方式绑定服务器地址,和端口)。

建立连接后,就可以与服务器开始对话。在对话结束后,客户端就可以关闭套接字,结束连接。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import socket from mpython import *
port=5001 listenSocket=None
mywifi=wifi()
try: mywifi.connectWiFi("ssid","password") ip= mywifi.sta.ifconfig()[0] listenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) listenSocket.bind((ip,port)) listenSocket.listen(3) print ('tcp waiting...') oled.DispChar("%s:%s" %(ip,port),0,0) oled.DispChar('accepting.....',0,16) oled.show()
while True: print("accepting.....") conn,addr = listenSocket.accept() print(addr,"connected") while True: data = conn.recv(1024) if(len(data) == 0): print("close socket") conn.close() break data_utf=data.decode() print(data_utf) oled.DispChar(data_utf,0,48) oled.show() oled.fill_rect(0,48,128,16,0) conn.send(data)
except: if(listenSocket): listenSocket.close() mywifi.disconnectWiFi()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import time import socket import network_no import machine
try: nic = network_no.wifi_init1() nic.connect("hockel","erised88") print(nic.ifconfig()) sock = socket.socket() sock.settimeout(5) sock.connect(("192.168.43.246", 5001)) while True: sock.send("Hello Handbit") time.sleep_ms(1000) sock.send("I'am MixNo") time.sleep_ms(1000) except: sock.close()
|
程序演示

小结:
有了TCP通讯后,就可以把MixNo识别到的物体发送到掌控板上了,掌控板可以对发来的消息进行处理做出相应的动作(比如:口罩识别门禁,人体追踪、颜色识别等等,当然这些在MixNo中也可以独自完成)。
首发个人博客:www.hockel.club,欢迎关注哈。有问题的可以加入【MixNo QQ群:1056344043】