ios蓝牙修复写配置
This commit is contained in:
21
.gitignore
vendored
21
.gitignore
vendored
@@ -20,7 +20,9 @@ build/
|
||||
gen/
|
||||
local.properties
|
||||
.gradle/
|
||||
.kotlin/
|
||||
captures/
|
||||
hs_err_pid*.log
|
||||
.idea/modules.xml
|
||||
.idea/workspace.xml
|
||||
|
||||
@@ -79,6 +81,25 @@ Debug/
|
||||
# ----------------------------------------------------------------------------
|
||||
lib/generated_plugin_registrant.dart
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Node.js 依赖目录(前端/工具链产物,不需要提交)
|
||||
# ----------------------------------------------------------------------------
|
||||
node_modules/
|
||||
**/node_modules/
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# 日志与崩溃转储(本地调试产物,不需要提交)
|
||||
# ----------------------------------------------------------------------------
|
||||
flutter_*.log
|
||||
test_run.log
|
||||
*.log
|
||||
.sentry-native/
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Office 临时锁文件(Word/Excel 打开时生成,不需要提交)
|
||||
# ----------------------------------------------------------------------------
|
||||
~$*
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# 编辑器与系统文件
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
Binary file not shown.
52
build_patch.bat
Normal file
52
build_patch.bat
Normal file
@@ -0,0 +1,52 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
echo ============================================
|
||||
echo Re Build Patch
|
||||
echo ============================================
|
||||
echo.
|
||||
|
||||
set PATCH_VERSION=1.0.2
|
||||
set TARGET_VERSION_CODE=1
|
||||
|
||||
echo [1/3] Building Release APK ...
|
||||
echo.
|
||||
call flutter build apk --release
|
||||
if %errorlevel% neq 0 (
|
||||
echo.
|
||||
echo APK build failed!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo.
|
||||
echo APK build done
|
||||
echo.
|
||||
|
||||
echo [2/3] Generating patch ...
|
||||
echo.
|
||||
call dart run flutter_patcher:pack ^
|
||||
--apk build/app/outputs/flutter-apk/app-release.apk ^
|
||||
--version %PATCH_VERSION% ^
|
||||
--target-version-code %TARGET_VERSION_CODE%
|
||||
if %errorlevel% neq 0 (
|
||||
echo.
|
||||
echo Patch generation failed!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo.
|
||||
echo Patch generation done
|
||||
echo.
|
||||
|
||||
echo [3/3] Output:
|
||||
echo.
|
||||
echo APK: build\app\outputs\flutter-apk\app-release.apk
|
||||
echo Patch: dist\libapp.so
|
||||
echo Manifest: dist\manifest.json
|
||||
echo.
|
||||
echo ============================================
|
||||
echo Next: Upload dist\libapp.so to server
|
||||
echo ============================================
|
||||
echo.
|
||||
pause
|
||||
520
docs/SOP_使用文档.md
Normal file
520
docs/SOP_使用文档.md
Normal file
@@ -0,0 +1,520 @@
|
||||
# 迈步 Satabot App 使用说明书
|
||||
|
||||
> 版本:1.0.0 | 适用对象:终端用户(运维人员)
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
1. [应用简介](#1-应用简介)
|
||||
2. [安装与登录](#2-安装与登录)
|
||||
3. [首页](#3-首页)
|
||||
4. [设备管理](#4-设备管理)
|
||||
5. [机器人控制](#5-机器人控制)
|
||||
6. [无人机巡检](#6-无人机巡检)
|
||||
7. [告警中心](#7-告警中心)
|
||||
8. [工单管理](#8-工单管理)
|
||||
9. [问题上报](#9-问题上报)
|
||||
10. [我的](#10-我的)
|
||||
11. [蓝牙设备绑定](#11-蓝牙设备绑定)
|
||||
12. [常见问题](#12-常见问题)
|
||||
|
||||
---
|
||||
|
||||
## 1. 应用概述
|
||||
|
||||
### 1.1 产品简介
|
||||
|
||||
迈步 Satabot 是一款面向光伏电站的智能管理移动应用,为电站运维人员提供一站式的设备监控、远程控制、告警处理和工单管理能力。通过本 App,运维人员可以随时随地掌握电站运行状况,快速响应设备异常,提升运维效率。
|
||||
|
||||
### 1.2 适用人群
|
||||
|
||||
| 角色 | 说明 |
|
||||
|------|------|
|
||||
| 电站运维人员 | 日常巡检、设备监控、告警处理、工单执行 |
|
||||
| 设备管理人员 | 设备绑定、参数配置、运行状态查看 |
|
||||
| 管理人员 | 电站发电数据查看、工单统计 |
|
||||
|
||||
### 1.3 核心功能
|
||||
|
||||
| 功能模块 | 说明 |
|
||||
|---------|------|
|
||||
| 首页 | 电站发电概览、实时功率、设备统计、快捷入口 |
|
||||
| 设备管理 | 设备列表、分类筛选、搜索、蓝牙扫描、设备详情 |
|
||||
| 机器人控制 | 远程方向控制、任务管理、运行参数设置 |
|
||||
| 无人机巡检 | 机场状态、实时监控、视频直播、飞行任务管理 |
|
||||
| 告警中心 | 告警统计、告警处理、派发工单、AI 诊断 |
|
||||
| 工单管理 | 工单全流程(新建→执行→完成/挂起/转派) |
|
||||
| 问题上报 | 问题类型选择、媒体上传、设备关联 |
|
||||
| 个人中心 | 个人信息、系统设置、夜间模式、导航自定义 |
|
||||
|
||||
### 1.4 设备类型
|
||||
|
||||
本 App 管理以下类型的设备:
|
||||
|
||||
| 设备类型 | 说明 |
|
||||
|---------|------|
|
||||
| 光伏逆变器 | 将直流电转换为交流电的核心设备 |
|
||||
| 汇流箱 | 汇集多个光伏组件的直流电 |
|
||||
| 光伏组件 | 将太阳能转化为直流电的组件 |
|
||||
| 监控设备 | 数据采集与传输设备 |
|
||||
| 清洁除草机器人 | MC700 系列,光伏面板清洁除草机器人 |
|
||||
| 无人机机场 | 无人机自动机巢,含无人机巡检 |
|
||||
|
||||
### 1.5 底部导航栏
|
||||
|
||||
App 底部有以下功能页签,可在"我的 → 底部导航设置"中自定义显示和排序:
|
||||
|
||||
| 页签 | 名称 | 说明 |
|
||||
|------|------|------|
|
||||
| 首页 | 电站概览 | 发电数据、设备统计、快捷入口 |
|
||||
| 设备 | 设备管理 | 设备列表、机器人、无人机 |
|
||||
| 告警 | 告警中心 | 查看和处理设备告警 |
|
||||
| 工单 | 工单管理 | 工单全流程管理 |
|
||||
| 上报 | 问题上报 | 上报设备问题 |
|
||||
| 我的 | 个人中心 | 个人信息、系统设置 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 安装与登录
|
||||
|
||||
### 2.1 安装
|
||||
|
||||
- **Android**:扫描二维码下载 APK 安装
|
||||
- **iOS**:扫描二维码跳转 App Store 安装
|
||||
- 安装时如提示"未知来源",请在手机设置中允许安装
|
||||
|
||||
### 2.2 登录
|
||||
|
||||
1. 打开 App,进入登录页面
|
||||
2. 输入**用户名**和**密码**
|
||||
3. 勾选"已阅读并同意用户协议"
|
||||
4. 点击**登录**按钮
|
||||
5. 登录成功后自动跳转到首页
|
||||
|
||||
> **提示**:如果忘记密码,请联系管理员重置。
|
||||
|
||||
### 2.3 注册
|
||||
|
||||
1. 在登录页面点击**注册账号**
|
||||
2. 填写用户名、密码等信息
|
||||
3. 提交后等待管理员审核
|
||||
|
||||
### 2.4 修改密码
|
||||
|
||||
1. 登录后进入"我的"页面
|
||||
2. 点击"修改密码"
|
||||
3. 输入旧密码和新密码
|
||||
4. 提交完成修改
|
||||
|
||||
---
|
||||
|
||||
## 3. 首页
|
||||
|
||||
### 3.1 页面说明
|
||||
|
||||
首页展示当前选中电站的整体运行情况。
|
||||
|
||||
### 3.2 切换电站
|
||||
|
||||
- 页面顶部左侧显示当前电站名称
|
||||
- 点击电站名称可下拉切换其他电站
|
||||
- 切换后所有数据自动刷新
|
||||
|
||||
### 3.3 功能区域
|
||||
|
||||
| 区域 | 说明 |
|
||||
|------|------|
|
||||
| 天气信息 | 显示电站所在地天气 |
|
||||
| 电站概览 | 装机容量、今日发电量等 |
|
||||
| 功率卡片 | 实时功率、今日累计发电量、功率趋势图 |
|
||||
| 统计网格 | 设备总数、在线数、离线数、异常数 |
|
||||
| 工单卡片 | 待处理工单数量,点击进入工单页 |
|
||||
| 快捷入口 | 设备管理、告警、工单等快速跳转 |
|
||||
| TCP 状态 | 右上角圆点显示通信连接状态(绿色=正常) |
|
||||
|
||||
### 3.4 下拉刷新
|
||||
|
||||
- 在首页任意位置**下拉**可刷新所有数据
|
||||
|
||||
---
|
||||
|
||||
## 4. 设备管理
|
||||
|
||||
### 4.1 进入设备页
|
||||
|
||||
点击底部导航栏的**设备**页签。
|
||||
|
||||
### 4.2 切换电站
|
||||
|
||||
- 页面顶部左侧可切换电站,切换后设备列表自动刷新
|
||||
|
||||
### 4.3 搜索设备
|
||||
|
||||
- 页面上方搜索框中输入设备名称
|
||||
- 点击搜索按钮或按确认键进行搜索
|
||||
|
||||
### 4.4 设备分类筛选
|
||||
|
||||
页面中部有设备类型筛选条:
|
||||
|
||||
| 筛选项 | 说明 |
|
||||
|--------|------|
|
||||
| 全部 | 显示所有设备 |
|
||||
| 逆变器 | 仅显示逆变器设备 |
|
||||
| 汇流箱 | 仅显示汇流箱设备 |
|
||||
| 组件 | 仅显示光伏组件 |
|
||||
| 监控 | 仅显示监控设备 |
|
||||
| 机器人 | 仅显示清洁除草机器人 |
|
||||
| 无人机机场 | 仅显示无人机机巢 |
|
||||
|
||||
### 4.5 添加设备
|
||||
|
||||
- 点击页面右上角 **+** 按钮
|
||||
- 可选择**扫一扫**(扫码绑定)或**蓝牙**(蓝牙搜索绑定)
|
||||
|
||||
### 4.6 蓝牙扫描
|
||||
|
||||
- 点击搜索框旁边的**蓝牙图标**
|
||||
- App 开始扫描附近蓝牙设备
|
||||
- 扫描结果中,名称为纯数字的设备(时间戳格式)自动**置顶**显示
|
||||
- 可在搜索框中输入关键词过滤设备
|
||||
- 点击设备可进入设备详情页
|
||||
|
||||
### 4.7 设备详情
|
||||
|
||||
点击设备列表中的设备,进入设备详情页:
|
||||
|
||||
- **光伏设备**:显示设备运行参数(功率、电压、电流、温度等)
|
||||
- **机器人**:进入机器人控制页(详见第 5 章)
|
||||
- **无人机机场**:进入机场详情页(详见第 6 章)
|
||||
|
||||
---
|
||||
|
||||
## 5. 机器人控制
|
||||
|
||||
### 5.1 进入方式
|
||||
|
||||
设备页 → 筛选"机器人" → 点击机器人设备
|
||||
|
||||
### 5.2 机器人详情页
|
||||
|
||||
| 区域 | 说明 |
|
||||
|------|------|
|
||||
| 设备信息卡 | 显示机器人名称、序列号、在线状态、电量 |
|
||||
| 状态栏 | 运行状态、工作模式、当前位置 |
|
||||
| 控制面板 | 方向控制(前进/后退/左转/右转/停止) |
|
||||
| 检查清单 | 任务执行前的检查项 |
|
||||
| 任务信息 | 当前任务详情 |
|
||||
| 操作按钮 | 启动任务、暂停、取消等 |
|
||||
|
||||
### 5.3 远程控制
|
||||
|
||||
1. 进入机器人详情页后,App 自动申请远程控制权限
|
||||
2. 获得权限后可使用控制面板上的方向按钮
|
||||
3. 点击**停止**按钮停止移动
|
||||
4. 退出页面时自动释放控制权限
|
||||
|
||||
### 5.4 任务管理
|
||||
|
||||
| 操作 | 说明 |
|
||||
|------|------|
|
||||
| 创建任务 | 设置工作区域参数后创建清洁任务 |
|
||||
| 启动任务 | 选择任务后点击启动 |
|
||||
| 暂停任务 | 执行中点击暂停 |
|
||||
| 恢复任务 | 暂停后点击恢复 |
|
||||
| 取消任务 | 取消当前任务 |
|
||||
|
||||
### 5.5 运行参数设置
|
||||
|
||||
1. 在机器人详情页点击设置图标
|
||||
2. 可调整运行参数(速度、切割高度等)
|
||||
3. 点击保存生效
|
||||
|
||||
---
|
||||
|
||||
## 6. 无人机巡检
|
||||
|
||||
### 6.1 进入方式
|
||||
|
||||
设备页 → 筛选"无人机机场" → 点击机场设备
|
||||
|
||||
### 6.2 机场详情页
|
||||
|
||||
| 信息 | 说明 |
|
||||
|------|------|
|
||||
| 机场状态 | 在线状态、仓内温度 |
|
||||
| 无人机状态 | 电量、位置、飞行状态 |
|
||||
| 视频监控 | 仓内监控画面 |
|
||||
|
||||
### 6.3 实时监控
|
||||
|
||||
- 点击"实时监控"进入无人机监控页
|
||||
- 显示无人机 OSD 数据:经纬度、高度、速度、电量、航向等
|
||||
|
||||
### 6.4 视频直播
|
||||
|
||||
1. 点击"视频直播"进入直播页面
|
||||
2. 可切换摄像头:广角 / 变焦 / 红外
|
||||
3. 支持画面全屏、方向控制
|
||||
|
||||
### 6.5 飞行任务
|
||||
|
||||
| 操作 | 说明 |
|
||||
|------|------|
|
||||
| 查看任务 | 查看已有飞行任务列表 |
|
||||
| 创建任务 | 选择航线、设置参数后创建 |
|
||||
| 执行任务 | 选择任务后点击执行 |
|
||||
| 暂停任务 | 飞行中可暂停 |
|
||||
| 返航 | 一键返航 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 告警中心
|
||||
|
||||
### 7.1 进入方式
|
||||
|
||||
点击底部导航栏的**告警**页签。
|
||||
|
||||
### 7.2 告警统计
|
||||
|
||||
- 页面上方显示告警数量统计卡片
|
||||
- 按状态分类:待处理、处理中、已处理、已关闭
|
||||
|
||||
### 7.3 告警列表
|
||||
|
||||
- 按状态 Tab 分类展示
|
||||
- 下拉刷新,上拉加载更多
|
||||
- 点击告警条目进入详情页
|
||||
|
||||
### 7.4 告警详情
|
||||
|
||||
| 信息 | 说明 |
|
||||
|------|------|
|
||||
| 告警信息 | 告警名称、级别、时间、设备 |
|
||||
| 告警详情 | 详细描述、可能原因 |
|
||||
| AI 诊断 | AI 辅助分析告警原因和建议 |
|
||||
|
||||
### 7.5 处理告警
|
||||
|
||||
1. 在告警详情页点击"处理"
|
||||
2. 选择处理方式(确认/关闭)
|
||||
3. 填写处理说明
|
||||
4. 提交完成处理
|
||||
|
||||
### 7.6 派发工单
|
||||
|
||||
1. 在告警详情页点击"派发工单"
|
||||
2. 选择工单模型
|
||||
3. 填写派发信息
|
||||
4. 提交后自动生成工单
|
||||
|
||||
---
|
||||
|
||||
## 8. 工单管理
|
||||
|
||||
### 8.1 进入方式
|
||||
|
||||
点击底部导航栏的**工单**页签。
|
||||
|
||||
### 8.2 工单统计
|
||||
|
||||
- 页面上方显示各状态工单数量统计
|
||||
- 点击数字可快速筛选对应状态的工单
|
||||
|
||||
### 8.3 工单列表
|
||||
|
||||
- 按状态 Tab 分类展示:待处理、处理中、已完成、已挂起
|
||||
- 下拉刷新,上拉加载更多
|
||||
- 点击工单条目进入详情页
|
||||
|
||||
### 8.4 工单详情
|
||||
|
||||
显示工单编号、类型、设备、描述、处理记录等信息。
|
||||
|
||||
### 8.5 工单操作
|
||||
|
||||
| 操作 | 说明 |
|
||||
|------|------|
|
||||
| 开始执行 | 接收工单后开始处理 |
|
||||
| 完成 | 处理完毕后标记完成 |
|
||||
| 挂起 | 暂时无法处理,挂起工单 |
|
||||
| 恢复 | 挂起的工单恢复处理 |
|
||||
| 转派 | 将工单转给其他人员 |
|
||||
|
||||
### 8.6 新建工单
|
||||
|
||||
1. 在工单页面点击"上报"按钮
|
||||
2. 选择工单类型
|
||||
3. 填写问题描述
|
||||
4. 关联设备
|
||||
5. 提交生成工单
|
||||
|
||||
---
|
||||
|
||||
## 9. 问题上报
|
||||
|
||||
### 9.1 进入方式
|
||||
|
||||
点击底部导航栏的**上报**页签。
|
||||
|
||||
### 9.2 上报流程
|
||||
|
||||
1. **选择上报类型**:故障 / 建议 / 投诉等
|
||||
2. **选择严重等级**:紧急 / 严重 / 一般 / 轻微
|
||||
3. **选择设备**:从设备列表中关联相关设备
|
||||
4. **上传媒体**:拍照、录像或选择图片/视频
|
||||
5. **填写描述**:文字描述问题详情
|
||||
6. 点击**提交**完成上报
|
||||
|
||||
### 9.3 媒体上传
|
||||
|
||||
- 点击拍照按钮直接拍照
|
||||
- 或从手机相册选择图片/视频
|
||||
- 点击已上传的媒体可预览大图/视频
|
||||
|
||||
---
|
||||
|
||||
## 10. 我的
|
||||
|
||||
### 10.1 进入方式
|
||||
|
||||
点击底部导航栏的**我的**页签。
|
||||
|
||||
### 10.2 功能列表
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| 用户信息卡 | 头像、昵称、联系方式,点击进入编辑页 |
|
||||
| 快捷操作 | 常用功能快速入口 |
|
||||
| 个人资料 | 修改昵称、头像等 |
|
||||
| 系统设置 | 夜间模式、语言切换、清除缓存 |
|
||||
| 底部导航设置 | 自定义底部 Tab 显示/隐藏和排序 |
|
||||
| 版本更新 | 检查并下载新版本 |
|
||||
| 退出登录 | 清除登录状态返回登录页 |
|
||||
|
||||
### 10.3 夜间模式
|
||||
|
||||
- 我的 → 系统设置 → 夜间模式开关
|
||||
- 开启后 App 切换为深色主题
|
||||
|
||||
### 10.4 底部导航设置
|
||||
|
||||
1. 我的 → 底部导航设置(或首页 → 设置入口)
|
||||
2. 可开关每个 Tab 的显示/隐藏
|
||||
3. 至少保留一个 Tab
|
||||
4. 可调整 Tab 排列顺序
|
||||
5. 设置即时生效
|
||||
|
||||
---
|
||||
|
||||
## 11. 蓝牙设备绑定
|
||||
|
||||
### 11.1 方式一:扫码绑定
|
||||
|
||||
1. 设备页 → 点击右上角 **+**
|
||||
2. 选择"扫一扫"
|
||||
3. 扫描设备上的二维码
|
||||
4. App 获取设备名称(如 `MC700AIR-CN-JS-1777272534998-0000000A-75`)
|
||||
5. 进入绑定页面
|
||||
6. 选择所属组织和场站
|
||||
7. 点击提交完成绑定
|
||||
|
||||
### 11.2 方式二:蓝牙搜索绑定
|
||||
|
||||
1. 设备页 → 点击搜索框旁的**蓝牙图标**
|
||||
2. App 扫描附近蓝牙设备
|
||||
3. 在搜索框输入关键词可过滤设备
|
||||
4. 蓝牙名为纯数字的设备(时间戳格式)自动置顶
|
||||
5. 点击目标设备进入设备详情页
|
||||
6. 点击**连接设备**按钮连接蓝牙
|
||||
7. 连接成功后,**绑定设备**按钮变为可点击状态
|
||||
8. 未连接时"绑定设备"按钮为灰色,不可点击
|
||||
9. 点击"绑定设备"
|
||||
- App 自动获取全部设备列表
|
||||
- 用蓝牙名(时间戳,如 `1777272534998`)匹配设备
|
||||
- 匹配成功后自动跳转到绑定页面
|
||||
10. 选择所属组织和场站
|
||||
11. 点击提交完成绑定
|
||||
|
||||
### 11.3 设备名说明
|
||||
|
||||
| 位置 | 名称示例 | 说明 |
|
||||
|------|---------|------|
|
||||
| 蓝牙广播名 | `1777272534998` | 纯数字时间戳 |
|
||||
| 设备完整名 | `MC700AIR-CN-JS-1777272534998-0000000A-75` | 设备序列号 |
|
||||
| 匹配方式 | 完整名包含蓝牙名 | 蓝牙名是完整名的一部分 |
|
||||
|
||||
---
|
||||
|
||||
## 12. 常见问题
|
||||
|
||||
### Q1:登录提示"登录失败"?
|
||||
|
||||
- 检查用户名和密码是否正确
|
||||
- 检查网络是否正常
|
||||
- 联系管理员确认账号是否已开通
|
||||
|
||||
### Q2:蓝牙扫描不到设备?
|
||||
|
||||
- 确认手机蓝牙已开启
|
||||
- 确认已授予 App 蓝牙权限和定位权限
|
||||
- 靠近设备后重试
|
||||
- 安卓手机需开启"位置信息"开关
|
||||
|
||||
### Q3:蓝牙连接失败?
|
||||
|
||||
- 确认设备已通电
|
||||
- 确认设备未被其他手机连接
|
||||
- 靠近设备重试
|
||||
- 重启手机蓝牙后重试
|
||||
|
||||
### Q4:绑定设备按钮灰色不可点击?
|
||||
|
||||
- "绑定设备"按钮需要**先连接蓝牙**后才能使用
|
||||
- 请先点击"连接设备"按钮,连接成功后按钮变为可点击
|
||||
|
||||
### Q5:点击绑定设备后提示"未匹配到设备"?
|
||||
|
||||
- 确认设备已录入后台系统
|
||||
- 联系管理员确认设备名中是否包含当前蓝牙名(时间戳)
|
||||
|
||||
### Q6:首页数据显示"加载失败"?
|
||||
|
||||
- 检查网络连接
|
||||
- 点击"重试"按钮
|
||||
- 确认当前账号有权限访问该电站
|
||||
|
||||
### Q7:机器人控制无反应?
|
||||
|
||||
- 确认机器人在线
|
||||
- 确认已获得远程控制权限
|
||||
- 确认机器人未在执行其他任务
|
||||
- 退出页面重新进入
|
||||
|
||||
### Q8:无人机视频不显示?
|
||||
|
||||
- 确认无人机和机场在线
|
||||
- 确认网络畅通
|
||||
- 尝试切换摄像头
|
||||
|
||||
### Q9:TCP 状态显示异常?
|
||||
|
||||
- 首页右上角圆点显示 TCP 连接状态
|
||||
- 红色表示未连接,绿色表示正常
|
||||
- 如持续异常,检查网络或联系管理员
|
||||
|
||||
### Q10:App 版本过旧无法使用?
|
||||
|
||||
- 进入"我的"→"版本更新"检查新版本
|
||||
- 下载并安装最新版本
|
||||
|
||||
---
|
||||
|
||||
## 联系与反馈
|
||||
|
||||
如遇到本说明书未涵盖的问题,请通过以下方式联系:
|
||||
|
||||
- **客服电话**:请联系管理员获取
|
||||
- **问题反馈**:App 内"上报"页面提交问题反馈
|
||||
- **技术支持**:请联系管理员获取联系方式
|
||||
@@ -33,6 +33,7 @@ class BleManager {
|
||||
StreamSubscription<List<int>>? _readSubscription;
|
||||
StreamSubscription<BluetoothAdapterState>? _adapterStateSubscription;
|
||||
StreamSubscription<BluetoothConnectionState>? _deviceConnectionSubscription;
|
||||
StreamSubscription<int>? _mtuSubscription;
|
||||
|
||||
/// 防止异步竞态:stopScan() 后 in-flight 的 startScan() 不应生效
|
||||
int _scanGen = 0;
|
||||
@@ -266,14 +267,8 @@ class BleManager {
|
||||
});
|
||||
_connectionController.add(device);
|
||||
await _discoverServices(device);
|
||||
// 确认协商后的 MTU
|
||||
try {
|
||||
final mtu = await device.requestMtu(512);
|
||||
_negotiatedMtu = mtu;
|
||||
developer.log('[BLE] MTU: $mtu', name: 'BleManager');
|
||||
} catch (e) {
|
||||
developer.log('[BLE] requestMtu failed: $e', name: 'BleManager');
|
||||
}
|
||||
// 确认协商后的 MTU(Android 主动请求;iOS 由 CoreBluetooth 自动协商)
|
||||
await _setupMtu(device);
|
||||
return null; // 成功
|
||||
} catch (e) {
|
||||
// 连接失败,清除连接中状态
|
||||
@@ -287,6 +282,49 @@ class BleManager {
|
||||
}
|
||||
}
|
||||
|
||||
/// 平台差异化的 MTU 协商
|
||||
/// - Android: 主动 requestMtu(512),一般协商到 247/517
|
||||
/// - iOS: CoreBluetooth 自动协商,requestMtu 会抛异常;读 mtuNow 并订阅 mtu 流
|
||||
Future<void> _setupMtu(BluetoothDevice device) async {
|
||||
if (Platform.isAndroid) {
|
||||
try {
|
||||
final mtu = await device.requestMtu(512);
|
||||
_negotiatedMtu = mtu;
|
||||
developer.log('[BLE] Android MTU negotiated: $mtu', name: 'BleManager');
|
||||
} catch (e) {
|
||||
developer.log('[BLE] requestMtu failed: $e', name: 'BleManager');
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (Platform.isIOS) {
|
||||
// iOS 上 connect 完成后系统会异步协商 MTU,稍等一拍再读取实际值
|
||||
try {
|
||||
await Future.delayed(const Duration(milliseconds: 300));
|
||||
final mtu = device.mtuNow;
|
||||
// iOS 保底 185(现代 iPhone CoreBluetooth 常见协商值),避免默认 23 把长帧切成 9 片
|
||||
_negotiatedMtu = mtu > 23 ? mtu : 185;
|
||||
developer.log(
|
||||
'[BLE] iOS MTU (auto-negotiated): mtuNow=$mtu, using=$_negotiatedMtu',
|
||||
name: 'BleManager',
|
||||
);
|
||||
// 订阅后续 MTU 变化(部分外设会在服务发现后再次协商)
|
||||
_mtuSubscription?.cancel();
|
||||
_mtuSubscription = device.mtu.listen((m) {
|
||||
if (m > 23 && m != _negotiatedMtu) {
|
||||
_negotiatedMtu = m;
|
||||
developer.log('[BLE] iOS MTU updated: $m', name: 'BleManager');
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
_negotiatedMtu = 185;
|
||||
developer.log(
|
||||
'[BLE] iOS MTU setup failed, fallback to 185: $e',
|
||||
name: 'BleManager',
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _onDeviceDisconnected() {
|
||||
_connectedDevice = null;
|
||||
_connectingDevice = null;
|
||||
@@ -295,6 +333,7 @@ class BleManager {
|
||||
_negotiatedMtu = 23;
|
||||
_readSubscription?.cancel();
|
||||
_deviceConnectionSubscription?.cancel();
|
||||
_mtuSubscription?.cancel();
|
||||
_connectionController.add(null);
|
||||
_connectingController.add(null);
|
||||
// 清空协议解析器缓冲区
|
||||
@@ -407,7 +446,7 @@ class BleManager {
|
||||
final totalChunks = (frame.length + maxWriteLen - 1) ~/ maxWriteLen;
|
||||
if (totalChunks > 1) {
|
||||
developer.log(
|
||||
'[BLE] 🔀 分${totalChunks}片写入 (MTU=$_negotiatedMtu, 每片≤${maxWriteLen}B)',
|
||||
'[BLE] 🔀 分${totalChunks}片写入 (platform=${Platform.isIOS ? "iOS" : "Android"}, MTU=$_negotiatedMtu, 每片≤${maxWriteLen}B)',
|
||||
name: 'BleManager',
|
||||
);
|
||||
}
|
||||
@@ -424,6 +463,13 @@ class BleManager {
|
||||
);
|
||||
}
|
||||
await char.write(chunk, withoutResponse: false);
|
||||
// iOS 分片间加小延时,给 MCU 侧协议解析器留出帧间处理时间,
|
||||
// 避免长帧(如 0x06 写配置 176B)被拆多片时因间隔过短触发丢帧
|
||||
if (Platform.isIOS &&
|
||||
totalChunks > 1 &&
|
||||
offset + maxWriteLen < frame.length) {
|
||||
await Future.delayed(const Duration(milliseconds: 20));
|
||||
}
|
||||
}
|
||||
developer.log('[BLE] ✅ 写入完成', name: 'BleManager');
|
||||
}
|
||||
@@ -442,6 +488,7 @@ class BleManager {
|
||||
_readSubscription?.cancel();
|
||||
_adapterStateSubscription?.cancel();
|
||||
_deviceConnectionSubscription?.cancel();
|
||||
_mtuSubscription?.cancel();
|
||||
_scanController.close();
|
||||
_packetController.close();
|
||||
_connectionController.close();
|
||||
|
||||
2
lib/core/env/env_config.dart
vendored
2
lib/core/env/env_config.dart
vendored
@@ -1,7 +1,7 @@
|
||||
class EnvConfig {
|
||||
static const String environment = String.fromEnvironment(
|
||||
'ENV',
|
||||
defaultValue: 'prod',
|
||||
defaultValue: 'test',
|
||||
);
|
||||
|
||||
static String get sentryDsn {
|
||||
|
||||
204
package-lock.json
generated
Normal file
204
package-lock.json
generated
Normal file
@@ -0,0 +1,204 @@
|
||||
{
|
||||
"name": "flutter-app-02",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"docx": "^9.7.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "25.9.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.5.tgz",
|
||||
"integrity": "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": ">=7.24.0 <7.24.7"
|
||||
}
|
||||
},
|
||||
"node_modules/core-util-is": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
|
||||
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/docx": {
|
||||
"version": "9.7.1",
|
||||
"resolved": "https://registry.npmjs.org/docx/-/docx-9.7.1.tgz",
|
||||
"integrity": "sha512-ilXFf9Moz47ABjFpDiA5s1w9lpb4EFSp7+5iiJSbfyYDM+bpZdAgLlSr7fW4aXhVe/E+F6QCv0EvRVFEd5CsWg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/node": "^25.2.3",
|
||||
"hash.js": "^1.1.7",
|
||||
"jszip": "^3.10.1",
|
||||
"nanoid": "^5.1.3",
|
||||
"xml": "^1.0.1",
|
||||
"xml-js": "^1.6.8"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/hash.js": {
|
||||
"version": "1.1.7",
|
||||
"resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
|
||||
"integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"inherits": "^2.0.3",
|
||||
"minimalistic-assert": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/immediate": {
|
||||
"version": "3.0.6",
|
||||
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
|
||||
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/jszip": {
|
||||
"version": "3.10.1",
|
||||
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
|
||||
"integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
|
||||
"license": "(MIT OR GPL-3.0-or-later)",
|
||||
"dependencies": {
|
||||
"lie": "~3.3.0",
|
||||
"pako": "~1.0.2",
|
||||
"readable-stream": "~2.3.6",
|
||||
"setimmediate": "^1.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/lie": {
|
||||
"version": "3.3.0",
|
||||
"resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
|
||||
"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"immediate": "~3.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/minimalistic-assert": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
|
||||
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "5.1.16",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.16.tgz",
|
||||
"integrity": "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"nanoid": "bin/nanoid.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18 || >=20"
|
||||
}
|
||||
},
|
||||
"node_modules/pako": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
|
||||
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
|
||||
"license": "(MIT AND Zlib)"
|
||||
},
|
||||
"node_modules/process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/readable-stream": {
|
||||
"version": "2.3.8",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
|
||||
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/sax": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
|
||||
"integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
|
||||
"license": "BlueOak-1.0.0",
|
||||
"engines": {
|
||||
"node": ">=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/setimmediate": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
|
||||
"integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "7.24.6",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
|
||||
"integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/xml": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
|
||||
"integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/xml-js": {
|
||||
"version": "1.6.11",
|
||||
"resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
|
||||
"integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"sax": "^1.2.4"
|
||||
},
|
||||
"bin": {
|
||||
"xml-js": "bin/cli.js"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
5
package.json
Normal file
5
package.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"docx": "^9.7.1"
|
||||
}
|
||||
}
|
||||
BIN
satabot-user-guide/_shared/fonts/Outfit-Bold.ttf
Normal file
BIN
satabot-user-guide/_shared/fonts/Outfit-Bold.ttf
Normal file
Binary file not shown.
93
satabot-user-guide/_shared/fonts/Outfit-OFL.txt
Normal file
93
satabot-user-guide/_shared/fonts/Outfit-OFL.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright 2021 The Outfit Project Authors (https://github.com/Outfitio/Outfit-Fonts)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
https://openfontlicense.org
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
BIN
satabot-user-guide/_shared/fonts/Outfit-Regular.ttf
Normal file
BIN
satabot-user-guide/_shared/fonts/Outfit-Regular.ttf
Normal file
Binary file not shown.
1200
satabot-user-guide/satabot-user-guide.html
Normal file
1200
satabot-user-guide/satabot-user-guide.html
Normal file
File diff suppressed because it is too large
Load Diff
@@ -7,6 +7,7 @@
|
||||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <agora_rtc_engine/agora_rtc_engine_plugin.h>
|
||||
#include <connectivity_plus/connectivity_plus_windows_plugin.h>
|
||||
#include <file_selector_windows/file_selector_windows.h>
|
||||
#include <flutter_blue_plus_winrt/flutter_blue_plus_plugin.h>
|
||||
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
|
||||
@@ -20,6 +21,8 @@
|
||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||
AgoraRtcEnginePluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("AgoraRtcEnginePlugin"));
|
||||
ConnectivityPlusWindowsPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
|
||||
FileSelectorWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FileSelectorWindows"));
|
||||
FlutterBluePlusPluginRegisterWithRegistrar(
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
agora_rtc_engine
|
||||
connectivity_plus
|
||||
file_selector_windows
|
||||
flutter_blue_plus_winrt
|
||||
flutter_webrtc
|
||||
|
||||
BIN
草坪作业规划APP功能使用手册.docx
Normal file
BIN
草坪作业规划APP功能使用手册.docx
Normal file
Binary file not shown.
BIN
草坪作业规划APP功能使用手册_v2.docx
Normal file
BIN
草坪作业规划APP功能使用手册_v2.docx
Normal file
Binary file not shown.
BIN
草坪作业规划APP功能使用手册_v3.docx
Normal file
BIN
草坪作业规划APP功能使用手册_v3.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user