Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ESP8266 WiFi物联网智能插座—上位机和下位机通信协议

ESP8266 WiFi物联网智能插座—上位机和下位机通信协议

作者头像
不脱发的程序猿
发布于 2023-09-24 00:19:37
发布于 2023-09-24 00:19:37
60800
代码可运行
举报
运行总次数:0
代码可运行

本项目自定义了一套上位机和下位机通信协议,协议并不复杂,包含:配置节点、控制节点继电器开关、节点周期上报数据、升级节点和重启节点功能。

在讲解通信协议前,需要先了解下位机的4种运行模式,在不同的运行模式下,上位机可以对下位机有不同的功能权限,如下图所示:

  • 只有在运行模式下,上位机才可以切换到其他几种模式,其他模式无法执行切换模式操作。
  • 只有在运行模式下,上位机才可以控制继电器开关,其他模式无法控制继电器。

1、配置节点协议

配置节点是配置节点的ID、硬件版本、软件版本、出厂时间等信息,只有节点处于运行模式下发配置节点指令才有效。

配置节点前需要先下发指令将节点从运行模式到配置模式,默认上电后,节点处于运行模式,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi接收数据帧,控制切换模式
#pragma pack(1)
typedef struct receive_data_mode_t
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID3),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t switch_mode;        // 切换模式 0:运行模式,1:配置模式,2:节点升级,3:节点重启
    uint16_t crc;               // 校验位
}ReceiveData_Mode_t;
#pragma pack()

节点接收到切换模式指令,处理完成后,回复ACK响应,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi发送数据帧,节点响应状态
#pragma pack(1)
typedef struct send_state_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID2),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t state_id;           // 功能码+响应码(0:响应成功,1:响应失败)
    uint16_t crc;               // 校验位
}SendState_t;
#pragma pack()

此时,节点处于配置模式下,可以接收上位机下发的配置指令,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi接收数据帧,更新节点配置参数
#pragma pack(1)
typedef struct receive_config_t  
{
    uint8_t device_old_head;    // 数据帧头:0XA0+功能码(FUNCTION_ID4),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_old_id;     // 节点ID 0X0001~0XFFFE
	uint8_t device_config_type; // 0:默认配置,配置信息为后面的参数,1:恢复出厂设置,后面的参数均无效,可以为空
    uint8_t device_new_head;    // 需要更新的数据帧头
    uint16_t device_new_id;     // 需要更新的节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    char release_time[10];      // 出厂时间 2023-01-01
    uint16_t upload_cycle;      // 节点数据上传服务器周期时间,单位秒
    uint16_t sample_cycle;      // 节点采样周期时间(电参采样),单位毫秒
    char wifi_ssid[64];         // WiFi SSID
    char wifi_password[64];     // WiFi密码
    char server_ip[64];         // 服务器IP/网址
    uint16_t server_port;       // 服务器端口
    uint16_t crc;               // 校验位
}ReceiveConfig_t;
#pragma pack()

节点接收到配置指令,处理完成后,回复ACK响应,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi发送数据帧,节点响应状态
#pragma pack(1)
typedef struct send_state_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID2),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t state_id;           // 功能码+响应码(0:响应成功,1:响应失败)
    uint16_t crc;               // 校验位
}SendState_t;
#pragma pack()

2、控制节点继电器开关协议

上位机下发指令控制节点继电器开关,只有节点处于运行模式下发控制节点继电器开关指令才有效,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi接收数据帧,控制继电器
#pragma pack(1)
typedef struct receive_data_control_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID5),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t relay_state;        // 继电器开/关状态 0:继电器关闭,1:继电器开启
    uint16_t crc;               // 校验位
}ReceiveData_Control_t;
#pragma pack()

节点接收到控制继电器指令,处理完成后,回复ACK响应,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi发送数据帧,节点响应状态
#pragma pack(1)
typedef struct send_state_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID2),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t state_id;           // 功能码+响应码(0:响应成功,1:响应失败)
    uint16_t crc;               // 校验位
}SendState_t;
#pragma pack()

3、节点周期上报数据协议

节点处于运行模式会周期上报数据,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi发送数据帧,节点数据
#pragma pack(1)
typedef struct send_data_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID1),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    char release_time[10];      // 出厂时间 2023-01-01
    char run_time[12];          // 负载有效运行时间 时-分-秒:123456-01-01
    uint16_t upload_cycle;      // 节点数据上传服务器周期时间,单位秒
    uint16_t sample_cycle;      // 节点采样周期时间(电参采样),单位毫秒
    uint8_t relay_state;        // 继电器开/关状态 0:继电器关闭,1:继电器开启
    float voltage;              // 电压
    float current;              // 电流
    float power;                // 功率
    float electricity;          // 电量
    uint16_t crc;               // 校验位
}SendData_t;
#pragma pack()

上位机接收到周期上报数据协议不做响应。

4、升级节点协议

配置节点前需要先下发指令将节点从运行模式到升级模式,默认上电后,节点处于运行模式,协议如下所示:

 软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi接收数据帧,控制切换模式
#pragma pack(1)
typedef struct receive_data_mode_t
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID3),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t switch_mode;        // 切换模式 0:运行模式,1:配置模式,2:节点升级,3:节点重启
    uint16_t crc;               // 校验位
}ReceiveData_Mode_t;
#pragma pack()

节点接收到切换模式指令,回复ACK响应,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi发送数据帧,节点响应状态
#pragma pack(1)
typedef struct send_state_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID2),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t state_id;           // 功能码+响应码(0:响应成功,1:响应失败)
    uint16_t crc;               // 校验位
}SendState_t;
#pragma pack()

此时,节点处于升级模式下,可以接收上位机下发的升级指令,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi发送升级IP和端口
#pragma pack(1)
typedef struct send_updata_state_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID6),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    char updata_ip[64];         // 升级IP/网址
    uint16_t updata_port;       // 升级端口
    uint16_t crc;               // 校验位
}SendUpdata_t;
#pragma pack()

节点接收到升级指令,先回复ACK响应,然后跳转升级功能,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi发送数据帧,节点响应状态
#pragma pack(1)
typedef struct send_state_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID2),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t state_id;           // 功能码+响应码(0:响应成功,1:响应失败)
    uint16_t crc;               // 校验位
}SendState_t;
#pragma pack()

5、重启节点

重启节点前需要先下发指令将节点从运行模式到重启模式,默认上电后,节点处于运行模式,协议如下所示:

 软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi接收数据帧,控制切换模式
#pragma pack(1)
typedef struct receive_data_mode_t
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID3),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t switch_mode;        // 切换模式 0:运行模式,1:配置模式,2:节点升级,3:节点重启
    uint16_t crc;               // 校验位
}ReceiveData_Mode_t;
#pragma pack()

节点接收到切换模式指令,先回复ACK响应,然后就会重启,协议如下所示:

软件定义数据结构如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WiFi发送数据帧,节点响应状态
#pragma pack(1)
typedef struct send_state_t 
{
    uint8_t device_head;        // 数据帧头:0XA0+功能码(FUNCTION_ID2),A款产品智能插座
    uint16_t device_len;        // 数据包总长度
    uint16_t device_id;         // 节点ID 0X0001~0XFFFE
    char software_version[15];  // 软件版本 SMART_SW_A1_1.0 A款产品软件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款产品硬件1.0版本
    uint8_t state_id;           // 功能码+响应码(0:响应成功,1:响应失败)
    uint16_t crc;               // 校验位
}SendState_t;
#pragma pack()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ESP8266 WiFi物联网智能插座—下位机软件实现
开发环境使用Arduino IDE,IDE安装过程可参见:https://handsome-man.blog.csdn.net/article/details/121195905
不脱发的程序猿
2023/10/17
3950
ESP8266 WiFi物联网智能插座—下位机软件实现
嵌入式软件开发常用的关键字和运算符
volatile是一个特征修饰符,提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。
不脱发的程序猿
2023/12/04
2230
ESP8266 WiFi物联网智能插座—上位机软件实现
上位机主要作为下位机数据上传服务端以及节点调试的控制端,可以等效认为是专属版本调试工具。针对智能插座协议,对于下位机进行可视化监测和管理。 软件技术架构如下,主要为针对 Windows 的PC 端应用程序,采用WPF以及C# 实现功能开发,其中包含MVVM架构。
不脱发的程序猿
2024/05/26
1420
ESP8266 WiFi物联网智能插座—上位机软件实现
ESP8266 WiFi物联网智能插座—电能计量
WiFi物联网智能插座硬件设计的重点就是电能计量,为此单独写一篇博文讲解电量计量的设计方案和实现原理。
不脱发的程序猿
2023/09/23
2.4K0
ESP8266 WiFi物联网智能插座—电能计量
ESP8266 WiFi物联网智能插座—项目简介
物联网虽然能够使家居设备和系统实现自动化、智能化管理,但是依然需要依靠更为先进的终端插座作为根本保障,插座是所有家用电器需要使用的电源设备,插座的有序智能管理,对于实现智能家居设备的统一智能管理具有举足轻重的作用。无论是家庭生活,还是工业制造,插座在生活中的应用无所不在,当之无愧为电网与各用电设备之间的桥梁。 
不脱发的程序猿
2023/09/22
4730
ESP8266 WiFi物联网智能插座—项目简介
ESP8266 WiFi物联网智能插座—硬件功能
ESP8266 WiFi物联网智能插座的硬件功能主要包括两部分:控制器板和采集器板。
不脱发的程序猿
2023/09/22
9330
ESP8266 WiFi物联网智能插座—硬件功能
物联网中的ESP8266该这么用!
在学习物联网的过程中,大家首先想到的通信应该就是蓝牙和wifi了,而wifi中又属esp8266比较出名,包括esp32的快速崛起也离不开起本身内置wife和蓝牙,这个模块本身可以连接路由器,也可以作为热点让你的手机来连接他。 本文主要从以下几个方面来进行讲解:
秋名山码神
2023/11/03
1.9K0
物联网中的ESP8266该这么用!
HuskyLens人工智能摄像头
HuskyLens是一款简单易用的人工智能摄像头(视觉传感器),内置6种功能:人脸识别、物体追踪、物体识别、巡线追踪、颜色识别、标签(二维码)识别。仅需一个学习按键即可完成AI训练,摆脱繁琐的训练和复杂的视觉算法,让你更加专注于项目的构思和实现。
不脱发的程序猿
2021/01/20
1.4K1
zigbee物联网开发平台(工业物联网)
1.概述 鉴于ZigBee技术适合用于数据采集系统的的特点, 提出了基于ZigBee的数据采集系统的设计方案, 着重探讨ZigBee节点的硬件设计及其组网设计. 并详细讨论了基于CC2530芯片的数据采集节点的硬件设计方案, 组网设计中的协调器建立网络、节点加入网络的设计方法, 以及数据采集系统的软件设计方法. 最后通过采集ZigBee网络传感器数据的实验, 证明该方案能取得良好的通信效果. 1.1 系统描述 利用ZigBee传感器网络、网关、服务器实现简单的数据采集系统。项目中把使用了三种传感器,分别是:温湿度传感器,烟雾传感器,光敏传感器。终端节点传感器采集到数据之后发送给协调器之后,由协调器通过串口将数据发至给电脑客户端,最后电脑客户端将串口发送上来的传感器数据使用套接字封装成http格式后通过post方式发送到服务端,并且存储到数据库中。客户端通过访问服务器,获取数据展示出来。 1.2 系统结构介绍
全栈程序员站长
2022/07/25
9.7K1
zigbee物联网开发平台(工业物联网)
26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网
按下固件按钮(GPIO0)大约3S, 让GPIO2那个灯快闪,进入配网模式,然后60S超时检测.还有就是不让WIFI打印官方内部写的东西(打印的东西太多了...)
杨奉武
2019/08/30
1.7K1
26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网
【STM32H7的DSP教程】第10章 Matlab的WIFI通信实现
本章节主要为大家讲解Matlab的WIFI方式波形数据传输和后期数据分析功能,非常实用。
Simon223
2020/04/16
9990
【STM32F407的DSP教程】第10章 Matlab的WIFI通信实现
本章节主要为大家讲解Matlab的WIFI方式波形数据传输和后期数据分析功能,非常实用。
Simon223
2020/04/16
8350
ESP8266 SDK开发: 物联网篇-ESP8266连接MQTT服务器实现通信控制
https://www.cnblogs.com/yangfengwu/p/11762642.html
杨奉武
2020/03/25
4.5K0
ESP8266 SDK开发:  物联网篇-ESP8266连接MQTT服务器实现通信控制
基于STM32设计的智能插座+人体感应灯(ESP8266+人体感应+手机APP)
手机APP: 采用QT设计,程序支持跨平台编译运行(Android、IOS、Windows、Linux都可以编译运行,对应平台上QT的环境搭建,之前博客已经发了文章讲解)
DS小龙哥
2022/01/12
2.8K0
基于STM32设计的智能插座+人体感应灯(ESP8266+人体感应+手机APP)
esp8266架构_esp8266能做什么
    欢迎大家来到ESP8266的世界,从现在开始,笔者将带领大家慢慢揭开ESP8266神秘的面纱。
全栈程序员站长
2022/09/21
1.8K0
esp8266架构_esp8266能做什么
AIoT应用创新大赛-基于TencentOS Tiny的家庭安全监控系统
随着科技的发展与进步,人们家庭的智能设备和产品越来越多,接入电网的设备也会越来越多,量变导致质变,家庭设备总用电监控,能极大的帮助人们了解日常用电情况;
大白菜L
2022/03/15
1.7K1
AIoT应用创新大赛-基于TencentOS Tiny的家庭安全监控系统
物联网常见通信协议梳理
本文将对常用的通信协议进行剖析,重点面向市场上使用率较高的,且又不是诸如TCP/IP之类老生常谈 的。
木禾wen
2019/12/06
3.4K0
物联网常见通信协议梳理
WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块-A1-蓝牙和CAN总线透传通信(经典蓝牙从机)
杨奉武
2023/10/15
6870
WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块-A1-蓝牙和CAN总线透传通信(经典蓝牙从机)
【IoT迷你赛】从一场王者荣耀比赛诞生出的物联网浇花神器
7月25日晚,TEG王者荣耀大赛正式开打,首局比赛,“深圳湾一号业主”爆冷摧残了“祖国的花朵”。
two2winter
2019/08/28
9380
【IoT迷你赛】从一场王者荣耀比赛诞生出的物联网浇花神器
STM32+ESP8266+MQTT协议连接OneNet物联网平台
上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。
DS小龙哥
2022/01/10
6.1K0
STM32+ESP8266+MQTT协议连接OneNet物联网平台
推荐阅读
相关推荐
ESP8266 WiFi物联网智能插座—下位机软件实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文