How to use obex-data-server to transfer a file on ARM-xScale platform (原创)

来源:互联网 发布:安徽网络教育 编辑:程序博客网 时间:2024/04/30 06:56

1.
接上文 obex-data-server 已经运行起来了
接下来就可以运行obex-data-server/test 下的ods-dbus-test 来测试OPP 功能了
# ./ods-dbus-test 00:1B:FB:17:6B:E1 OPP /test.txt
** Message: CreateBluetoothSession ("00:1B:FB:17:6B:E1", "00:00:00:00:00:00", "OPP")
** Message: Object path: /org/openobex/session0
** Message: Session connected: /org/openobex/session0
** Message: SendFile ("/test.txt")
** (process:317): WARNING **: Error: Message did not receive a reply (timeout by message bus)

再看一下./obex-data-server 进程的log发现输出如下错误

** Message: session_connect_result_cb
** Message: LOCK
** Message: ods_filename_to_utf16 error: Conversion from character set 'UTF8' to 'UTF16BE' is not supported
Segmentation fault

 

2.
在完颜的提醒下,发现glib-2.18下确实没有把iconv的库编译进去。于是立即下载 libiconv-1.12 并编译
cross compile libiconv-1.12
./configure --host=arm-xscale-linux-gnu --prefix=/usr/arm-xscale-linux-gnu
make & make install

 

3.
重新编译glib-2.18
echo ac_cv_type_long_long=yes>arm-linux.cache
echo glib_cv_stack_grows=no>>arm-linux.cache
echo glib_cv_uscore=no>>arm-linux.cache
echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache
echo ac_cv_func_posix_getgrgid_r=yes>>arm-linux.cache
./configure --host=arm-xscale-linux-gnu --cache-file=arm-linux.cache --prefix=/usr/arm-xscale-linux-gnu --with-libiconv=gnu

configure出错
checking for libiconv_open in -liconv... no
configure: error: *** No iconv() implementation found in C library or libiconv


查看config.log
configure:8418: checking for libiconv_open in -liconv
configure:8453: arm-xscale-linux-gnu-gcc -o conftest -g -O2   conftest.c -liconv   >&5
/opt/gcc-4.1.2-glibc-2.4/arm-xscale-linux-gnu/lib/gcc/arm-xscale-linux-gnu/4.1.2/../../../../arm-xscale-linux-gnu/bin/ld: cannot find -liconv

发现iconv 根本不支持pkgconfig,参./configure --help的帮助 加入 CFLAGS LDFLAGS 环境变量指向 iconv 库

./configure --host=arm-xscale-linux-gnu CFLAGS="-I/usr/arm-xscale-linux-gnu/include" CFLAGS="-I/usr/arm-xscale-linux-gnu/include" LDFLAGS="-L/usr/arm-xscale-linux-gnu/lib" --cache-file=arm-linux.cache --prefix=/usr/arm-xscale-linux-gnu --with-libiconv=gnu

还是报错
configure: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used.
configure: loading cache arm-linux.cache
configure: error: `CFLAGS' was set to `-I/usr/arm-xscale-linux-gnu/include' in the previous run
configure: error: `LDFLAGS' was set to `-L/usr/arm-xscale-linux-gnu/lib' in the previous run
configure: error: changes in the environment can compromise the build
configure: error: run `make distclean' and/or `rm arm-linux.cache' and start over

照着错误error 删除arm-linux.cache 从头再来
echo ac_cv_type_long_long=yes>arm-linux.cache
echo glib_cv_stack_grows=no>>arm-linux.cache
echo glib_cv_uscore=no>>arm-linux.cache
echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache
echo ac_cv_func_posix_getgrgid_r=yes>>arm-linux.cache
./configure --host=arm-xscale-linux-gnu CFLAGS="-I/usr/arm-xscale-linux-gnu/include" CFLAGS="-I/usr/arm-xscale-linux-gnu/include" LDFLAGS="-L/usr/arm-xscale-linux-gnu/lib" --cache-file=arm-linux.cache --prefix=/usr/arm-xscale-linux-gnu --with-libiconv=gnu
make & make install
这次配置和编译都成功了。


4.
再回到板子上运行 obex-data-server 和 ods-dbus-test

# ./ods-dbus-test 00:1B:FB:17:6B:E1 OPP /test.txt
** Message: CreateBluetoothSession ("00:1B:FB:17:6B:E1", "00:00:00:00:00:00", "OPP")
** Message: Object path: /org/openobex/session0
** Message: Session connected: /org/openobex/session0
** Message: SendFile ("/test.txt")
** (process:317): WARNING **: Error: Message did not receive a reply (timeout by message bus)

#./obex-data-server
** Message: session_connect_result_cb
** Message: LOCK
** Message: ods_filename_to_utf16 error: Conversion from character set 'UTF8' to 'UTF16BE' is not supported
Segmentation fault


5.
发现还是报一样的错。没办法了只能查代码了...
找到obex-data-server 下打log 的地方在 ods-common.c line 80
-----
/* convert utf8 to utf16 (big endian) */
 *filename_utf16 = g_convert (filename_utf8, -1, "UTF16BE", "UTF8", NULL, &utf16_len, &error);

 if (*filename_utf16 == NULL) {
  g_message ("ods_filename_to_utf16 error: %s", error->message);
  g_error_free (error);
  utf16_len = 0;
 }
-----

再跟踪g_convert() 函数调用这是glib库gconver.c 文件中的函数.
g_conver()->open_converter()->g_iconv_open()->try_conversion()->iconv_open()
错误发生在了 gconver.c line 72

  *cd = iconv_open (to_codeset, from_codeset);
  if (*cd == (iconv_t)-1 && errno == EINVAL)
    return FALSE;
  else
    return TRUE;
 
这里发生了errno == EINVAL的错误! 不会吧调用iconv_open api 会报错,
难道iconv编译有问题,或glib用了suse-linux 的头文件?(本人以前发生过这种问题,
解决办法是使用iconv.h的时候一定判断
#ifdefine (_LIBICONV_H)
#error GNU libiconv in use but included iconv.h not from libiconv
#endif
这个扯远了)

 

5.
写一个 test_iconv 程序

#include <iconv.h>
#if !defined (_LIBICONV_H)
#error GNU libiconv in use but included iconv.h not from libiconv
#endif
int main(int argc,char* argv[])
{
 iconv_t cd = iconv_open("UTF16BE", "UTF8");
 if(cd == (iconv_t)-1 && errno == EINVAL) {
  printf("iconv_open from character set '%s' to '%s' is not supported/n","UTF8", "UTF16BE");
 } else {
  printf("iconv_open from character set '%s' to '%s' is supported/n","UTF8", "UTF16BE");
 }
 return 0;
}

在扳子上运行一下。果然打印出 “iconv_open from character set UTF8 to UTF16BE is not supported”  !!!!
这下晕死了,再仔细看一下,发现iconv 文挡上支持的是 UTF-16BE,UTF-8 ,而不是UTF16BE和UTF8 !?
立马改成
iconv_t cd = iconv_open("UTF-16BE", "UTF-8");
结果出来了“... is supported” !!!

这下找到原因了,原来是 字符集名字的原因。

 

6.
回到obex-data-server 下 ods-common.c line 84
at line 84
/* convert utf8 to utf16 (big endian) */
 *filename_utf16 = g_convert (filename_utf8, -1, "UTF16BE", "UTF8", NULL, &utf16_len, &error);

改成
 *filename_utf16 = g_convert (filename_utf8, -1, "UTF-16BE", "UTF-8", NULL, &utf16_len, &error);

重新编译

 

7.
再次到板子上运行
接下来就可以运行obex-data-server 和 ods-dbus-test
# ./ods-dbus-test 00:1B:FB:17:6B:E1 OPP /test.txt
** Message: CreateBluetoothSession ("00:1B:FB:17:6B:E1", "00:00:00:00:00:00", "OPP")
** Message: Object path: /org/openobex/session0
** Message: Session connected: /org/openobex/session0
** Message: SendFile ("/test.txt")
** Message: Transfer started: (test.txt, /test.txt, 120830)
** Message: Transfer progress: 40.3 %
** Message: Transfer progress: 60.5 %
** Message: Transfer progress: 80.7 %
** Message: Transfer progress: 100.0 %
** Message: Transfer progress: 100.0 %
** Message: Transfer completed
** Message: Disconnect ()
** Message: Session disconnected
** Message: Session removed: /org/openobex/session0

# ./obex-data-server -n
** Message: obex-data-server 0.4.2
** Message: Using Session bus
** Message: Parsed[0]: OPP
** Message: Connected SDP session
** Message: SDP search process
** Message: SDP search completed
** Message: getting RFCOMM channel
** Message: Connect in progress
** Message: Connected
** Message: Session created by: :1.9
** Message: io callback
** Message: event: 3
** Message: obex_request_done: command 0, response 32 (OK, Success)
** Message: Version: 0x10. Flags: 0x00  OBEX packet length: 24576

** Message: Resizing stream chunks to 24376

** Message: session_connect_result_cb
** Message: LOCK
** Message: event: 8
** Message: obex_writestream
** Message: writestream from File: 5
** Message: event: 8
** Message: obex_writestream
** Message: writestream from File: 5
** Message: event: 0

** (obex-data-server:321): WARNING **: PROGRESS: 48752
** Message: UNLOCK
** Message: io callback
** Message: event: 8
** Message: obex_writestream
** Message: writestream from File: 5
** Message: event: 0

** (obex-data-server:321): WARNING **: PROGRESS: 73128
** Message: io callback
** Message: event: 8
** Message: obex_writestream
** Message: writestream from File: 5
** Message: event: 0

** (obex-data-server:321): WARNING **: PROGRESS: 97504
** Message: io callback
** Message: event: 8
** Message: obex_writestream
** Message: writestream from File: 5
** Message: event: 0

** (obex-data-server:321): WARNING **: PROGRESS: 120830
** Message: io callback
** Message: event: 8
** Message: obex_writestream
** Message: writestream from File: 5
** Message: io callback
** Message: event: 3
** Message: obex_request_done: command 2, response 32 (OK, Success)
** Message: LOCK
** Message: Sending CMD_DISCONNECT
** Message: UNLOCK
** Message: io callback
** Message: event: 3
** Message: obex_request_done: command 1, response 32 (OK, Success)
** Message: LOCK
** Message: UNLOCK
** Message: session closed
** Message: Removing listened DBUS name :1.9 (object: /org/openobex/session0)
** Message: Removed from listened DBUS names list
** Message: closing connection


笔记本上选择接受文件。 成功将板子上的test.tx文件传送到了笔记本上!

 

原创粉丝点击