基于openresty实现的文件推送功能,实现对客户端的监控和更新。基于openresty共享内存,http服务接受上传文件,由tcp服务推送文件至tcp客户端。
仓库代码: https://gitee.com/liudegui/cloud_edge_push
如果想用python写edge端代码(客户端),可以参考我的另一篇:cpp编写的tcp服务端,提供cpp和Python两个语言版本的tcp客户端,C++部分基于boost.asio网络库
- 云端(服务端): nginx+lua
- 边缘端(客户端):C++11/boost
- 交互过程
已实现功能
-
web客户端上传文件
-
支持从web客户端上传文件;
-
支持从web客户端查询已上传文件信息;
-
支持从web客户端推送指定已上传文件;
-
支持断点续传;
-
支持网页查看文件列表;
-
-
tcp客户端
- 支持不同类型tcp客户端同时启动,不限定个数;
- 将已下载的文件信息保存至file_infos.json,防止重复下载;
- 定时上报已下载文件信息数据至服务器;
- 支持断点续传;
- 支持http和https下载;
- 支持与服务器断链重连;
- 支持配置文件读取,(tcp客户端类型,服务器地址等)
环境安装(ubuntu)
-
服务端
- 参考https://github.com/stallion5632/apisix-nginx-module 编译openresty,openresty使用官方的1.19.9.1版本(https://openresty.org/download/openresty-1.19.9.1.tar.gz);
- 需安装nginx-upload-module[https://github.com/hongzhidao/nginx-upload-module] 模块实现文件断点续传,因而,configure脚本为:
./configure --add-module=../apisix-nginx-module/src/meta --add-module=../nginx-upload-module-master
-
客户端
- 依赖boost库1.66版本以上,cpr(cpr依赖curl);
- 使用gcc5.4以上版本;
-
程序运行方法
运行
-
服务端
-
运行服务方法 ./start.sh
-
http服务日志 logs/http.log,tcp服务日志logs/stream.log
-
查询数据库数据
- 查询某一个实例: localhost:9988/sys/v1/service_api?filename=libunqlite.so&type=client1
- 全部查询实例,去除参数: localhost:9988/sys/v1/service_api
-
-
客户端
直接运行./edge_client
http服务和tcp服务任务下发
- 使用内置的共享内存,http下发消息至tcp服务,然后推送至tcp客户端
tcp通讯协议:
消息 | 长度(BYTES) | 结构 | 描述 |
---|---|---|---|
Header | 4 | SyncBytes | 识别码,表示不同设备之间的交互 |
Header | 4 | FullMessageLength | 数据总长度,包括SyncBytes和FullMessageLength |
Header | 4 | MeaageType | 消息类型(消息号),如登录消息或发送消息消息 |
Header | 4 | StringBody | 消息字符流长度 |
Body | StringBodyLength | StringBody | 消息体长度,可能为0 |
Body | FullMessageLength - 16 - StringBodyLength | BinaryData | 二进制数据,长度可能为0 |
注: 消息头总共16个字节(包括SyncBytes和FullMessageLength),消息体长度StringBodyLength是已知的,而二进制数据长度计算得到(FullMessageLength - 16 - StringBodyLength)。
其它说明
大文件上传
1、openresty的nginx-upload-module模块实现大文件上传断点续传
https://github.com/hongzhidao/nginx-upload-module
2、nginx文件服务器的配置
可参考https://blog.csdn.net/weixin_37264997/article/details/106274690
最简单的文章: https://zhuanlan.zhihu.com/p/363794678
使用cpr使用http客户端
相关参考资料:
https://docs.libcpr.org/advanced-usage.html
https://github.com/libcpr/cpr
秘钥文件生成
https://www.zhyd.me/article/62
alias和root
一般情况下,在nginx配置中的良好习惯是:
1)在location / 中配置root目录
2)在location /somepath/ 中配置alias虚拟目录