二氧化碳物联监测系统调试问题汇总
服务器端
气象站ModBus TCP协议
- 时间:20211216
- 描述:气象站按照ModBus TCP协议向指定服务器ip+端口传输数据,需要在服务器上部署相关代码实现数据解析并存入数据库
- 首先考虑通过django直接解析,发现django资源基本难以持续监听,只能单次执行,持续监听成本高昂;
- 接着考虑配置Nginx监听端口,结果发现转发后仅仅只是换了个端口,数据还是TCP协议的数据,并且仍然没有办法进行解析;
- 后来查阅大量资料的之后突然领悟到既然服务器能处理HTTP请求,那用一个脚本直接拿到TCP数据后包装成HTTP请求,再发给服务器处理不就好了;
- 最后就采用了最笨的方法,考虑后台跑一个python脚本,持续监听指定端口,拿到TCP的数据之后包装成HTTP请求,再次转发给服务器,django部署一个URL和相应的视图处理HTTP请求中的数据,并利用django的API写入数据库中,基本满足需求;
- 随后测试过程中发现,一旦一个气象站连接网络后,通过TCP工具无法再向该端口发送数据,开始以为是TCP协议没有接受到1024个字节的数据,所以一直在等待,但通过TCP工具发送10个字节的数据发现socket能正常关闭。最后发现是气象站发送完数据后断开了立即重连,所以一直占用端口,形成阻塞,因此需要配置了socket的超时时间,一查代码发现确实默认不检测超时,因此把超时时间改为5s,问题解决。
数据库更改后Django执行迁移失败问题
- 时间:20220115
- 描述:在修改了Django中的模型后,需要执行迁移以修改数据库,但迁移过程报错,提示(1050, “Table ‘tb_content‘ already exists“)
- 首先需要了解Django生成迁移文件的逻辑,Django在迁移过程中会将当前APP已存的所有迁移文件组成为一个完整的模型,与model.py中撰写的模型进行对比,若发现不同,则将相应的修改生成为迁移文件。因此若迁移文件中存在重复定义,则无法生成迁移文件,会产生报错。
- 其次是需要了解Django在执行迁移时的逻辑,Django执行过的迁移文件相关信息会保存在django_migrations表单中,在执行迁移前,首先会查django_migrations表单,校验migrations目录下的迁移文件是否已经执行过,若未执行则会全部执行一遍,此操作是针对数据库而言的,因此若被执行的迁移文件内容与数据库已有内容冲突,则会报错,这也正是此问题的根本原因。
- 解决方案也很直观:
- 1、将model.py手动恢复为与当前数据库相同的状态,一般将新添加的条目删除即可;
- 2、将迁移文件手动恢复为与当前数据库相同的状态,一般将新生成的迁移文件删除即可;
- 3、运行生成迁移文件的命令,观察是否会有更改,无更改说明model.py与迁移文件匹配,有更改则重新校对1和2
- 4、执行python3 manage.py migrate carbon --fake,将现存的所有迁移文件标记为已执行过;
- 5、修改model.py按照所需目标修改,重新生成迁移文件并执行,此时不会报错,更改被成功应用于数据库中。
单片机端
Flash读写和NB发送数据冲突
- 时间:20211112(随意写的,记不清了)
- 描述:单片机端需要将NB发送的数据帧保存在本地FLASH中作为备份,防止无网络时丢数
- 首先单独测试了FLASH存储的功能和NB发送数据的功能,发现单独运行时均运行正常;
- 随后联合调试,发现NB发送数据之后flash有时能存储成功,有时不能,百思不得其解;
- 最后发现是在NB发送数据拼接字符串时,数组初始化时没有赋值为0,导致得到的字符串最后的末尾时而是0时而不是0,完全依内存当时的情况而定,最后对数据初始化时进行赋值,并在拼接完成后在末尾补0,问题解决。