找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 4200|回复: 0

【EV3与物联网系列教程】14让电脑向EV3发送消息

[复制链接]
发表于 2022-12-6 12:23:42 | 显示全部楼层 |阅读模式
本帖最后由 蒙德·究史尼 于 2022-12-6 12:26 编辑

上一篇:https://bbs.cmnxt.com/forum.php?mod=viewthread&tid=65473




上一篇讲的是让EV3向电脑发送消息的方法。这一篇刚好反过来,讲的是让电脑向EV3发送消息的方法。


让EV3接收来自电脑的UDP数据包
刚才我们学习了EV3向电脑发送数据包的方法。但是,这样只能单方向的通信。所以,还需要让EV3能够接收来自电脑发送的UDP数据包才行。
接收数据包的步骤也很简单,比发送略微复杂一些。

首先,导入socket库。
  1. import socket
复制代码
其次,创建套接字对象。
  1. s1=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
复制代码
再次,绑定端口号。不同于发送的过程,接收消息的时候,必须绑定端口号,否则收不到任何东西。绑定完成之后输出一句话,告诉用户程序已经准备好接收UDP数据包。
  1. s1.bind(('0.0.0.0', 9999))
  2. print('准备好接收消息了,等待消息中。')
复制代码
然后,用recvfrom()函数让套接字对象接收消息,括号里的1024表示接收1024个字节。
这个过程是阻塞的,也就是说,程序在这里会一直等待数据包发过来。如果它没有收到任何UDP数据包,就会一直等待,不会执行后面的代码,直到收到UDP数据包为止。收到以后,recvfrom函数会返回两个值,分别是收到的消息(以字节的形式)和发送者的地址(以('IP地址',端口号)的一个元组的形式)。把它们分别存储在messageaddress变量里。
  1. message, address=s1.recvfrom(1024)
复制代码
要想把电脑发送过来的消息正确地输出的话,就需要对字节形式的消息进行解码。因为电脑端发消息的时候是用UTF-8编码的,所以我们解码的时候也采用UTF-8。(如果不需要知道发送方的地址,就可以把这一步和上一步的代码合成一行)
  1. print(message.decode('UTF-8'))
复制代码
最后,关闭套接字。
  1. s1.close()
复制代码
完成了。
合起来,代码就是:
  1. import socket
  2. s1=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  3. s1.bind(('0.0.0.0', 9999))
  4. print('准备好接收消息了,等待消息中。')
  5. message, address=s1.recvfrom(1024)
  6. print(message.decode('UTF-8'))
  7. s1.close()
复制代码
总共7行代码。
确保你的电脑和EV3的网络是连接到同一个路由器的。然后用Thonny让EV3运行这段程序。
1.png
程序运行后,窗口下方会输出提示“准备好接收消息了,等待消息中。”
2.png
打开并设置好网络调试助手,打开端口,在“远程主机”栏内填写EV3的地址,格式为
  1. IP地址:端口号
复制代码
例如:
  1. 192.168.0.112:9999
复制代码
EV3的IP地址可以从EV3黑白液晶屏的左上角看到。端口号就是刚才程序里EV3打开的端口号,在我的示例程序中是9999号端口。IP地址和端口号之间要用一个英文冒号隔开,不能用中文冒号。
在最下面的消息输入栏内输入想要发送给EV3的消息,我输入了“good”。然后点击右边的很显眼的“发送”按钮。
3.png
与此同时,EV3会收到我们从电脑发送的消息“good”并显示出来,程序执行完毕。
4.png
现在,你已经可以让EV3通过网络从电脑接收发送过来的消息了!

如果要查看发送UDP数据包的计算机的地址的话,就在代码的最后一行再添加:
  1. print(address)
复制代码
这样可以用('IP地址', 端口号)的一个元组的形式输出发送UDP数据包的计算机的地址。但是,这个方法只在python3解释器里起作用。如果用micropython解释器的话,输出的计算机地址会是一堆乱码。

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-22 11:50 , Processed in 0.095489 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表