{S0}指数{A}{A11}{A12}
{A14}{A15}{A16}{A17}{A18}{A19}{A20}{A22}
随着手机行业的广泛发展,我们的手机变得比以前更强大。今天,手机可以处理图像,声音,甚至视频。我们可以从手机的摄像头的图片,或从电脑或从网站下载。我有两个手机,西门子CXV65和诺基亚6021。它是枯燥的,我必须安装两个独立的软件,当我想转让他们的图片。这真的需要很多我的磁盘空间和减慢我的机器。
,虽然我们可以购买商业软件做到这一点,我不知道是否有可能发展自己的软件呢?这是一个惊人的想法,我没有完成。现在,我会告诉你,我怎么没在自上而下的角度来看,。在这篇文章中,您将了解什么是OBEX,FBUS,和插件的计划。我希望代码或数据的例子,在源代码中的注释,会给你一个清晰的画面。希望你喜欢这篇文章!{A23}
在我开始这个程序之前,我做了很多工作在SMS(短消息服务)使用Visual Studio 2003。 NET 1.1下很难找到一个真正稳定的和可扩展的串行端口类的,而正因为如此,大量的工作,在此期间失败。但今天,。NET 2.0和。NET 2.0 Framework精简版提供给我们下System.IO.Ports命名空间,这是稳定,可扩展和易于使用的的一个很好的串行端口类。所以,现在,我们可以写我们自己的串行端口的程序比以前容易得多。
我的手机是串行端口的手机,它提供了一个数据线插件。西门子CXV65手机有两种数据线,540数据线和510数据线。我对他们两个。 540数据线插入时,我的电脑会找到一个西门子调制解调器使用的COM3。 510数据线只是一个PL2303 USB到串行端口桥。诺基亚手机有两种电缆,DKU - 2和DKU - 5数据电缆。我的诺基亚6021使用DKU - 5数据线,也只是PL2303的桥梁。
正如您稍后将看到,西门子手机使用OBEX(对象交换)协议来处理文件传输,和大多数的诺基亚手机使用FBUS协议的协议,以及一些使用MBUS协议。 OBEX协议的详细记载,但很难找到FBUS文件。我将介绍OBEX和FBUS后来。
让我们开始!{A24}
完整的解决方案,包含七个项目:FileTransferCodeDemo
示范项目的主要形式。SDK
我的插件的软件开发工具包,其中包含:一个OBEX客户协议(OBEX文件夹)
提供的主要功能,包括连接,断开连接和文件传输。插件接口(IPhonePlugIn.vb)串行端口连接显示器(Monitor.vb)
自动检测这一计划的电话。插件在发现和使用服务(PlugInSerivce.vb)。插件
其他项目的所有插件。 SDK提供的服务主要是基于插件。所有插件仅用于演示,他们提供从PC只有一个单向传输到手机。索尼爱立信,西门子CX6C,摩托,自行车和OBEX协议的基础上。 NokiaS40 FBUS协议是基于。三星的协议是根据自身的AT。注意:NokiaS40 FBUS协议在PC电话传输只有一个核心技术,没有错误报告,没有失败的通知。如果失败,甚至造成死在您的手机文件,你不能删除它!!所有插件应使用您自己的风险!
我将重点放在SDK项目和插件。要获得这些项目的共同工作,请寻找到的FileTransferCodeDemo项目。{A25}{A26}
由于来自不同公司的手机都各有不同,我们可以不写一个单独的程序,以支持所有的手机。如果可能的话,,我们一定会是一个大的项目,将缺乏可扩展性。我们必须找到一种方法,使我们的生活变得更容易。插件计划将满足这样的需求:它的灵活。我们可以写一个主程序,剩下的唯一工作是只写插件和DLL文件复制。它易于管理。当我们发现漏洞,我们只需修改和测试单个插件而不触及其他插件和主程序。它易于使用。如果我有一个电话,我可以复制的DLL只有一个。{A27}
一个插件接口是一个重要的共同的功能,我们将使用在我们的插件的接口,它定义。所有插件将实现这个接口。后来,我的插件服务,会发现在DLL中实现这个接口的所有类。我的界面如下图所示:
{S2}{A28}
插件提供服务的能力,以搜索为DLL实现某个接口。 。NET提供的System.Reflection命名空间中从一个DLL中的反映。 FindPlugins功能发现所有的DLL,然后ExamineAssembly()函数使用反射来检查的DLL。的CreateInstance()函数用于创建一个对象实例的插件。请参阅有关详细信息的代码。我感谢作者写这些段。
我写了一个SelectPlugin()函数。此功能检查手机的模式ID和,然后比较LT;插件ingt。SupportModelID()字符串。如果它们匹配,函数将返回在插件数量来指示要使用哪一个插件。
可以很容易地检查了一个手机模型ID。你可以简单地发送AT命令称为quot; CGMMquot;到串行端口,然后比较返回的字符串。
{A29}
下面是代码段,以证明我的使用插件在计划:
{A30}
在这里,我将只显示你在我的代码中使用的操作一些基本的串行端口。对于更多的串行端口的例子,请参见MSDN文档。
首先,你必须System.IO.Ports命名空间导入到项目中。然后你创建一个新的SerialPort的实例,在这里,我们将它称为mPort。
然后,你必须做一些设置的串行端口。{C}
在这一点上,你可以简单地使用mPort.Write()或mPort.Read()来发送和接收二进制数据。要发送AT命令,你可以使用mPort.WriteLine()和mPort.ReadLine()。
下面是一个简单的函数发送和接收AT命令。Function SendAT(ByVal cmd As String) As String
mPort.NewLine = Chr(13)
mPort.WriteLine(cmd)
mATTimeOut = 1000
Dim response As New Text.StringBuilder
Dim start As Date = Now
Do
Thread.Sleep(10)
Dim rsp As String = mPort.ReadExisting()
response.Append(rsp)
If Now.Subtract(start).TotalMilliseconds > _
mATTimeOut Then
Throw New TimeoutException("AT TimeOut")
If response.ToString.Contains("OK") Or _
response.ToString.Contains("ERROR") Then
Exit Do
Loop
Return response.ToString
End Function
有关详细信息,请参阅我的程序的MSDN文件。{A31}
我发现了一个非常强大的工具,叫做HHD串口监听,监测和分析数据传输。它可以监视您的串行端口发送和接收的数据。最新版本可以发现{A32}。在这篇文章中,我使用的版本3.22,因为我发现我无法监视在4.0版本的调制解调器。{A33}{A34}
OBEX对象交换模式,这是一个IrDA或蓝牙技术的顶层协议的缩写。 OBEX是广泛应用于移动设备,如PDA和移动电话。我的手机支持OBEX。对于西门子,索尼爱立信,摩托罗拉,OBEX是易于使用,但诺基亚手机使用FBUS这是很难使用的OBEX。{A35}
关于这一问题的更多细节,请参阅{A36}协议。{A37}
这些例子是我以前的文章。我使用一个串口监视器来监视数据。是PC机的客户端和一个西门子M55服务器。
注意:
{S4}的
灰色用于真实数据的解释和黄色。
连接,断开连接
数据传输:
{五}文件发送到\声音\ 1.mid,313字节。
西门子拥有474个字节的最大包长度。因此,这个文件可以填写一个包。
简要过程:连接 - >切换到根- GT;切换到声音文件夹- GT; PUT - GT ;???/ p>
确切的过程:(忽略连接部分)
{中六}发送文件\图片\ 102725.jpg,5314字节。
简要过程:连接 - >切换到根- GT;切换到\ Pictures文件夹- GT; PUT - GT ;???/ p>
确切的过程:(忽略连接部分)
{七}{A38}
现在我们知道如何传输文件,但是我们怎样才能进入OBEX模式呢?一个移动电话公司,让他们自行决定如何进入OBEX模式。西门子
首先,你必须能够发送AT命令。然后,您发送"AT ^ SQWE = 0quot,等待响应,然后quot; ^ SQWE = 3quot,并等待响应。然后,你将在OBEX模式。
提示:我还可以看到在串行从GIPSY的OBEX状态西门子M55手机的工厂模式。
为了退出OBEX模式,请发送"quot;和等待超过一秒钟。摩托罗拉C650
,您必须能够发送AT命令。然后发送quot; AT模式= 22quot;,和你在OBEX模式。
要离开的OBEX模式,你应该关闭你的端口,然后重新打开,然后一切都会好的。索尼Ericssion T618/K508
,您必须能够发送AT命令。然后发送quot; * EOBEXquot,你会在OBEX的模式。{A39}
我Dreamworld.Protocol.OBEXClient.Command类提供了OBEX的基本操作,如连接,断开,上市文件夹,文件传输。你的工作,是落实EnterOBEX()和ExitOBEX()函数。对于更多细节为例,请参阅我的西门子CX6C项目。{A40}
正如我上面提到,FBUS协议已在互联网上没有详细的文件。据我所知,所谓的gnokii一个开源项目,该项目已做了一些工作,在这个协议的,但它仍然是不够细致。下一步做什么?我只能监视的文件传输过程中的其他软件,分析它,然后执行它。
进入诺基亚FBUS协议,你必须首先设置您的波特率为115200,并设置DTR = OFF和RTS = OFF。{A41}
FBUS要求作为帧的每一个数据段。这里是FBUS第2版(从的gnokii文件)的帧格式:名称说明FrameID0x1C的:红外/ FBUS
0X1E:串行/ FBUSDestDev,SrcDev0X00:手机
0x0c,0x10的:TE(PC)MsgType细节的gnokiiFrameLength[块]长度为2FrameToGo0x0n意味着有N - 1帧,此帧后。SeqNo[0xXY] X = 4:首块X = 0:继续块Y:序列号PaddingByte为0x00,如果FrameLength将是一个奇数,反正不存在ChkSum1异对帧的奇数ChkSum2异或上帧的偶数
让我们先来看看两个FBUS段从一个移动到PC:要求从PC
{S8}
你会发现,在发送第一帧之前,大量的0x55s发送。这些0x55s都被称为同步信号。为什么0x55s,而不是其他的十六进制值发送?你知道将0x55的二进制是1010101,而当在串行线上,这将是01010101。这些"0x55quot;将与重复quot; 01quot;,当手机接收到足够的quot; 01quot;,以确保该行是确定的,手机会切换到FBUS模式。
让我们来看看:第1帧
,这是一个请求帧版本的手机信息,请:
{S9}第2帧
这是一个确认框。每一帧TE发送将返回一个确认帧的MsgId = 0x7F的。它的格式是:
ID_Command:commandID您确认。ID_SeqNo:您确认的序列号。{FrameID, DestDev, SrcDev, 0x7F, 0x00, 0x02,
ID_Command, ID_SeqNo, ChkSum1, ChkSum2}
在我们的例子中,ID_Command是0xD1这是在我们的要求0xD1的ID。
ID_SeqNo是一个数等于(SeqNo和0x0F)。在这里,号(0x40和0x0F)= 0X00。第3帧
这是我们从手机的版本信息。注意这里的顺序是0x44。这意味着序列号是4现在。每次发送一个新的帧,序列号(SEQ 1)应付款当日8。所以第5帧的序列号应该是5。第4帧
应答帧到最后一帧。您必须返回一个确认到最后一帧,只要你接收和检查帧。通常情况下,你必须作出回应,约300毫秒内。如果没有,手机会重试三次发送相同的帧。如果没有确认帧收到手机,手机会断开链接。{A42}
我觉得很难给一个完整的例子来说明这一点,但我将展示如何做到这一点。请看看我的守则草案为例。第1步:切换到FBUS模式。如你所知,发送'0 X55"几次。第2步:发送,我所说的,初始化帧到手机。详情请参阅我的小组准备()。第三步:发送完整的文件名,包括在手机上的路径,并准备发送数据。见privateSendFile()。第4步:发送数据。见privateSendFile()。第5步:发送完整的消息。
我的代码是一个守则草案,所以这将是难以阅读,它将有错误,因为我有没有关于FBUS更详细的文件。通过监控其他软件,我学会了这些步骤。如果你愿意,你可以尝试和监控{A43号}。{A44}
下面列出了一些AT命令:AT命令说明AT FSCD ="LT; DIRgt;"切换到LT; DIRgt;AT FSDI ="LT; DIRgt;"目录信息AT FSDL ="LT; DIRgt;"目录列表在FSFW =- 1,"LT; FILENAMEgt;",0,"",LT; LENgt;,LT; CRCgt;发送文件。
FSFE = 0,"LT; FILENAMEgt; quot;删除一个文件。
让我们看一个例子:请求
答Change the directory to "/氓?戮莽?". Don't care the folder name here.
If your phone is English, then it will be /Picture
41 54 2B 46 53 43 44 3D 22 2F E5 9B BE E7 89 87 AT+FSCD="/氓?戮莽??
22 0D ".
请求Folder Successfully changed.
41 54 2B 46 53 43 44 3D 22 2F E5 9B BE E7 89 87 AT+FSCD="/氓?戮莽??
22 0D 0D 0A 4F 4B 0D 0A "...OK..
Repeat. I don't know why.
41 54 2B 46 53 43 44 3D 22 2F E5 9B BE E7 89 87 AT+FSCD="/氓?戮莽??
22 0D ".
请求Repeat. I don't know why.
41 54 2B 46 53 43 44 3D 22 2F E5 9B BE E7 89 87 AT+FSCD="/氓?戮莽??
22 0D 0D 0A 4F 4B 0D 0A "...OK..
答Write a file. 18752 is the length.
880445898 is unsigned CRC32 code for the file.
41 54 2B 46 53 46 57 3D 2D 31 2C 20 22 E6 B5 8B AT+FSFW=-1, "忙碌?
E8 AF 95 2E 6A 70 67 22 2C 20 30 2C 20 22 22 2C 猫炉.jpg", 0, "",
31 38 37 35 32 2C 38 38 30 34 34 35 38 39 38 0D 18752,880445898.
请求OK. You can continue. "##>" indicates continue your transfer.
41 54 2B 46 53 46 57 3D 2D 31 2C 20 22 E6 B5 8B AT+FSFW=-1, "忙碌?
E8 AF 95 2E 6A 70 67 22 2C 20 30 2C 20 22 22 2C 猫炉.jpg", 0, "",
31 38 37 35 32 2C 38 38 30 34 34 35 38 39 38 0D 18752,880445898.
23 23 3E 0D 0A ##>..
答Send data. Maximum data length is 512 bytes.
FF D8 FF E0 00 10 4A 46 49 46 00 01 02 00 00 01 每每..JFIF......
......
<Total 512 bytes data here>
请求Please continue.
0D 0A 23 23 3E 0D 0A ..##>..
答...
<Continue data segment>
请求...
答Send last segment of data. Phone will calculate
total data you send. When phone received
18752 bytes, it will return OK
91 56 53 E9 BF 5B 55 68 AF 8E 35 66 87 06 3D 35 VS茅驴[Uh炉?5f.=5
<.......>
E3 C6 63 31 E3 C6 63 31 E3 C6 63 31 E3 C7 FF D9 茫c1茫c1茫c1茫每
Phone has received all your data.
0D 0A 4F 4B 0D 0A ..OK..
这所有的过程中,容易和人类可读的。尝试方案!{A45}
现在是时候休息或咖啡。我认为文件传输,不应该作为你认为的那样神秘。
OBEX协议是广泛使用的和非常强大,但并不像FBUS微小。 FBUS是很难使用,缺乏详细的文件。否则,三星的AT命令是很清楚的使用的。
这将是一个长期的方法,使一个真正稳定的文件传输工具;我学习,等你。让我们分享我们的成功和失败。与我联系,如果你有问题阅读我的文章。{A46}{A47}{A48}
的gnokii提供工具和手机使用Linux下,各种UNIX系统,和Win32的用户空间的驱动程序。{A43}