设备间利用AllJoyn传送文件(修改官方版本)

技术菌的blog 2015-04-01 02:11:01
加精
下载并编译完alljoyn-14.06源码后,在\build\win7\x86\debug\dist\cpp\samples下生成了了些alljoyn实例,其中就有一个与文件传输有关的FileTransfer。但也许是官方版本有bug(我也确实看到了bug),运行时总是异常,客户端无法收到文件。于是就有了这个修改版,可以实现文件传输了。并且传输方向我更换了,客户端向服务端循环发送文件,服务端等待接收即可。下面是核心实现过程。


客户端
1、创建一接收图片信号,附带两个参数,文件名和字节数组
fileTransferInterface->AddSignal("FileTransfer", "say", "name,data", 0, 0);

2、客户端的main中,接入会话后,循环发送图片即可
if (ER_OK == status) {
while (1) {
busObject.FileTransfer(argv[1]);
Sleep(4000);
}
}

3、传输文件的方法实现

void FileTransfer(const char *filename)
{
char* buf = new char[ALLJOYN_MAX_ARRAY_LEN];
memset(buf,0,ALLJOYN_MAX_ARRAY_LEN);//官方版本并没有把buf清零,较危险

long l,length,len;
ifstream inputStream(filename, ios::in | ios::binary);

if (inputStream.is_open()) {
MsgArg args[2];
QStatus status = ER_OK;
const uint8_t flags = ALLJOYN_FLAG_GLOBAL_BROADCAST;

l=inputStream.tellg();
inputStream.seekg(0,ios::end);
length=inputStream.tellg();
len = length;

//在这里我限定了文件大小,最大为1M
if (len > 1024 * 1024){
printf("too big image size\n");
exit(-1);
}

inputStream.seekg(0);

while (len > 0) {
//如果图片超过alljoyn规定的数组最大长度,得分块传

long bufferLength = ALLJOYN_MAX_ARRAY_LEN;

if (len > (filebuf::pos_type)ALLJOYN_MAX_ARRAY_LEN) {
len -= (filebuf::pos_type)ALLJOYN_MAX_ARRAY_LEN;
} else {
bufferLength = len;
len = 0;
}

inputStream.read(buf, bufferLength);

args[0].Set("s", filename);
args[1].Set("ay", bufferLength, buf);

status = Signal(NULL, s_sessionId, *picDataSigMember, args, 2, 0, flags);
}
//最后一次传输标识图片传输结束,方便对方检测
args[0].Set("s", filename);
args[1].Set("ay", 0, NULL);

status = Signal(NULL, s_sessionId, *picDataSigMember, args, 2, 0, flags);
printf("sent %s ok. size:%d\n",filename,length);
} else {
printf("The file doesn't exist or the permissions is stopping the app from opening the file.\n");
}
}

关键的地方我在上面已经标出
服务端
1、创建相同的图片信号,并添加信号处理方法
fileTransferInterface->AddSignal("FileTransfer", "say", "name,data", 0, 0);
status = s_msgBus->RegisterSignalHandler(this,
static_cast<MessageReceiver::SignalHandler>(&FileTransferObject::FileTransferSignalHandler),
picDataSigMember,
NULL);

2、main主线程休眠;信号处理方法实现如下:

void FileTransferSignalHandler(const InterfaceDescription::Member* member,const char* sourcePath,
Message& msg)
{
//这个实现我改得较多,没有分块数,且不用每次都解析文件名
uint8_t* data;
size_t size;
static unsigned int offset = 0;

msg->GetArg(1)->Get("ay", &size, &data);

if (size != 0) {
//pData是动态分配的,大小即是我规定的最大大小
memcpy(pData+offset,data,size);
offset += size;
printf("rece size:%d\n",size);

} else {
//图片发完了
if (outputStream == NULL) {
printf("The file received ok\n");

char* filePathAndName;

msg->GetArg(0)->Get("s", &filePathAndName);

//解析文件名
char *fileName = filePathAndName;
char* fileNameBack = strrchr(filePathAndName, '\\');
char* fileNameForward = strrchr(filePathAndName, '/');
if (fileNameBack && fileNameForward) {
fileName = (fileNameBack > fileNameForward ? fileNameBack : fileNameForward) + 1;
} else {
if (fileNameForward) {
fileName = fileNameForward + 1;
}
if (fileNameBack) {
fileName = fileNameBack + 1;
}
}
printf("opening the output stream to write file '%s'.\n", fileName);
outputStream = new ofstream(fileName, ios::out | ios::binary);

//字节流写入文件
outputStream->write(pData,offset);
offset = 0;//务必清零
}
delete outputStream;
outputStream = NULL;
}
}


如此一来,分别启动,就能传输了。效果截图:


当然还可继续改进,比如可以做成界面,还可以做成相互传输形式等等。LZ暂抛砖引玉,还请指教
...全文
1892 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
niwudayelaile 2015-04-15
  • 打赏
  • 举报
回复
楼主 求QQ
伊顺鸣 2015-04-13
  • 打赏
  • 举报
回复
谢谢楼主分享,真的不错的
cattpon 2015-04-12
  • 打赏
  • 举报
回复
学习一下~~
MUKINGLONG 2015-04-12
  • 打赏
  • 举报
回复
楼主威武啊,向你学习
qq_24498255 2015-04-11
  • 打赏
  • 举报
回复
感谢楼主分享,学习了
qnapjiujiu 2015-04-10
  • 打赏
  • 举报
回复
无常w 2015-04-09
  • 打赏
  • 举报
回复
牛~~~~~~~~@陈坡坡
hugh_z 2015-04-08
  • 打赏
  • 举报
回复
learning
hugh_z 2015-04-07
  • 打赏
  • 举报
回复
learning
Leo__su 2015-04-07
  • 打赏
  • 举报
回复
cool,great analyzing
keke_bisheng 2015-04-07
  • 打赏
  • 举报
回复
ganxiefenxiang
qq_27201069 2015-04-07
  • 打赏
  • 举报
回复
感谢楼主分析
hugh_z 2015-04-06
  • 打赏
  • 举报
回复
learning
laoer_2002 2015-04-06
  • 打赏
  • 举报
回复
谢谢楼主分享!
qq_27151719 2015-04-05
  • 打赏
  • 举报
回复
学习学习。。。。。。。。。。。。。。。。。
chilli8013 2015-04-05
  • 打赏
  • 举报
回复
qnapjiujiu 2015-04-05
  • 打赏
  • 举报
回复
cattpon 2015-04-05
  • 打赏
  • 举报
回复
看看是怎么样实现~
jxwazxx 2015-04-05
  • 打赏
  • 举报
回复
学习学习看看是怎么样实现
nettman 2015-04-04
  • 打赏
  • 举报
回复
感谢楼主分享,学习了
加载更多回复(4)

948

社区成员

发帖
与我相关
我的任务
社区描述
为开发者提供高通丰富的解决方案及全面技术下载内容。本版以AI人工智能、WoS移动笔记本、XR、IoT 物联网、Auto 汽车、生成式AI等核心板块组成,为开发者提供一个便捷及高效的学习交流平台。
人工智能物联网机器学习 企业社区 北京·东城区
社区管理员
  • Qualcomm开发
  • csdnsqst0050
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧