Skip to content

by965738071/protocol

Repository files navigation

Protocol

一个功能强大的 Rust 嵌入式通信平台

Rust License

功能特性快速开始项目架构技术栈使用示例


📖 项目简介

Protocol 是一个基于 Rust 构建的多功能嵌入式通信平台,集成了多种网络协议、跨语言 FFI、图形界面和数据库 ORM 等技术。项目展示了 Rust 在系统编程、网络编程和跨平台集成等领域的强大能力。

核心定位: 工业物联网数据采集与协议转换、微信自动化运营、跨平台桌面应用开发、嵌入式设备管理平台


✨ 功能特性

🔌 多协议通信服务

  • TCP 服务器 - 支持文本和二进制协议,自定义编解码器
  • WebSocket 服务器 - 实时双向通信,支持消息广播
  • HTTP 服务器 - RESTful API,JWT 认证,CORS 支持
  • 串口通信 - 支持串口数据采集和 HTTP 转发

🔗 跨语言 FFI 集成

  • 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 数据库

🛠️ 技术栈

后端框架

  • Salvo - 现代化 Web 框架
  • Tokio - 异步运行时
  • hyper - 底层 HTTP 库

数据库 & ORM

  • SQLx - 异步 SQL 工具包
  • Ormlite - 声明式 ORM
  • SQLite / MySQL - 关系型数据库

网络通信

序列化 & 协议

  • serde - 序列化/反序列化
  • prost - Protocol Buffers

图形界面

  • egui - 即时模式 GUI
  • Tauri - 跨平台桌面应用框架

FFI & 跨平台

其他工具


🚀 快速开始

环境要求

  • 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-ui

启动串口程序

cargo run -p serial_port

编译动态库(供 Java/C# 调用)

# Windows
cargo build --release -p server

# 输出文件: target/release/protocol.dll

💡 使用示例

TCP 通信示例

自定义二进制协议格式:

帧头(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 通信示例

// 连接 WebSocket
const ws = new WebSocket('ws://localhost:9000/ws');

// 监听消息
ws.onmessage = (event) => {
    console.log('Received:', event.data);
};

// 发送消息
ws.send('Hello, WebSocket!');

Java FFI 调用示例

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();
    }
}

C# FFI 调用示例

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 文档

生成并查看 API 文档:

cargo doc --open

详细文档


🤝 贡献

欢迎提交 Issue 和 Pull Request!

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启 Pull Request

📄 开源协议

本项目采用 MIT 协议开源。


🙏 致谢

感谢以下开源项目:


如果这个项目对你有帮助,请给一个 ⭐️ Star!

Made with ❤️ by Protocol Team

About

rust

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages