本帖最后由 蒙德·究史尼 于 2022-12-6 12:26 编辑
上一篇:https://bbs.cmnxt.com/forum.php?mod=viewthread&tid=65473
上一篇讲的是让EV3向电脑发送消息的方法。这一篇刚好反过来,讲的是让电脑向EV3发送消息的方法。
让EV3接收来自电脑的UDP数据包刚才我们学习了EV3向电脑发送数据包的方法。但是,这样只能单方向的通信。所以,还需要让EV3能够接收来自电脑发送的UDP数据包才行。 接收数据包的步骤也很简单,比发送略微复杂一些。
首先,导入socket库。 其次,创建套接字对象。 - s1=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
复制代码再次,绑定端口号。不同于发送的过程,接收消息的时候,必须绑定端口号,否则收不到任何东西。绑定完成之后输出一句话,告诉用户程序已经准备好接收UDP数据包。 - s1.bind(('0.0.0.0', 9999))
- print('准备好接收消息了,等待消息中。')
复制代码然后,用recvfrom()函数让套接字对象接收消息,括号里的1024表示接收1024个字节。 这个过程是阻塞的,也就是说,程序在这里会一直等待数据包发过来。如果它没有收到任何UDP数据包,就会一直等待,不会执行后面的代码,直到收到UDP数据包为止。收到以后,recvfrom函数会返回两个值,分别是收到的消息(以字节的形式)和发送者的地址(以('IP地址',端口号)的一个元组的形式)。把它们分别存储在message和address变量里。 - message, address=s1.recvfrom(1024)
复制代码要想把电脑发送过来的消息正确地输出的话,就需要对字节形式的消息进行解码。因为电脑端发消息的时候是用UTF-8编码的,所以我们解码的时候也采用UTF-8。(如果不需要知道发送方的地址,就可以把这一步和上一步的代码合成一行) - print(message.decode('UTF-8'))
复制代码最后,关闭套接字。 完成了。 合起来,代码就是: - import socket
- s1=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s1.bind(('0.0.0.0', 9999))
- print('准备好接收消息了,等待消息中。')
- message, address=s1.recvfrom(1024)
- print(message.decode('UTF-8'))
- s1.close()
复制代码总共7行代码。 确保你的电脑和EV3的网络是连接到同一个路由器的。然后用Thonny让EV3运行这段程序。 程序运行后,窗口下方会输出提示“准备好接收消息了,等待消息中。” 打开并设置好网络调试助手,打开端口,在“远程主机”栏内填写EV3的地址,格式为: 例如: EV3的IP地址可以从EV3黑白液晶屏的左上角看到。端口号就是刚才程序里EV3打开的端口号,在我的示例程序中是9999号端口。IP地址和端口号之间要用一个英文冒号隔开,不能用中文冒号。 在最下面的消息输入栏内输入想要发送给EV3的消息,我输入了“good”。然后点击右边的很显眼的“发送”按钮。
与此同时,EV3会收到我们从电脑发送的消息“good”并显示出来,程序执行完毕。 现在,你已经可以让EV3通过网络从电脑接收发送过来的消息了!
如果要查看发送UDP数据包的计算机的地址的话,就在代码的最后一行再添加: 这样可以用('IP地址', 端口号)的一个元组的形式输出发送UDP数据包的计算机的地址。但是,这个方法只在python3解释器里起作用。如果用micropython解释器的话,输出的计算机地址会是一堆乱码。
|