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应用集成示例代码》。