.net平台手机管理软件开发(6)OBEX应用——文件传输部分

(六) OBEX应用——文件传输部分

在手机数据传输方面基本OBEX应用分为
l 文件传输
l IrMC同步

文件传输又可以细分为以下基本操作
l 初始化连接
l 断开连接
l 设置路径
l 取得目录信息
l 创建目录
l 上传下载文件
l 删除文件或空目录

在笔者的软件当中设计了OBEX这个类,里面包含了以上所有的基本操作。另外针对M55的服务端的特殊性又设计了更名、取得磁盘空间信息、移动、拷贝文件的功能。具体请参考源代码。

下面具体讲述各个操作的细节。
l 初始化连接

初始化连接包括了使手机进入OBEX状态再到发送Connect指令的一系列过程。具体流程参考下图。
ATÆAT^SQWE=0ÆAT^SQWE=3ÆConnectÆ连接到Folder-Listing Service

其中AT^SQWE=0和AT^SQWE=3是西门子特有的隐藏的AT指令,甚至在官方的AT指令集里面都没有提到。其作用是初始化手机到OBEX模式。

发送Connect指令收到手机回复以后确定Max Packet Length等参数。最后连接到Folder-Listing Service进行文件操作。如果需要IrMC同步的话,在Connect后直接连接到IrMC Sync Service即可,手机立刻进入同步模式,所有的应用程序退出。

在笔者的程序中当中首先使用AT指令确定手机当前的工作,如果超时,尝试发送+++并等待1秒钟以便手机从不正常的OBEX状态中退出。然后在此发送AT,成功后即进行文件操作,否则引发一个错误。
l 断开连接

这里的断开连接是指从OBEX模式退出到AT状态中。在AT指令中,连续发送三个0x2B然后等待一秒钟以上即可退出数据模式进入常规AT模式。
l 设置路径

程序中使用SetPath操作设置路径。需要注意的是,可以设计两种风格的过程:一种使用绝对路径,另一种使用相对路径。

对于手机而言,经笔者实践证明,使用绝对路径要比使用相对路径方便,而且更准确,但效率上稍逊,特别是在多层目录的情况下。由于手机没有能够返回当前路径的方法,所以相对路径总难以控制,只有通过程序控制,极容易出现错误。所以建议使用绝对路径。

如果使用绝对路径,那么路径名将呈现path1path2这种形式。首先回到根目录,然后一级一级的到达目的。在笔者的OBEX类当中,可以看到BacktoRoot这个过程。其作用就是把当前程序路径切换到根目录以免引起混乱。
l 取得目录信息

要取得一个目录的文件信息可以用发送Get指令。该Get指令需要一个TypeHeader,其值为x-obex/folder-listing

随后服务端会返回一个xml文件,包含了整个目录的信息。例如子目录名、文件名、大小、最后修改时间。再通过xml解析后就会得到目录信息。
l 创建目录

当SetPath的Flags的Bit1设为1并且无法找到目录时,服务端会创建这个目录并进入。

请注意,再次使用SetPath并将Flags的Bit0设为1返回上层目录,否则容易引起混乱。
l 上传下载文件

使用Put和Get命令可以实现上传和下载文件。注意所有的文件操作都在SetPath所指定的目录下进行。

使用Put命令实现上传时,至少需要提供NameHeader,BodyHeader,一般还要提供LengthHeader,DateTimeHeader。大文件传输需要正确处理BodyHeader,不能超出了服务端最大所能接收的Packet的大小,否则会出现错误。

需要注意的是如果当前文件存在,那么Put命令不会覆盖已有的文件而是追加,导致错误。传输文件之前需要首先删除同名文件。

使用Get命令实现下载时,只需要提供NameHeader即可。具体例子参考上一节。
l 删除文件或空目录

使用Put命令,其NameHeader指定为文件名或目录名并将BodyHeader设置为空即可。

非空目录无法删除,会返回错误。

西门子手机还有移动、拷贝等功能,具体实现方法请参阅OBEX源代码。

.net平台手机管理软件开发(1-4)

.net平台手机管理软件开发
(一) 简介

通过几个月零零碎碎地学习各方面知识之后在这个大二的寒假笔者终于用VB.Net写出了西门子手机的辅助软件——Siemens Support Tool。虽然我没有最终的完成这个软件的所有设计,但核心的功能已经开发完成,界面也基本到位,我的学习的目的也就达到了。在2月12日正式停止开发的以后,我想到把寒假20几天的辛苦历程作一个总结,为以后重温这部分知识起到一定的作用,也为广大编程爱好者提供一些帮助和启发。笔者才疏学浅,编程也是零碎时间自学过来的,所以有缺陷和谬误请大家斧正。

(二) 为何要设计?设计目的?

用过西门子手机的都知道西门子手机在人性化设计方面做得比较好,但是让笔者失望的是电脑端上使用的官方软件SDS,其缺点是操作不方便,速度比较慢,感觉人性化设计不到位。后来官方推出了用于65系列的Mobile Phone Manager,界面很好看,但安装后大于120MB的容量及其较慢的速度又让人大跌眼镜。
GhostMobile(简称GM)是我用过的国产非官方软件里面比较好的一款,但经常出现传输中一直等待的情况。估计作者并没有超时设计。另外GM文件传输速度很慢,短信管理不方便,后来也由于作者使用了新的手机,也就放弃了GM。后来又找到一款Siemens Mobile Control,简称SiMoCo,是国外的非官方软件。800多kb的身躯及其速度、功能方面都超过了官方及GM,令人刮目相看,一度成为我最喜欢的软件。但用后发现一些问题,软件过于专业,选项太多,对中文的支持不好。

所以最终的目的就是做一款能够实现文件传输、短信、便签、任务、重要记事管理的软件。

(三) 准备工作
2004的暑假我已经做了一部分,实现了基本的文件传输和短信功能,当时取名叫作M55 File Transfer Tool。后来在东北手机网上公开了,有一些GM无法连接的手机我的软件都可以连接,所以到现在为止有些网友还在使用我的这个软件。但由于知识不够,做得不是很理想,经常出现问题。

短信部分是官方网站下载的ATC_Command_Set_For_L55_Platform,详细地讲述了55平台上的AT指令集。其实SMS部分的AT指令各大手机厂商都是通用的,已基本上属于同一的指令集了。但是发现文件传输是OBEX却不是那么简单。

官方并没有任何开发文档说明数据传输使用的是什么协议,我用Serial Monitor监视到了数据传输的过程,全是HEX代码,不知道是什么意思。那段时间一度陷入迷茫状态,不知道如何下手。后来在google搜索,又在CSDN里发了一些帖子求救,但却没有一个能够明确说明的。有一个网友的留言给了我一些线索,他说可能是蓝牙协议里面的部分。

这条线索给我了极大的鼓舞,因为后来,顺藤摸瓜找到了红外线传输协议,意外地发现了IrOBEX的描述协议竟然和监视到的HEX代码的结构一样。随后经过仔细的研究发现就是OBEX协议,此协议可以作为上层协议用在红外线协议、蓝牙协议等。此过程大约经历了2个多月。其实现在看来这个问题简单了,手机的工厂模式的串口监视里面就会显示当前使用的协议。当数据传输开始时,会自动从GIPSY变为OBEX。但那个时候哪知道呢?

跨越了OBEX协议的障碍以后我写了一个OBEX-Multithread类,写得很垃圾,把十六进制转换成字符串,然后再转回来在发送。中间使用了string作字符串操作,速度很慢,测试以后只能勉强超过GM的传输速度。

后来借着Serial Monitor监视GM读取手机通讯薄的原理,发现通讯薄是在telecompb目录里面,但是这个目录在手机里面是隐藏的,无法直接访问。由于原来写得OBEX库很糟糕,只能对应文件传输,对于这个特殊文件夹里面的文件都无法操作。修改了之后效果不好,遂放弃了OBEX-Multithread。

由于学习的原因,中途也只得停下来准备期末考试和六级。中途无聊的时候研究IrMC里面的vCard、vNote、vCalc格式,基本弄懂了如何同步通讯薄、便签、日历。2005年1月14日,放假回家了就正式开始动工,把所有的东西都重新写,对我来说,这是一个巨大的挑战。

(四) AT指令简介
AT指令在当代手机通讯中起着重要的作用,能够通过AT指令控制手机的许多行为,包括拨叫号码、按键控制、传真、GPRS等。西门子M55手机为我提供了很多的AT指令,网络上关于AT指令的资料也很多,我这里提取一些比较重要的做个简单解释。其他的手机也基本上通用,更详细的资料请查阅手机生产商的资料。

欲使用AT命令,可以安装微软的超级终端程序,选择好端口连接速度以后就可以正常使用了。

AT指令用法

. 测试命令(Test Command)

在AT指令后面加上“=?”即构成测试命令。

例如“AT+CSCS=?”会列举出所有支持的字符集。

. 读取命令(Read Command)

在AT指令后面加上“?”即构成读取命令。

例如“AT+CSCS?”会列举出当前设置。

. 执行命令(Execute Command)

一般而言在AT指令后加上“=”及命令参数即可。有些命令例如AT+CMGR命令没有参数,直接就可以执行。

注:并不是所有的AT指令都支持1和2。

常用基本AT指令

命令

作用

AT

测试连接是否正确

ATE0

关闭回显。程序初始化AT部分首先关闭回显。

ATE1

打开回显。使用超级终端测试命令时打开。

AT+CGMI

得到厂商信息

AT+CGMR

得到手机版本号

AT+CGSN

得到手机序列号(IMEI)

AT+CIMI

得到手机IMSI号码

AT+CSCS

获取、设置手机当前字符集。可设置为GSM或UCS2

AT+CBC

获取手机电量

AT+CCLK

获取设置手机时钟

AT+CNUM

机身号码。分为线路一和线路二

AT+CSQ

当前信号

AT+COPS

网络营运商

AT+CSCA

短信中心号码

以上这些指令都用于与手机连接的时候初始化用。取得手机IMEI及IMSI可以给使程序支持更多的手机连接并且保持数据独立。

短信部分

命令

作用

AT+CPMS

选择短信储存地点。可选择ME(SIM卡)和MT(机身)

AT+CMGL

列出指定状态的短信息的PDU代码

AT+CMGR

列出指定序号的短信息PDU代码

AT+CMGS

发送短信

AT+CMGD

删除指定的短信

AT+CMGF

短信格式。分为Text模式和PDU模式

AT+CNMI

设置新短消息通知电脑端

AT+CSCA

短信中心

以上命令是短消息部分最经常使用的命令。具体条目及使用方法会在后面重点讲解。

.net IDE 界面编程AutoScale属性惹的大麻烦

最近我我在英文XP SP2环境下制作了一个比较精美的界面,请一个同学帮忙测试。他用的是中文版的操作系统。然而奇怪的是界面大小发生了改变,在中文环境下窗体变大了,按钮 也变大了,所有的Label也移位了。我开始以为是他那里Windows设置的问题,后来在我新装的一个中文环境当中也出现了同样的问题,很是纳闷。

后来到处寻找原因,以为是微软的一个BUG。后在CSDN里面找到了答案,竟然是小小的AutoScale属性惹得货。
AutoScale属性默认设置为True,也就是根据字体的大小自动缩放窗体。很有可能在英文XP环境下的字体和中文环境里面的不一样(但看起来是一样的),导致了这个问题。最终把AutoScale属性设置为False,再编译,一切问题都解决了。

所以得到一个小经验,在需要开发多语言的程序的时候一定要把AutoScale属性设置为False,不然很好的界面(特别是图形化的)就会变得面目全非。另外使用Dock,Anchor也对界面维护起到一定的效果。

实用小技巧——迅速解码UNICODE/UTF8编码

编程难免遇到需要转换Unicode或UTF8到字符串的情形。例如在vCard里面就有

X-ESI-CATEGORIES;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E6=9C=AA=E8=AE=BE=
=E5=AE=9A=E7=BE=A4=E7=BB=84

我们关注这一句的后面部分,使用的是UTF8编码。我想知道它包含的是什么内容,又不想编程,我们可以借用Winhex编辑一个文本文件,然后用Notepad(记事本)打开,就可以知道具体内容了。

例如上面的UTF8字节:E6 9C AA E8 AE BE E5 AE 9A E7 BE A4 E7 BB 84 共15个字节

我们在打开Winhex,创建一个15字节的空文件,然后输入以上字节。

然后保存为一个文本文件,此例用Test.txt。

然后打开Test.txt,可以看到中文:未设定群组

这样,就实现了简单的解码功能。