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

手机如何做微商城网站设计进一步网站建设

手机如何做微商城网站设计,进一步网站建设,刚刚中国突然宣布,爱站网长尾关键词挖掘查询工具数据包解析是不同设备#xff08;如电脑、ESP32 等嵌入式设备#xff09;之间通信的核心环节。简单说#xff0c;就是把收到的 一串数据 翻译成双方都能理解的 具体信息#xff08;比如温度、湿度、命令等#xff09;。下面介绍几种常见的数据包格…数据包解析是不同设备如电脑、ESP32 等嵌入式设备之间通信的核心环节。简单说就是把收到的 一串数据 翻译成双方都能理解的 具体信息比如温度、湿度、命令等。下面介绍几种常见的数据包格式以及 Python 和 ESP32基于 Arduino 框架的解析代码尽量用通俗的语言解释。一、文本格式最容易理解文本格式的数据包由字符串组成人类可以直接看懂适合简单场景。常见的有CSV 格式和JSON 格式。1. CSV 格式逗号分隔值特点用逗号或其他符号分隔不同字段结构简单类似表格。 适用场景传感器批量数据如温度、湿度、时间、简单配置信息。 示例数据包25.6,60.2,202310011200温度 25.6℃湿度 60.2%时间 2023-10-01 12:00Python 解析代码 用内置的split函数分割字符串即可。 # 假设收到的CSV数据包 recv_data 25.6,60.2,202310011200# 解析步骤 fields recv_data.split(,) # 用逗号分割 if len(fields) 3: # 检查字段数量是否正确temperature float(fields[0])humidity float(fields[1])time fields[2]print(f温度{temperature}℃湿度{humidity}%时间{time}) else:print(数据格式错误) ESP32 解析代码 ESP32 通过串口 / 网络收到字符串后用strtok函数分割类似 Python 的 split。 #include Arduino.hvoid setup() {Serial.begin(115200); // 初始化串口 }void loop() {if (Serial.available()) { // 检查是否有数据String recv_str Serial.readStringUntil(\n); // 读取一行数据假设以换行结束recv_str.trim(); // 去掉首尾空格和换行// 用逗号分割字符串char* data_ptr strtok((char*)recv_str.c_str(), ,); // 第一个字段float temperature, humidity;String time_str;int count 0;while (data_ptr ! NULL) {if (count 0) {temperature atof(data_ptr); // 转成浮点数温度} else if (count 1) {humidity atof(data_ptr); // 转成浮点数湿度} else if (count 2) {time_str String(data_ptr); // 时间字符串}data_ptr strtok(NULL, ,); // 下一个字段count;}if (count 3) { // 确认解析到3个字段Serial.printf(温度%.1f℃湿度%.1f%时间%s\n, temperature, humidity, time_str.c_str());} else {Serial.println(CSV格式错误);}} } 2. JSON 格式键值对结构特点用{键:值}的结构表示数据支持嵌套比如数组、对象适合复杂数据。 适用场景API 接口、带层级的配置信息如 设备信息 传感器数据。 示例数据包{device_id:esp32_01,data:{temp:25.6,hum:60.2},time:202310011200}Python 解析代码 用内置的json模块直接转成字典方便取值。 import json# 假设收到的JSON数据包 recv_data {device_id:esp32_01,data:{temp:25.6,hum:60.2},time:202310011200}try:# 解析JSON字符串为字典data_dict json.loads(recv_data)# 提取数据device_id data_dict[device_id]temp data_dict[data][temp]hum data_dict[data][hum]time data_dict[time]print(f设备{device_id}温度{temp}℃湿度{hum}%时间{time}) except json.JSONDecodeError:print(JSON格式错误) except KeyError as e:print(f缺少字段{e}) ESP32 解析代码 需要用ArduinoJson库需在 Arduino 库管理器中安装处理 JSON 结构。 #include Arduino.h #include ArduinoJson.h // 引入JSON库void setup() {Serial.begin(115200); }void loop() {if (Serial.available()) {String recv_str Serial.readStringUntil(\n);recv_str.trim();// 分配JSON缓冲区根据数据大小调整这里用1024字节StaticJsonDocument1024 doc;// 解析JSONDeserializationError error deserializeJson(doc, recv_str);if (error) { // 解析失败Serial.printf(JSON解析错误%s\n, error.c_str());return;}// 提取数据注意判断字段是否存在if (doc.containsKey(device_id) doc.containsKey(data) doc.containsKey(time)) {const char* device_id doc[device_id];float temp doc[data][temp];float hum doc[data][hum];const char* time_str doc[time];Serial.printf(设备%s温度%.1f℃湿度%.1f%时间%s\n, device_id, temp, hum, time_str);} else {Serial.println(JSON缺少必要字段);}} } 二、二进制格式更高效文本格式虽然易读但占空间大比如数字 25.6 要占 4 个字符传输效率低。二进制格式直接用字节存储数据比如 25.6℃可以用 2 个字节存储更适合嵌入式设备如 ESP32之间的高速通信。常见的有固定长度格式和TLV 格式。1. 固定长度格式特点每个字段的长度固定比如温度占 2 字节湿度占 2 字节解析时按固定位置取数据速度快。 适用场景实时性要求高的场景如传感器每秒传输一次数据。 示例数据包结构共 5 字节字段长度字节说明温度2用 int16_t 存储实际值 存储值 / 10比如 0x00FA250 → 25.0℃湿度2同上0x0258600 → 60.0%状态10 正常1 异常对应的二进制数据0x00 0xFA 0x02 0x58 0x00即温度 25.0℃湿度 60.0%状态正常Python 解析代码 用struct模块解析二进制数据需要知道每个字段的类型和顺序。 import struct# 假设收到的二进制数据5字节 recv_bytes b\x00\xFA\x02\x58\x00if len(recv_bytes) 5: # 检查长度是否正确# 解析2字节温度int16、2字节湿度int16、1字节状态uint8temp_raw, hum_raw, status struct.unpack(hhu, recv_bytes)# 转换为实际值除以10temperature temp_raw / 10.0humidity hum_raw / 10.0print(f温度{temperature}℃湿度{humidity}%状态{正常 if status 0 else 异常}) else:print(二进制数据长度错误) hhu表示大端模式hint16hint16uuint8ESP32 解析代码 直接操作字节数组按固定位置取数据。 #include Arduino.h// 定义数据包结构5字节 struct DataPacket {int16_t temp_raw; // 温度原始值2字节int16_t hum_raw; // 湿度原始值2字节uint8_t status; // 状态1字节 };void setup() {Serial.begin(115200); }void loop() {if (Serial.available() 5) { // 至少收到5字节uint8_t recv_buf[5];Serial.readBytes(recv_buf, 5); // 读取5字节到缓冲区// 解析数据大端模式高位字节在前DataPacket data;data.temp_raw (recv_buf[0] 8) | recv_buf[1]; // 第0-1字节 → 温度data.hum_raw (recv_buf[2] 8) | recv_buf[3]; // 第2-3字节 → 湿度data.status recv_buf[4]; // 第4字节 → 状态// 转换为实际值float temperature data.temp_raw / 10.0;float humidity data.hum_raw / 10.0;Serial.printf(温度%.1f℃湿度%.1f%状态%s\n,temperature, humidity, (data.status 0) ? 正常 : 异常);} } 2. TLV 格式Type-Length-Value特点每个字段由 类型Type 长度Length 值Value 组成字段数量和长度可以不固定灵活性高。 适用场景需要扩展的协议比如有时传温度有时传温度 湿度 电量。 示例数据包类型1 字节长度1 字节值n 字节说明0x010x020x00 0xFA温度25.0℃0x020x020x02 0x58湿度60.0%对应的二进制数据0x01 0x02 0x00 0xFA 0x02 0x02 0x02 0x58Python 解析代码 循环解析每个 TLV 单元先读类型再读长度再读对应的值。 def parse_tlv(data):parsed {}index 0while index len(data):if index 2 len(data): # 至少需要类型1长度1breaktype_ data[index] # 类型1字节length data[index 1] # 长度1字节index 2if index length len(data): # 检查值是否完整breakvalue data[index:index length] # 值length字节index length# 解析具体值根据类型转换if type_ 0x01: # 温度temp_raw (value[0] 8) | value[1]parsed[temperature] temp_raw / 10.0elif type_ 0x02: # 湿度hum_raw (value[0] 8) | value[1]parsed[humidity] hum_raw / 10.0return parsed# 假设收到的TLV二进制数据 recv_bytes bytes([0x01, 0x02, 0x00, 0xFA, 0x02, 0x02, 0x02, 0x58]) result parse_tlv(recv_bytes) print(f解析结果{result}) # 输出{temperature: 25.0, humidity: 60.0} ESP32 解析代码 同样循环读取每个 TLV 单元按类型处理值。 #include Arduino.hvoid parseTLV(uint8_t* data, int len) {int index 0;float temp -1, hum -1;while (index len) {if (index 2 len) break; // 不够类型长度的字节uint8_t type data[index];uint8_t length data[index 1];index 2;if (index length len) break; // 不够值的字节// 解析值根据类型if (type 0x01 length 2) { // 温度2字节int16_t raw (data[index] 8) | data[index 1];temp raw / 10.0;} else if (type 0x02 length 2) { // 湿度2字节int16_t raw (data[index] 8) | data[index 1];hum raw / 10.0;}index length;}// 打印结果if (temp ! -1) Serial.printf(温度%.1f℃ , temp);if (hum ! -1) Serial.printf(湿度%.1f% , hum);Serial.println(); }void setup() {Serial.begin(115200); }void loop() {// 假设收到8字节TLV数据if (Serial.available() 8) {uint8_t recv_buf[8];Serial.readBytes(recv_buf, 8);parseTLV(recv_buf, 8);} } 三、自定义格式最灵活适合嵌入式实际项目中常自定义格式结合文本或二进制并加入帧头、帧尾、校验位防止数据错乱。比如格式定义帧头0xAA 数据长度1字节 数据内容 校验和1字节 帧尾0x55帧头 / 帧尾标记数据包的开始和结束比如 0xAA 开始0x55 结束。数据长度告诉接收方 数据内容 有多少字节方便解析。校验和所有数据字节的和取低 8 位用于检查数据是否传输错误。示例数据包数据内容是温度 25.0℃即 0x00FA 0xAA 0x02 0x00 0xFA 0xFA 0x55帧头0xAA数据长度0x02数据内容占 2 字节数据内容0x00 0xFA温度原始值校验和0x00 0xFA 0xFA帧尾0x55Python 解析代码 先找帧头再验证帧尾和校验和最后解析数据。 def parse_custom(data):index 0while index len(data):# 找帧头0xAAif data[index] ! 0xAA:index 1continue# 检查是否有足够的字节帧头长度校验帧尾至少4字节if index 4 len(data):breaklength data[index 1] # 数据长度# 检查总长度是否足够帧头长度数据校验帧尾total_len 2 length 1 1 # 2帧头长度1校验1帧尾if index total_len len(data):index 1continue# 提取数据内容content data[index 2 : index 2 length]# 提取校验和checksum data[index 2 length]# 提取帧尾tail data[index 2 length 1]# 验证帧尾和校验和if tail ! 0x55:index 1continue# 计算校验和数据内容的和calc_checksum sum(content) 0xFFif calc_checksum ! checksum:index 1continue# 解析数据内容这里是温度if length 2:temp_raw (content[0] 8) | content[1]temperature temp_raw / 10.0print(f解析成功温度{temperature}℃)# 移动到下一个数据包index total_lenreturn# 假设收到的自定义格式数据 recv_bytes bytes([0xAA, 0x02, 0x00, 0xFA, 0xFA, 0x55]) parse_custom(recv_bytes) # 输出解析成功温度25.0℃ ESP32 解析代码 逻辑和 Python 类似先找帧头再验证校验和和帧尾。 #include Arduino.hvoid parseCustom(uint8_t* data, int len) {int index 0;while (index len) {// 找帧头0xAAif (data[index] ! 0xAA) {index;continue;}// 检查最小长度帧头长度校验帧尾4字节if (index 4 len) break;uint8_t length data[index 1]; // 数据长度uint16_t total_len 2 length 1 1; // 总长度// 检查总长度是否足够if (index total_len len) {index;continue;}// 提取各部分uint8_t* content data[index 2]; // 数据内容uint8_t checksum data[index 2 length]; // 校验和uint8_t tail data[index 2 length 1]; // 帧尾// 验证帧尾if (tail ! 0x55) {index;continue;}// 计算校验和uint8_t calc_checksum 0;for (int i 0; i length; i) {calc_checksum content[i];}if (calc_checksum ! checksum) {index;continue;}// 解析数据温度if (length 2) {int16_t temp_raw (content[0] 8) | content[1];float temperature temp_raw / 10.0;Serial.printf(解析成功温度%.1f℃\n, temperature);}// 移动到下一个数据包index total_len;} }void setup() {Serial.begin(115200); }void loop() {// 假设收到6字节自定义数据if (Serial.available() 6) {uint8_t recv_buf[6];Serial.readBytes(recv_buf, 6);parseCustom(recv_buf, 6);} } 总结如何选择格式简单场景少量数据需要人看懂用 CSV 或 JSON。实时性高、数据量大如传感器每秒 10 次传输用固定长度二进制。需要灵活扩展字段不固定用 TLV。嵌入式设备通信怕数据错乱用带帧头、校验的自定义格式。核心原则在 易读性 和 效率 / 可靠性 之间找平衡。
http://www.zqtcl.cn/news/637797/

相关文章:

  • 做面包的公司网站alexa世界排名查询
  • 网站备案后下一步做什么263邮箱注册
  • 燕郊网站制作廊坊网站制作网站
  • 开网站建设网站如何做excel预览
  • p2p网站建设方案电商企业有哪些
  • 建设农场网站天元建设集团有限公司法定代表人
  • 论坛网站建设价格百度广告官网
  • 网站开发有哪些语言ps做登录网站
  • 网站怎么做百度关键字搜索国外服务器做网站不能访问
  • 如何选择品牌网站建设做网站容易吧
  • 广州建网站比较有名的公司提升学历英语翻译
  • php网站开发视频教程厦门网站建设公司首选乐振
  • 网站推广项目微信小程序登陆入口
  • 建设部监理协会网站微信公众平台开发微网站
  • 莆田cms建站模板现在可以做网站么
  • windows 建网站湖北省最新消息今天
  • 手机商场网站制作在线看网站源码
  • 云南建设厅网站房地产开发资质做哪一类网站能赚钱
  • 佛山优化网站关键词创作者服务平台
  • python做网站多少钱超级商城系统
  • 网站开发pc端和手机端长沙专业个人做网站哪家好
  • 永州网站建设收费标准天长网站开发
  • 做网站分辨率多少钱装修公司10强排名
  • 营销网站建设818gx在南宁做家教兼职的网站
  • 做杂志模板下载网站网站开发产品经理招聘
  • 深圳网站创建公司小程序代理怎么样
  • 所以免费爱做网站营销网站优化推广
  • 莆田网站制作设计东莞营销专业网站建设
  • joomla建站教程北京做网站ezhixi
  • 自己可以做拼单网站吗建设企业网站有哪些