Huawei Share 作为跨设备传输文件的解决方案,通过蓝牙实现设备之间发现及连接鉴权,建立P2P Wi-Fi通道,实现手机、PC、第三方设备间文件互传。在第三方设备处理能力及传输环境有保障的情况下,稳定传输速度超过80MB/s。
Huawei Share能力现已通过深度封装,以极简Engine面向应用APP、智能设备开发者开放。PC、打印机、相机等众多硬件设备均可集成Huawei Share,实现跨设备文件传输。Share Engine提供Android、Linux、Windows 3种SDK开发包,涵盖华为手机应用集成、Android设备集成、Linux设备集成、Windows PC应用集成等主流集成方式,帮助开发者快速集成Huawei Share。在这个Codelab中,主要介绍Android设备如何使用Huawei Share功能。实现该程序后,可以支持Android设备向华为设备发送文件或文本内容。
在这个Codelab中,主要介绍Windows PC应用如何使用Huawei Share功能。实现该程序后,可以支持Windows PC与华为设备文件互传。

在这个Codelab中,你将创建Demo Project,并将Share Engine的SDK集成到Demo Project中,以及完成Share Engine服务的整体流程搭建。

示例程序实现效果示意图

您将会学到什么

硬件要求

软件要求

需要的知识点

集成Share Engine能力,需要完成以下准备工作:

具体操作,请按照《Share Engine Windows PC 应用集成接入准备》中详细说明来完成。

1、集成SDK。
将获取好的sdk包解压放在工程的bin目录下,将ShareService.lib文件放到代码同级目录下(也可以放到其他目录,可以由开发者自己调整),同时在工程的主函数文件中引用头文件SynergyServiceImpl.h
做如下配置:
SDK包放到bin目录:

ShareService.lib用来处理SDK的编译依赖:

头文件放置在开发工程中:

2、初始化Share Engine

调用StartShareKitServer接口,拉起SharekitServer.exe进程。(启动了SharekitServer进程后,本PC设备即可被Huawei手机发现,并可以接受Huawei手机发送的文件)

ShareKitClient ShareClient; ShareClient.StartShareKitServer();

3、客户端注册,并获取客户端Id;通过注册获取的客户端Id,生成SynergyServiceImpl对象(非常重要,后续所有操作全部依赖此对象)

SynergyServiceImpl此对象必须保证在整个功能的生命周期,保证在注销时此对象还存活,否则会导致ShareKitServer无法退出,功能异常

int clientId = ShareClient.RegistClient(); SynergyServiceImpl SynergySerObj(clientId);

4、声明回调函数

实现SynergyServiceImpl.h中DeviceChangeListener、SendProgressListener类型:

发现回调:

void MyDeviceChangeListener::OnDeviceFound(const WinShareKit::HwShareDevice& device) { std::wstring devName = UTF8ToUnicode(device.DevName); setlocale(LC_CTYPE, "chs"); wprintf(L"[callback]onDeviceFound,deviceName:%ws \n", devName.c_str()); if (device.DevName.find("biyantas") != std::string::npos) { wprintf(L"my device was found,g_sharedevice is %ws ,shareType:%d", devName.c_str(), device.shareType); g_sharedevice = device; isDeviceFound = 1; } } void MyDeviceChangeListener::OnDeviceLost(const WinShareKit::HwShareDevice& device) { std::wstring devName = UTF8ToUnicode(device.DevName); setlocale(LC_CTYPE, "chs"); wprintf(L"[callback]OnDeviceLost,deviceName:%ws \n", devName.c_str()); }

发送进度、状态回调:

void MySendProgressListener::OnProgress(const WinShareKit::HwShareProgress& progress) { printf("MySendProgressListener::OnProgress:%d", progress.progress); } extern int isSendFinish; void MySendProgressListener::OnStatusChange(const WinShareKit::HwShareStatus& status) { printf("MySendProgressListener::OnProgress:%d", status.intStatus); switch (status.intStatus) { case WinShareKit::DTCP_STATUS_SEND_CONNECTING: printf("正在连接..."); return; case WinShareKit::DTCP_STATUS_SEND_CONNECTED: printf("连接成功"); return; case WinShareKit::DTCP_STATUS_SEND_PREVIEW: printf("开始发送预览数据"); return; case WinShareKit::DTCP_STATUS_SEND_PREVIEWOK: printf("预览数据发送完成"); return; case WinShareKit::DTCP_STATUS_SEND_DATA: printf("开始发送文件数据"); return; case WinShareKit::DTCP_STATUS_SEND_DATAOK: printf("文件数据发送完成"); return; case WinShareKit::DTCP_STATUS_SEND_RECVCANCEL: printf("接收方取消"); break; case WinShareKit::DTCP_STATUS_SEND_RECVREJCT: printf("接收方拒绝"); break; case WinShareKit::DTCP_ERR_NOSPACE: printf("接收方空间不足"); break; case WinShareKit::SHARE_ERROR_SERVER_BUSY: printf("正在接收"); break; case WinShareKit::SHARE_ERROR_CLIENT_BUSY: case WinShareKit::SHARE_ERROR_SELF_CHANNEL_BUSY: printf("本机忙"); break; //case synergy::SHARE_ERROR_CHANNEL_BUSY: case WinShareKit::SHARE_ERROR_OTHER_CHANNEL_BUSY: printf("对方正忙"); break; case WinShareKit::DTCP_STATUS_SEND_CANCEL: printf("取消发送成功"); break; case WinShareKit::SHARE_ERROR_SOCKET: case WinShareKit::DTCP_ERR_SOCKET: printf("Socket出错,传输失败"); break; case WinShareKit::SHARE_ERROR_REMOTE: case WinShareKit::DTCP_ERR_REMOTE: printf("接收端出错"); break; case WinShareKit::SHARE_ERROR_IO: case WinShareKit::DTCP_ERR_IO: printf("I/O错误"); break; case WinShareKit::SHARE_UNKNOWN_ERROR: printf("未知错误"); break; case WinShareKit::DTCP_TIMEOUT_FINISH: printf("接收方确认文件数据接收超时"); break; case WinShareKit::DTCP_TIMEOUT_CONFIRM: printf("接收方确认接收超时"); break; case WinShareKit::DTCP_TIMEOUT_CANCEL: printf("接收方响应取消超时"); break; case WinShareKit::DTCP_STATUS_SEND_SUCCESS: printf("文件分享成功"); break; case WinShareKit::DTCP_STATUS_SEND_DISCONNECTED: printf("连接关闭"); isSendFinish = 1; break; case WinShareKit::DTCP_WIFI_EXCEPTION_DISCONNECT: printf("PC为发送端,WiFi异常断开"); break; case WinShareKit::DTCP_BT_OR_WIFI_CLOSE: printf("PC为发送端,PC侧断开WiFi"); default: return; } }

5、搜索周围设备

MyDeviceChangeListener *deviceListener = new MyDeviceChangeListener(); SynergySerObj.SearchDevice((WinShareKit::DeviceChangeListener *)deviceListener);

6、发送文件

MySendProgressListener *progressListener = new MySendProgressListener(); SynergySerObj.SendByHwShare(g_sharedevice, vecSendFiles, (WinShareKit::SendProgressListener *)progressListener);

7、停止搜索

SynergySerObj.StopSearch();

8、注销客户端

ShareClient.UnRegistClient();

干得好,你已经成功完成了Codelab并学到了:

1、首先需要在华为设备上打开Huawei Share功能:

Huawei Share设置

2、在WindowsPC设备启动ShareKitClient样例程序,命令行窗口如下:

Share Engine 样例程序界面

使用管理员启动ShareKitClient,输入1:搜索周围设备,如果搜索到特定手机设备,则进行发送文件。输入2:注销客户端并退出。

3、手机接收到PC的发送:

华为设备接收第三方设备分享文件

4、手机选择接收文件后,Huawei Share界面可以显示接收的文件列表:

Huawei Share显示接收文件列表

5、手机发送文件给PC:
手机搜索到周围PC设备,点击发送:

PC接收手机发来的文件,选择接收:

您可以阅读下面链接,了解更多相关的信息。
Share Engine 业务介绍

接口详细描述参见《ShareEngine Windows PC应用集成API接口描述》。

详细代码示例可参考《ShareEngine Windows PC应用集成示例代码》

Download

已复制代码