# XTUploadSDK **Repository Path**: luoliwoai/xtupload-sdk ## Basic Information - **Project Name**: XTUploadSDK - **Description**: e-paper brush Image iOS demo - **Primary Language**: Objective-C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-31 - **Last Updated**: 2026-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README BrushSDK - iOS 电子纸设备刷图SDK

BrushSDK

iOS 电子纸设备刷图SDK - 支持NFC/蓝牙绑定、多算法抖点处理、Prism设备专属刷图

Objective-C iOS 13.0+ iOS

📑 目录

项目概述

BrushSDK 是一款专为 iOS 平台设计的电子纸设备刷图SDK,核心解决电子纸设备的绑定、图像预处理、刷图指令下发等核心问题。SDK 支持两种设备绑定方式(NFC/二维码蓝牙)、三种图像抖点算法(暖色调/冷色调/色阶)、普通设备/Prism设备差异化刷图流程,适配多种电子纸设备型号(包含单屏/双面桌牌、手机壳等设备)。

🚀 核心功能

🎨 特色功能

快速开始

1 系统要求

2 运行/复用 Demo 工程)

项目结构

BrushSDK/
│
├── Core/                    # 核心工具层(Demo 中核心逻辑封装)
│   ├── XTDeviceConfig.h/m   # 设备配置模型(存储/读取/判断设备信息)
│   ├── XTImageDitherUtils.h/m # 图像抖点处理工具(多算法转换)
│   ├── NFCHelper.h/m        # NFC通信核心(绑定/刷图/指令下发)
│   ├── XTBleWriteHelper.h/m # 蓝牙通信核心(绑定/刷图/设备扫描)
│   ├── UtilsMacros.h        # 全局宏定义(算法常量)
├── Controllers/             # 界面层(Demo 中可直接复用的业务页面)
│   ├── MainViewController.h/m # 设备管理主界面(绑定/刷图入口)
│   ├── PrismBrushController.h/m # Prism设备刷图页面
│   ├── BrushScreenController.h/m # 普通设备刷图预览(算法切换/指令下发)
├── Resources/               # 资源文件(Demo 中国际化/宏定义)
│   ├── Localizable.strings  # 国际化文案

    

核心API文档

1. XTDeviceConfig(设备配置模型)

// 导入头文件
#import "XTDeviceConfig.h"

// 读取本地缓存的设备配置
XTDeviceConfig *deviceConfig = [XTDeviceConfig readLocalCfg];

// 保存设备配置到本地缓存
[XTDeviceConfig saveLocalCfg:deviceConfig];

// 判断当前设备是否为 Prism 设备
BOOL isPrism = [XTDeviceConfig isPrismDevice];

// 判断是否为双面桌牌双面板(双屏)设备
BOOL isDoubleScreen = [deviceConfig isNameCardDevice];

// 判断是否为手机壳设备
BOOL isPhoneCase = [deviceConfig isPhoneCaseDevice];

// 判断非手机壳设备是否需要蓝牙传输
BOOL isBleTransfer = [deviceConfig isBluetoothTransferWhenNFCReading];

2. XTImageDitherUtils(图像抖点工具)

// 导入头文件
#import "XTImageDitherUtils.h"
#import "UtilsMacros.h" // 包含算法类型常量

// 图像抖点转换(生成设备可识别数据)
UIImage *originalImage = [UIImage imageNamed:@"test.png"];
UIImage *previewImage = nil;
NSData *imageData = [XTImageDitherUtils convertToUploadData:originalImage 
                                              previewImage:&previewImage 
                                                 deviceCfg:deviceConfig 
                                                   algType:ALG_TYPE_WARM];

// 生成上传数据数组(蓝牙刷图需要)
NSMutableArray *uploadDataArr = [XTImageDitherUtils getUploadDataFromDitherImage:previewImage 
                                                                      deviceCfg:deviceConfig];

3. NFCHelper(NFC 通信工具)

// 导入头文件
#import "NFCHelper.h"

// 获取NFC单例实例
NFCHelper *nfcHelper = [NFCHelper shareInstance];

// 读取 NFC 设备配置(绑定设备)
NSString *bindResult = [nfcHelper getDeviceConfig:@"请将设备贴近NFC区域" isNeedScanTip:YES];

// NFC 下发刷图指令(单屏设备/手机壳设备)
NSString *brushResult = [nfcHelper importImageToDevice:@"正在刷图..." 
                                            imageData:imageData 
                                            imageDataXT:uploadDataArr 
                                            screenCfg:deviceConfig 
                                            imageSectionNumber:0  // 单屏设备固定传0
                                                    pin:nil 
                                                PageSize:490 
                                            IntervalTime:50];

4. XTBleWriteHelper(蓝牙通信工具)

// 导入头文件
#import "XTBleWriteHelper.h"

// 获取蓝牙单例实例
XTBleWriteHelper *bleHelper = [XTBleWriteHelper shareInstance];

// 扫描指定 MAC 地址的蓝牙设备(绑定设备)
[bleHelper startScanWithTargetMac:@"设备MAC地址" completion:^(XTDeviceConfig *config, NSError *error) {
    if (!error) {
        // 绑定成功,保存配置
        [XTDeviceConfig saveLocalCfg:config];
    } else {
        NSLog(@"蓝牙绑定失败:%@", error.localizedDescription);
    }
}];

// 蓝牙下发刷图指令(单屏设备)
[bleHelper importImageDataToDeviceWithImageHexDataArr:uploadDataArr 
                                        deviceConfig:deviceConfig 
                                            sendSize:244  // 固定值244,手机壳设备可传490
                                       writeImageBlock:^(BOOL success, NSString *error) {
    if (success) {
        NSLog(@"蓝牙刷图成功");
    } else {
        NSLog(@"蓝牙刷图失败:%@", error);
    }
} advData:^(NSString *RSSI, NSString *power, NSString *version) {
    // 设备状态回调
    NSLog(@"信号强度:%@,功率:%@,版本:%@", RSSI, power, version);
}];

// 蓝牙下发刷图指令(双面板/双屏设备 - 专用API)
/**
 *  @brief 导入双面图像数据到设备(双面板写屏+刷屏操作)
 *  @param hexDataArrA A面图像数据的十六进制分包数组(已按指定大小拆分的数据包)
 *  @param hexDataArrB B面图像数据的十六进制分包数组(已按指定大小拆分的数据包)
 *  @param deviceConfig 写屏时的设备配置信息(用于校验与当前连接设备是否匹配)
 *  @param sendSize 每次发送的分包大小(需根据设备性能调整,建议244或490;490适用于手机壳设备)
 *  @param writeImageBlock 写图操作完成后的回调Block
 *  @param advData 蓝牙广播数据(RSSI/电量/版本)的回调Block
 */
[bleHelper importImageDataToDeviceWithImageHexDataArrA:hexDataArrA  // A面(左屏)数据
                                        hexDataArrB:hexDataArrB    // B面(右屏)数据
                                       deviceConfig:deviceConfig
                                           sendSize:244
                                    writeImageBlock:^(BOOL success, NSString *error) {
    if (success) {
        NSLog(@"双屏蓝牙刷图成功");
    } else {
        NSLog(@"双屏蓝牙刷图失败:%@", error);
    }
} advData:^(NSString *RSSI, NSString *power, NSString *version) {
    // 设备状态回调
    NSLog(@"信号强度:%@,功率:%@,版本:%@", RSSI, power, version);
}];

配置说明

1. Info.plist 权限配置

需在项目的 Info.plist 中添加以下权限配置(Demo 工程中已配置,可直接拷贝):

<!-- NFC 权限 -->
<key>NFCReaderUsageDescription</key>
<string>需要NFC权限以绑定和刷图电子纸设备</string>
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
    <string>TAG</string>
</array>

<!-- 蓝牙权限 -->
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限以绑定和刷图电子纸设备</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要蓝牙权限以绑定和刷图电子纸设备</string>

<!-- 相册权限 -->
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册以选择刷图图片</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要保存权限以存储刷图预览图</string>
    
    

2. 算法类型常量配置

从 Demo 的 UtilsMacros.h 中拷贝以下算法常量定义:

// XTEnum.h 中定义(Demo 中已封装)
#define ALG_TYPE_WARM @"WARM"        // 暖色调抖动算法
#define ALG_TYPE_COLD @"COLD"        // 冷色调抖动算法
#define ALG_TYPE_COLOR @"COLOR"      // 色阶算法

使用流程

1. 环境准备(基于 SDK 开发)

  • 真机测试(模拟器不支持 NFC/蓝牙功能)
  • 电子纸设备(普通设备/Prism设备/单屏/双面桌牌/手机壳)
  • 开启设备的 NFC/蓝牙功能
  • 确保项目已配置好开发者证书(可正常运行到真机)

2. SDK 核心调用流程

// 完整调用流程示例
#import "XTDeviceConfig.h"
#import "XTImageDitherUtils.h"
#import "NFCHelper.h"
#import "XTBleWriteHelper.h"
#import "UtilsMacros.h"

- (void)completeBrushFlow {
    // 1. 读取设备配置(无配置则先绑定)
    XTDeviceConfig *deviceConfig = [XTDeviceConfig readLocalCfg];
    if (!deviceConfig) {
        NSLog(@"请先绑定设备");
        return;
    }
    
    // 2. 选择原始图片
    UIImage *originalImage = [UIImage imageNamed:@"test.png"];
    
    // 3. 图像抖点处理
    UIImage *previewImage = nil;
    NSData *imageData = [XTImageDitherUtils convertToUploadData:originalImage 
                                                  previewImage:&previewImage 
                                                     deviceCfg:deviceConfig 
                                                       algType:ALG_TYPE_WARM];
    NSMutableArray *uploadDataArr = [XTImageDitherUtils getUploadDataFromDitherImage:previewImage 
                                                                          deviceCfg:deviceConfig];
    
    // 4. 判断设备类型,选择对应的传输方式刷图
    if ([deviceConfig isPhoneCaseDevice]) {
        // 手机壳设备:使用NFC传输
        NFCHelper *nfcHelper = [NFCHelper shareInstance];
        NSString *result = [nfcHelper importImageToDevice:@"正在刷图..." 
                                              imageData:imageData 
                                              imageDataXT:uploadDataArr 
                                              screenCfg:deviceConfig 
                                              imageSectionNumber:0 
                                                      pin:nil 
                                                  PageSize:490 
                                              IntervalTime:50];
        if ([result containsString:@"成功"]) {
            NSLog(@"刷图成功");
        } else {
            NSLog(@"刷图失败:%@", result);
        }
    } else {
        // 非手机壳设备:使用蓝牙传输
        XTBleWriteHelper *bleHelper = [XTBleWriteHelper shareInstance];
        [bleHelper importImageDataToDeviceWithImageHexDataArr:uploadDataArr 
                                                deviceConfig:deviceConfig 
                                                    sendSize:244 
                                               writeImageBlock:^(BOOL success, NSString *error) {
            if (success) {
                NSLog(@"刷图成功");
            } else {
                NSLog(@"刷图失败:%@", error);
            }
        } advData:^(NSString *RSSI, NSString *power, NSString *version) {}];
    }
}

设备适配与特殊处理

1. 传输方式说明

根据设备类型选择对应的传输方式:

  • 手机壳设备
    • 通过 isPhoneCaseDevice 方法判定为手机壳设备时
    • 传输工具固定使用 NFCHelper
  • 非手机壳设备
    • 通过 isBluetoothTransferWhenNFCReading 方法判定为非手机壳设备时
    • 可先通过 NFC 完成绑定,传输工具使用 XTBleWriteHelper
    • 也可以先通过 XTBleWriteHelper 扫描完成绑定,传输工具使用 XTBleWriteHelper

2. 一些常见的设备编号对照表

设备编号 设备型号 特殊说明
102 1.69充电宝 无特殊要求
105 4寸工牌 无特殊要求
120 4寸相册 无特殊要求
121 3.97色柔性屏蓝牙工牌 无特殊要求

单双屏设备使用说明

提示SDK 中双屏设备特指「双面桌牌双面板电子纸设备」,单屏为常规电子纸设备;双屏设备需使用专属的蓝牙刷图API,不可复用单屏API。

1. 单双屏设备判断

// 读取设备配置
XTDeviceConfig *deviceConfig = [XTDeviceConfig readLocalCfg];

// 判断是否为双屏(双面桌牌)设备
if ([deviceConfig isNameCardDevice]) {
    NSLog(@"当前设备为双屏双面桌牌设备 - 需使用双屏专用API");
    // 执行双屏刷图逻辑
} else {
    NSLog(@"当前设备为单屏设备 - 使用单屏API");
    // 执行单屏刷图逻辑
}

2. 单屏设备刷图(常规流程)

// 单屏设备蓝牙刷图示例
[bleHelper importImageDataToDeviceWithImageHexDataArr:singleUploadDataArr 
                                        deviceConfig:deviceConfig 
                                            sendSize:244 
                                       writeImageBlock:^(BOOL success, NSString *error) {
    if (success) {
        NSLog(@"单屏蓝牙刷图成功");
    } else {
        NSLog(@"单屏蓝牙刷图失败:%@", error);
    }
} advData:^(NSString *RSSI, NSString *power, NSString *version) {
    // 设备状态回调
    NSLog(@"信号强度:%@,功率:%@,版本:%@", RSSI, power, version);
}];

3. 双屏设备刷图(双面板专用API)

// 双屏设备蓝牙刷图示例(A/B面同时刷图)
XTDeviceConfig *deviceConfig = [XTDeviceConfig readLocalCfg];
if ([deviceConfig isNameCardDevice]) {
    // 1. 准备A/B面图像数据(需分别处理)
    NSMutableArray *hexDataArrA = [XTImageDitherUtils getUploadDataFromDitherImage:previewAImage 
                                                                       deviceCfg:deviceConfig];
    NSMutableArray *hexDataArrB = [XTImageDitherUtils getUploadDataFromDitherImage:previewBImage 
                                                                       deviceCfg:deviceConfig];
    
    // 2. 调用双屏专用API刷图
    [bleHelper importImageDataToDeviceWithImageHexDataArrA:hexDataArrA
                                            hexDataArrB:hexDataArrB
                                           deviceConfig:deviceConfig
                                               sendSize:244
                                        writeImageBlock:^(BOOL success, NSString *error) {
        if (success) {
            NSLog(@"双屏(A/B面)刷图成功");
        } else {
            NSLog(@"双屏刷图失败:%@", error);
        }
    } advData:^(NSString *RSSI, NSString *power, NSString *version) {
        // 设备状态回调
        NSLog(@"信号强度:%@,功率:%@,版本:%@", RSSI, power, version);
    }];
}

支持与联系

  • 📧 邮箱:lingzhengqi@seekink.com

© 2025 xtkj. 最后更新: 2025年1月22日