本文主要介绍如何使用Arduino内核作为编程架构在ESP32(上创建Websocket server(服务器)。所创建的Websocket server(服务器)将作为回发服务器使用,也就是说它会把接收自客户端的数据回发给客户端。

为了对服务器进行测试,我们将使用Python开发一个非常简单的客户端。即便是对从没用过Python的人来说,这也是一种非常简单(也非常强大)的程序设计语言,因此以下代码肯定不难理解。

当然,如果你仍然不习惯使用Python,你也可以参考上一篇帖子使用另一个ESP32开发板上运行的ESP 32 Websocket客户端或者使用其他编程语言开发的Websocket API对代码进行测试。

在ESP32上需要安装一个Websockets库,这样就不需要从头编写底层代码了。我们将使用这个基于WiFiServer的库(来创建一个TCP服务器(这也是Arduino内核的常见做法)。

需要注意的是,我在撰写本文时,上面提到的Websockets库尚未得到ESP32的官方支持(官方支持仅限ESP8266)。尽管如此,经过略微修改之后,仍可在ESP32上使用这个库。

在此前的这篇教程中:ESP32 Arduino教程:Websocket客户端(已经详细介绍了库的安装过程。请参阅此篇教程,因为在使用库之前有几点技巧需要考虑。

下面所示的Arduino代码就是对库的例程进行修改所得到的,可以成功用在ESP32上。

我们还需要在Python上安装一个Websockets模块,同样可以使我们免于处理Websockets的底层实现。

我们将使用一个叫做websocket-client的Python模块(。幸运的是,Python自带了一个叫做pip的软件包安装程序(,可以大大简化模块的安装过程。

因此,要安装上文提到的库,我们只需要在Windows命令行执行以下命令即可:

请注意,根据您所使用的Python具体版本的不同,在发送命令之前可能需要导航到pip所在的文件夹。

首先,导入刚刚安装的websocket client模块。此外,还需要导入time模块,以便在程序中加入延时。

接下来,调用WebSocket对象的connect方法(使用服务器地址作为其输入参数)。

请注意,由于这是一个websocket连接,我们需要将目标设为“ws://{serverIP}/“,其中服务器IP是ESP32连接到WiFi网络时所分配的地址。

代码中使用的是我的ESP32开发板的IP地址,在连接到我的家庭网络时我已经知道了具体的IP地址。但是,如果你还不知道你的IP地址,那么我们会在Arduino代码中将其值打印出来。

上述函数调用之后,我们就应该成功连接到了服务器上。请注意,为简便起见,我在代码中没有进行任何错误处理,但是在实际应用中对可能出现的错误进行处理非常重要。

接下来,为了向服务器发送数据,我们只需调用WebSocket对象的send方法即可(将包含数据内容的字符串作为输入参数)。

为了从服务器接收数据,我们可以调用WebSocket对象的recv方法。该方法会从服务器返回可用的数据,我们应该把这些数据保存到变量中。

Python Websocket client的完整源代码如下所示。请注意,代码中使用循环发送和接收请求,并将从服务器接受到的数据打印出来,以确认服务器真的会将接受到的内容进行回发。

你可以修改nrOfMessages变量和sleep时间,以测试服务器在面对更多请求和更短间隔时的灵活性。

然后,我们需要一个WiFiServer类的对象,所以我们将创建一个TCP服务器并使其监听接受到的请求。websocket server(服务器)也将在这个服务器之上构造。

这个类的构造函数有一个可选参数,可指定服务器将要监听的端口号。尽管其默认值就是80,但是我们仍将显式地传递该输入参数,以说明其用途。

我们还需要一个WebSocketServer类的对象(,它负责提供从客户端接收请求以及对数据交换进行处理时所需要的方法。

在全局变量声明的最后,我们需要将WiFi网络名称(ssid)及其密码保存起来,以便稍后联网时使用。

然后,将ESP32连接到WiFi网络,并将分配给它的本地IP地址打印出来。这个IP地址正是在前文所述Python代码中使用的地址。

有关如何将ESP32连接到WiFi网络的详细说明,请参阅此前的这篇帖子:ESP32 MicroPython教程:连接Wi-Fi网络(。

在setup函数的最后,通过调用WiFiServer对象的begin方法对TCP服务器进行初始化。该方法没有输入参数,返回值为空。

首先,通过调用WiFiServer对象的available方法对客户端连接进行监听。该方法会返回一个WiFiClient类(的对象。

请注意,我们目前仍然处于TCP客户端层次,尚未涉及websocket客户端。

接下来,为了确认TCP客户端是否已连接,需要在先前返回的WiFiClient对象上调用connected方法,如果客户端已连接,则该方法返回值为true,否则返回值为false。

我们还需要调用WebSocketServer对象(该对象是我们在代码一开始所声明的一个全局变量)的handshake方法,其输入参数是我们的WiFiClient对象,这个handshake方法(负责在底层完成协议握手。

Handshake方法会返回一个Boolean(布尔)值,表示握手是否成功,在进一步与客户端进行实际通信之前,应该对这个返回值进行验证(以确保握手成功)。

鉴于我们将使用非常简单的websocket回发服务器,因此只需要一个数据缓冲区,用于存放首次接收的客户端数据。在接下来的代码中,所有方法使用的参数都是字符串类型,与我们的缓冲区数据类型一致。

客户端随时可能断开,因为我们将使用一个while循环,只要客户端仍处于连接状态,这个循环就会持续运行。

在循环的每次迭代之间,需要加入一小段延时。这一点非常重要,如果没有延时,那么在收到最开始的几个字节之后,代码将会停止从客户端接收数据。

在循环内,我们通过webSocketServer对象的getData方法(接收数据。该方法不需要输入参数,返回String(字符串)输出,我们会把这个返回值赋值给之前定义的数据缓冲区。

通过调用WebSocketServer对象的sendData方法(可以将数据发送给客户端。该方法接收String(字符串)输入(该字符串的内容就是要发送给客户端的数据),返回值为空。

客户端有可能不发送任何数据,所以我们要先确认数据缓冲区的长度,并通过条件判断确定是否执行上述方法调用。数据缓冲区的长度应该大于0,这样我们才会把数据回发给客户端。

完整的Arduino循环函数如下所示。请注意,我们增加了当客户端从服务器断开时打印相关消息的额外代码,位于循环内判断客户端是否连接的相关代码之后。

最终的Arduino代码如下所示。您可以直接复制粘贴到自己的Arduino环境内。不要忘了在全局变量中改为你自己的WiFi网络认证信息。

使用你的Arduino IDE对代码进行编译并上传到ESP32开发板,即可对代码进行测试。然后,打开serial monitor(使用Serial.Begin函数中定义的波特率)。

连接到WiFi网络时,控制台会打印出ESP32的本地IP。Python程序中执行connect方法时使用的就是这个IP。

在Python程序中写入正确的IP并且连接ESP32之后,运行Python程序。发送到ESP32的消息全部被回发并打印到了Python控制台,如图1所示。

在所有消息发送完之后,Python客户端会从服务器断开。Arduino循环会检测到客户端已断开,因此在控制台上会打印出一条消息,说明客户端已经断开,如图3所示。

注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。

本文来自: 老铁博客,转载请保留出处!欢迎发表您的评论

相关标签:web程序

esp32 micropython web服务器_ESP32 Arduino教程:Websocket server(服务器)相关推荐

  1. 云服务器如何重新引导,重新启动server服务器

    SQL Server 系统数据库恢复 方法1:在配置管理器中,右键实例在启动参数中添加-m(注意是小写的m),重新启动服务,处理完之后记得把-m参数去除重新启动服务.方法2:在cmd中,使用net s ...

  2. 串口监视软件_ESP32 Arduino教程:软件重置

    简介 该esp32 arduino教程旨在解释如何使用Arduino核心在ESP32开发板上执行软件重置. 本ESP32教程的测试是使用集成在ESP32开发板中的DFRobot的ESP-WROOM-3 ...

  3. 华为虚拟机服务器怎么使用教程,虚拟机装服务器教程

    虚拟机装服务器教程 内容精选 换一换 应用容器化改造有三种方式,您可单击这里查看.本教程以某游戏为例,将该游戏进行微服务的架构改造,再进行容器化.本教程不对改造细节做深度讲解,仅讲解大致的建议.如需要 ...

  4. 联想服务器的系统安装教程视频教程,联想服务器装linux系统怎么安装教程

    联想服务器装linux系统怎么安装教程 [2021-02-11 17:09:22]  简介: 服务器 对于不会给电脑装系统的人,想学习Linux可在虚拟机上安装Linux操作系统进行学习,或者去找网页 ...

  5. 乌班图桌面版是否可作为服务器,Ubuntu Desktop变为Ubuntu Server服务器版的方法

    去Ubuntu官网看到有好几种版本可以下载,alternate(文本安装).desktop9(桌面).netbook(上网本).server(服务器). 使用server版某个理由: 32位的系统可以 ...

  6. linux mc服务器及forge,教程/架设Forge服务器

    该页面的内容不受Mojang AB.Minecraft Wiki与Minecraft论坛的官方支持. 1.6至现在 本教程是对使用Windows操作系统的用户所编写的,但是可能对于其他的操作系统(Ma ...

  7. 如何重装服务器的系统教程,如何重装服务器系统教程

    弹性云服务器 ECS 弹性云服务器(Elastic Cloud Server)是一种可随时自助获取.可弹性伸缩的云服务器,帮助用户打造可靠.安全.灵活.高效的应用环境,确保服务持久稳定运行,提升运维效 ...

  8. sql服务器时间不正确,SQL Server 服务器本地时间更改对SQL Server本身的影响

    你好, 针对你的问题,进行了一些测试供你参考: 1.日志文件编写或日志序列号混乱 LSN跟时间没有关系,改变时间后,LSN也没有出现混乱现象,关于LSN,你可以查看SQL Server 事务日志体系结 ...

  9. 腾讯云服务器网站搭建教程(太简单了)

    已经有了腾讯云服务器如何搭建网站?腾讯云服务器网以腾讯云服务器,借助宝塔面板搭建Web环境,然后使用WordPress博客程序搭建网站,大致分为三步,首先购买腾讯云服务器,然后在腾讯云服务器上部署宝塔 ...

最新文章

  1. 推荐7个最新发现的神仙网站,让人心动!
  2. Flask发送邮件,最基础
  3. 怎么调试EXC_BAD_ACCESS错误
  4. 如何解析json字符串及返回json数据到前端
  5. leetcode 27. 移除元素(双指针)
  6. 挖掘IP价值 天猫星选让明星直播1+1>2
  7. 用Node操作Firebird。
  8. Redis ,Memcached ,Mongodb 对比
  9. 怎么制作真人qq秀_NBA赛事最震撼的开场秀
  10. 微信公众平台源码分享,把你的生意做到微信里
  11. springboot中学成绩管理毕业设计源码100854
  12. NIOS II 烧写epcs总结
  13. 第五章-----Java数组及排序
  14. 红米Note9系列机型详细配置对比,Note9 4G\Note9 5G\Note9 Pro 5G
  15. wsl2 + ubuntu安装下载和一些安装推荐
  16. [QNX Hypervisor 2.2用户手册]10.4 vdev hpet
  17. 网易我的世界android苹果,我的世界Minecraft中国版官方网站——你想玩的,这里都有...
  18. 被骗进一个很隐蔽的外包公司,入职一个月才发现,已经有了社保记录,简历污了,以后面试有影响吗?...
  19. Apache Camel - 4 - Camel元素
  20. 刚参加完阿里面试:一面+二面+三面+HR四面,我的复盘经验总结

热门文章

  1. android/linux中的第一个init程序的启动
  2. ARM Trustzone的安全扩展介绍-精简版-思维导图
  3. 等待链表_调度(准备运行)链表
  4. 2020-11-10(service入门)
  5. 蓝队视角下的企业安全运营
  6. 【MySQL】 日 常 整 理 记 录 分 享
  7. 【YApi】 yapi docker-compose 部署
  8. 1.9 Java数组和字符串的相互转换
  9. 利用GitHub搭建博客自定义域名失效问题解决方法
  10. 【AC Saber】二进制