前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP8266 WiFi物联网智能插座—上位机和下位机通信协议

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

作者头像
不脱发的程序猿
发布2023-09-24 08:19:37
4190
发布2023-09-24 08:19:37
举报

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

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

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

1、配置节点协议

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

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

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

代码语言:javascript
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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
复制
// 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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、配置节点协议
  • 2、控制节点继电器开关协议
  • 3、节点周期上报数据协议
  • 4、升级节点协议
  • 5、重启节点
相关产品与服务
物联网
腾讯连连是腾讯云物联网全新商业品牌,它涵盖一站式物联网平台 IoT Explorer,连连官方微信小程序和配套的小程序 SDK、插件和开源 App,并整合腾讯云内优势产品能力,如大数据、音视频、AI等。同时,它打通腾讯系 C 端内容资源,如QQ音乐、微信支付、微保、微众银行、医疗健康等生态应用入口。提供覆盖“云-管-边-端”的物联网基础设施,面向“消费物联”和 “产业物联”两大赛道提供全方位的物联网产品和解决方案,助力企业高效实现数字化转型。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档