OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7665|回复: 2

lora 发送kb级文件 的 python 实现

[复制链接]

221

主题

221

帖子

0

精华

高级会员

Rank: 4

积分
762
金钱
762
注册时间
2021-5-18
在线时间
28 小时
发表于 2021-6-9 10:59:39 | 显示全部楼层 |阅读模式
目标
    服务器向只具备 lora 通讯功能的装置发送更新文件,以免因为bug造成装置的失联。

难点
    lora 是远距离、低功耗、低带宽的传输方式,典型空中传播速度只有 1.2 kbps 或 2.4 kbps(即300byte/s),空速越高传播距离越短。并且,lora没有tcp/ip的3次握手、丢包重传机制,是非可靠通讯。文件一般是以千字节为单位的,必须要切分成多个小包传输,这中间存在包大小、时延设置、串口缓存等技术问题需要解决否则就会丢包。初步测试时,用12k的zip文件分包传输时,每包正常是235字节,发送间隔5秒,有 10/50 的包不足235字节(丢数了),中间涉及到 服务器-4g转lora网关-lora模块-python串口(pserial)-python主程序 5个环节,都有可能出问题。

问题排查
服务器-4g转lora网关   这个环节走的是移动互联网,协议tcp/ip,根据网关硬件的工作指示灯,与服务器的下发同时闪烁,应该不是堵点;
网关-lora模块 这个环节空速2.4kbps、每包最大240字节,测试发现发送间隔敏感,1秒、2秒都不能保证240字节发送完成,3秒比较合适,用串口测试工具测试模块接收正常;
lora模块-pserial库 这个环节经过了uart,调用的是pserial的 real_all(),timeout=5秒,发现收到的都是8字节一个的小数据包,改成read(240)后有20%包不完整。
     判断不是硬件问题,是pserial的调用方法不对,即不能一次读上百字节。

设计思路
服务端将文件按照小于240字节进行拆分,头部增加1个字节命令,尾部增加2个字节crc16;
服务端开始发送时首先发送一个字节的命令,模块据此判断接收开始;
终端python开辟bytearray用来缓存收到的字节,接收命令开始extend到bytearray中;
终端python在接收到空字节(pserial timeout时会返回空字节)判断是否超过服务器发送间隔(建议长一点,我设置的10秒),超过了认为接受结束;
终端将bytearray前n-2个字节(含1个字节命令)用来计算crc16,与最后两个字节对比,判断接受数据是否正确,正确则写入zip文件,然后解压执行更新。
规约结构

20201225180715751.png
原文链接:https://www.yunduoketang.com/article/kechengfenxiaoptynx.html

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

237

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1101
金钱
1101
注册时间
2019-5-6
在线时间
127 小时
发表于 2022-2-13 12:42:35 | 显示全部楼层
一步一个脚印
回复 支持 反对

使用道具 举报

7

主题

237

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1101
金钱
1101
注册时间
2019-5-6
在线时间
127 小时
发表于 2022-2-13 12:50:12 | 显示全部楼层
就是有点广告嫌疑
一步一个脚印
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 14:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表