Protocol 是一个基于 Rust 构建的多功能嵌入式通信平台,集成了多种网络协议、跨语言 FFI、图形界面和数据库 ORM 等技术。项目展示了 Rust 在系统编程、网络编程和跨平台集成等领域的强大能力。
核心定位: 工业物联网数据采集与协议转换、微信自动化运营、跨平台桌面应用开发、嵌入式设备管理平台
- TCP 服务器 - 支持文本和二进制协议,自定义编解码器
- WebSocket 服务器 - 实时双向通信,支持消息广播
- HTTP 服务器 - RESTful API,JWT 认证,CORS 支持
- 串口通信 - 支持串口数据采集和 HTTP 转发
- Java FFI - 通过 JNI 实现双向调用,支持回调机制
- C# FFI - 通过 P/Invoke 调用 Rust 动态库,支持函数指针回调
- egui 界面 - 即时模式 GUI,轻量级跨平台
- Tauri 界面 - 基于 Web 技术的桌面应用框架
- 混合 ORM - Ormlite + SQLx,兼顾易用性和灵活性
- 多数据库支持 - SQLite(默认)/ MySQL
- 通用分页 - 内置分页查询组件
- RBAC 权限模型 - 用户-角色-菜单三级权限控制
- JWT 认证 - 内存缓存 + JWT 双重验证
- 树形菜单 - 递归构建菜单树
- wcferry 集成 - 完整封装微信 PC 版 SDK
- 消息收发 - 文本、图片、文件等多种消息类型
- 联系人管理 - 获取联系人列表、查询好友
- 数据库查询 - 直接查询微信本地数据库
- 键盘模拟 - 跨平台键盘输入模拟
- Excel 导入导出 - 使用 calamine 处理 Excel 文件
- 过程宏 - 自动生成 CRUD 操作,减少重复代码
protocol/
├── admin/ # 后台管理服务 (HTTP/WebSocket)
│ ├── src/
│ │ ├── config/ # 配置管理(路由、日志、环境)
│ │ ├── control/ # 业务控制器
│ │ ├── entity/ # 数据实体(用户、角色、菜单等)
│ │ ├── service/ # 业务服务层
│ │ ├── wechat/ # 微信自动化模块
│ │ │ ├── entity/ # 微信业务实体
│ │ │ └── service/ # 微信业务服务
│ │ └── wcferry/ # wcferry SDK 封装
│ └── wechat/ # 微信 DLL 文件
├── server/ # 通信服务器 (TCP/WebSocket/FFI)
│ ├── src/
│ │ ├── config/ # 配置管理
│ │ ├── ffi/ # FFI 接口(Java/C#)
│ │ │ ├── ffi_java.rs # Java JNI 实现
│ │ │ └── ffi_cs.rs # C# P/Invoke 实现
│ │ ├── tcp/ # TCP 服务器
│ │ │ ├── tcp.rs # TCP 连接处理
│ │ │ └── codec.rs # 自定义编解码器
│ │ ├── websocket/ # WebSocket 服务器
│ │ ├── keyboard/ # 键盘模拟
│ │ └── lib.rs # 动态库导出
├── egui-ui/ # egui 图形界面
├── tauri-ui/ # Tauri 桌面应用
├── serial_port/ # 串口通信程序
├── macros/ # 过程宏(CRUD 生成)
├── config.toml # 主配置文件
└── database.db # SQLite 数据库
- tokio-tungstenite - WebSocket
- tokio-util - 编解码器
- jni - Java JNI
- windows-sys - Windows API
- serialport - 串口通信
- tracing - 日志记录
- anyhow - 错误处理
- calamine - Excel 处理
- jsonwebtoken - JWT 认证
- Rust 1.70+ (安装指南)
- Node.js 16+ (Tauri 需要)
- 操作系统: Windows / Linux / macOS
git clone https://github.com/yourusername/protocol.git
cd protocol编辑 config.toml,根据需要修改配置:
[http]
host = "0.0.0.0"
port = 8080
[tcp]
host = "0.0.0.0"
port = 9000
[database]
url = "sqlite://database.db"cargo run -p admin服务将启动在 http://localhost:8080
cargo run -p server- TCP 服务:
localhost:9000 - WebSocket 服务:
ws://localhost:9000/ws
# egui 界面
cargo run -p egui-ui
# Tauri 界面
cargo run -p tauri-uicargo run -p serial_port# Windows
cargo build --release -p server
# 输出文件: target/release/protocol.dll自定义二进制协议格式:
帧头(2B) 包序(1B) 设备类型(1B) 设备编号(1B) 消息类型(1B) 数据长度(1B) 数据(NB) 校验和(2B) 帧尾(2B)
0x55 0xAA ... ... ... 0x0D 0x0A
客户端连接(Python 示例):
import socket
# 连接 TCP 服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 9000))
# 发送消息
sock.sendall(b'Hello, Server!\n')
# 接收消息
data = sock.recv(1024)
print(f"Received: {data}")
sock.close()// 连接 WebSocket
const ws = new WebSocket('ws://localhost:9000/ws');
// 监听消息
ws.onmessage = (event) => {
console.log('Received:', event.data);
};
// 发送消息
ws.send('Hello, WebSocket!');Java 代码:
import com.test.Test;
public class Main {
public static void main(String[] args) {
// 加载动态库
System.loadLibrary("protocol");
Test test = new Test();
// 设置回调
test.native_set_callback(new Test.RCallback() {
@Override
public void onStateChanged(String state) {
System.out.println("收到 Rust 回调: " + state);
}
});
// 启动服务器
test.start_dll_server();
}
}using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("protocol.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void init_callback(MessageCallback callback);
[DllImport("protocol.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void startServer();
public delegate void MessageCallback(IntPtr message);
public static void OnMessage(IntPtr ptr)
{
string msg = Marshal.PtrToStringAnsi(ptr);
Console.WriteLine("收到消息: " + msg);
}
static void Main()
{
init_callback(OnMessage);
startServer();
}
}use admin::wcferry::WeChat;
// 初始化微信
let wechat = WeChat::new();
// 检查登录状态
if wechat.is_login().unwrap() {
// 获取自己的微信 ID
let wxid = wechat.get_self_wxid().unwrap();
println!("我的微信 ID: {}", wxid);
// 发送文本消息
wechat.send_text(wcf::TextMsg {
msg: "你好,这是来自 Rust 的消息!".to_string(),
receiver: "wxid_xxxx".to_string(),
..Default::default()
}).unwrap();
// 发送图片
wechat.send_image(wcf::PathMsg {
path: "/path/to/image.jpg".to_string(),
receiver: "wxid_xxxx".to_string(),
..Default::default()
}).unwrap();
}use admin::entity::SysUser;
use ormlite::model::Model;
// 插入用户
let user = SysUser {
user_name: Some("admin".to_string()),
password: Some("123456".to_string()),
name: Some("管理员".to_string()),
..Default::default()
};
user.insert(&mut *db).await?;
// 查询用户
let users = SysUser::select()
.fetch_all(&mut *db)
.await?;
// 分页查询
use admin::entity::{Page, PaginationOptions};
let page = user.page(
&pool,
PaginationOptions {
page_no: Some(1),
page_size: Some(10),
}
).await?;
println!("总数: {}", page.total_count);生成并查看 API 文档:
cargo doc --open欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 MIT 协议开源。
感谢以下开源项目:
如果这个项目对你有帮助,请给一个 ⭐️ Star!
Made with ❤️ by Protocol Team