当前位置: 首页 > news >正文

nodemcu32s 和 mini D1 组局域网并用 webSocket 通信

在这里插入图片描述

实现思路

使用 mini D1 来搭建一个 webSocket 服务,然后使用 nodemcu32 连接,然后就可以进行通信了。

服务端代码(mini D1)

在代码中主要是需要控制好 loop 函数中的延时,也就是最后一行代码 delay,如果太快了板子处理不过来反而会导致实时性很差。设置到 50100 就差不多。

#include <WiFiClient.h>       
#include <WebSocketsServer.h> 
#include <Arduino_JSON.h>// socket 服务
WebSocketsServer webSocket = WebSocketsServer(81);
#define USE_SERIAL Serial// 收到消息后的处理函数
void msg_cb(uint8_t* payload) {// 解析字符串 jsonJSONVar infosObj = JSON.parse((char*)payload);  // 将 payload 转换为 char* if (JSON.typeof(infosObj) == "undefined") {return;}if (infosObj.hasOwnProperty("dj_deg")) {Serial.println((int)infosObj["dj_deg"]);}
}void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) {switch (type) {case WStype_DISCONNECTED:USE_SERIAL.printf("[%u] Disconnected!\n", num);break;case WStype_CONNECTED:{IPAddress ip = webSocket.remoteIP(num);USE_SERIAL.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);// send message to clientwebSocket.sendTXT(num, "Connected");}break;case WStype_TEXT:msg_cb(payload);// send message to client// webSocket.sendTXT(num, "message here");// send data to all connected clients// webSocket.broadcastTXT("message here");break;case WStype_BIN:USE_SERIAL.printf("[%u] get binary length: %u\n", num, length);hexdump(payload, length);// send message to client// webSocket.sendBIN(num, payload, length);break;}
}void setup() {Serial.begin(115200);  WiFi.mode(WIFI_AP);                // 将WiFi模式设为APWiFi.softAP("xmio", "12345678");  // 开启热点Serial.println("");IPAddress ip = WiFi.softAPIP();String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);String httpUrl = "http://" + ipStr;Serial.println("AP IP:");Serial.println(ipStr);// 开启 scoket 服务webSocket.begin();webSocket.onEvent(webSocketEvent);
}
void loop() {webSocket.loop();delay(50);
}

客户端代码(nodemcu32s )

和服务端一样,这里的 loop 中也能太快, 50ms 就差不多。要想服务端处理得更快的话其实不使用 json 插件最好。


#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <WebSocketsClient.h>
#include <Wire.h>
#include <Arduino_JSON.h>WiFiMulti wifiMulti;
WebSocketsClient webSocket;
#define USE_SERIAL Serialconst String wifi_name = "xmio";
const String wifi_pwd = "12345678";
String wifi_ip = "";            // wifi ip
String ws_connected = "0";      // 已连接 "1"void hexdump(const void* mem, uint32_t len, uint8_t cols = 16) {const uint8_t* src = (const uint8_t*)mem;USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len);for (uint32_t i = 0; i < len; i++) {if (i % cols == 0) {USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i);}USE_SERIAL.printf("%02X ", *src);src++;}USE_SERIAL.printf("\n");
}// socket 监听服务
void webSocketEvent(WStype_t type, uint8_t* payload, size_t length) {switch (type) {case WStype_DISCONNECTED:USE_SERIAL.printf("[WSc] Disconnected!\n");ws_connected = "0";break;case WStype_CONNECTED:USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload);ws_connected = "1";// send message to server when Connected// webSocket.sendTXT("hello");break;case WStype_TEXT:USE_SERIAL.printf("[WSc] get text: %s\n", payload);// send message to server// webSocket.sendTXT("message here");break;case WStype_BIN:USE_SERIAL.printf("[WSc] get binary length: %u\n", length);hexdump(payload, length);// send data to server// webSocket.sendBIN(payload, length);break;case WStype_ERROR:case WStype_FRAGMENT_TEXT_START:case WStype_FRAGMENT_BIN_START:case WStype_FRAGMENT:case WStype_FRAGMENT_FIN:break;}
}void setup() { wifiMulti.addAP(wifi_name.c_str(), wifi_pwd.c_str()); while (wifiMulti.run() != WL_CONNECTED) {// 小车连接中...Serial.println("wifi connect ing...");delay(1000);}String ipAddress = WiFi.gatewayIP().toString();wifi_ip = ipAddress;Serial.println("wifi connected:");Serial.println(wifi_ip);webSocket.begin(wifi_ip, 81, "/");webSocket.onEvent(webSocketEvent);webSocket.setReconnectInterval(5000);
}
void loop(){if (ws_connected == "1") {// 发送一个字符串jsonJSONVar infos;infos["dj_deg"] = dj_deg;String jsonString = JSON.stringify(infos);webSocket.sendTXT(jsonString);}delay(50);
}

效果

47fcd8ea-1572-4c59-966f-20ec4b1cd2e0.gif

相关文章:

  • 代码随想录算法训练营day24|回溯理论基础、77.组合
  • C/S模型测试
  • 轻松上手Jupyter Notebook:数据分析与可视化的终极指南
  • Django——Admin站点(Python)
  • Linux:confluence8.5.9的部署(下载+安装+破ji)离线部署全流程
  • 网卡配置基础知识
  • 【面试】介绍一下HotSpot虚拟机
  • Jenkins常用插件与应用详解
  • Python中Web开发-Django框架
  • uni-app实现页面通信EventChannel
  • php反序列化学习(2)
  • 代码随想录算法训练营第三十四 |● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果
  • 前端开发:$nextTick()的使用及原理
  • Leetcode 105:从前序与中序遍历序列构造二叉树
  • 大数据中的电商数仓项目:探秘业务的核心
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • linux学习笔记
  • Python_网络编程
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Swift 中的尾递归和蹦床
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 分布式熔断降级平台aegis
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 后端_ThinkPHP5
  • 日剧·日综资源集合(建议收藏)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 小程序开发中的那些坑
  • 由插件封装引出的一丢丢思考
  • 进程与线程(三)——进程/线程间通信
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #ifdef 的技巧用法
  • (2)Java 简介
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (八)Spring源码解析:Spring MVC
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (十)T检验-第一部分
  • (十六)串口UART
  • (数据结构)顺序表的定义
  • .Net Core中Quartz的使用方法
  • .NET 通过系统影子账户实现权限维持
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET多线程执行函数
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /var/log/cvslog 太大
  • @component注解的分类
  • @selector(..)警告提示
  • @Transactional类内部访问失效原因详解
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [<死锁专题>]