电脑和手机之间的通讯(一)

来源:互联网 发布:青岛关键词seo排名 编辑:程序博客网 时间:2024/05/01 01:04

    把手机通过数据线链接电脑最经常的操作就是当U盘和给手机充电。除此,还可以通过数据线和手机通讯,实现如收发短信,查看短信中心码,打电话,接电话等等的一系列操作。这种实现最简单的就是使用手机厂商配置的手机通讯软件。使用这类软件可以实现很多功能,如文件存取、电话本存取、短信收发备份等。

使用软件虽然方便强大,可是如果我不用这些软件行吗?难吗?和手机通讯的原理是什么呢?

非常幸运的是,现在的手机基本上都是使用AT指令集,它是一组与外部通讯的规范。通过相应的指令就可以实现各种功能。

最简单的指令就是“at”。为了演示这个功能,你可以通过开始菜单--程序--附件--通讯--打开 超级终端这个软件,让他连接到你手机的串口。接着你就可以输入“at”,然后回车一下。如果出现“OK”,那么就证明已成功和手机进行了通讯了。而例如收发短信,打电话之类的事情也不过是换个命令而已了。

如果你想进一步了解这些命令的话,最简单的方法就是网上搜索一下。如果你想更详细的了解或者更全面的认识(因为网上的资料一般比较零碎)的话,便可以去图书馆找找这方面的书,书里的介绍会更加详细。但是提醒一下,你很可能会找不到这方面的书,因为可能会像我一样,在计算机堆里的书架找个遍结果发现一无所获。原因很简单,去错地方了,这方面的知识是归属于电子类的TN和TM那里的,在TP类的计算机中找不到(不过这也难说)。

把大把的命令贴出来想必大家也不愿看,为了说明就只说几条比较常用的:

例1:在超级终端里输入:ATD110

      就表示拨打110的电话了。

例2:在超级终端里输入:ATH

      如果你现在的手机正在通话中,就会被挂断

例3:输入:at+cmgl=4

     就表示读取手机上所有短信

是不是很简单啊。

最近,就突然很想写个程序,用来读取短信息,这个想法来源于学生会开会时候说想在举行某个小品比赛中要现场投票,让人写小纸条的形式。一点也不好想像这种古老的方式,于是就想能不能用短信投票方式呢?当然向春晚和快女那样的投票平台肯定是不行的,所以我就想,能不能把信息发送到某个手机上,然后通过对该手机接收到信息进行分析后统计结果呢?经过思考后,感觉可行性还是有的。于是便研究起了与手机通讯这个东西上来了。

可以通过“at+cmgl=1”这条命令来读取未读短信的内容,那么通过读取后的信息,只要经过适当分析,便可以统计了。

虽然如此,但是短信息的内容原来不是一读就出来的,那些短信在手机里面是以一种叫做“PDU”码的格式存储的。于是,第一个需要解决的事情就是解PDU码。又是通过一轮网上搜索,好不容易找到了一点点较为详细的资料。按照文中自己摸索写解码。

一段挺简单的pdu,我却花了整个下午的时间才写出来。总共加上若干空行也才78行。自我感觉不行啊,脑子有点慢。其中也是有弯路的,例如一开始就觉得使用数组,然后通过移动下标来分析好,可是结果还是用字符串来的容易些;又如,按着文章的标准来写的,怎么也都不能正确解析,后来才发现啊,原来我的天语手机还是非标的,和at里面的规定有点差异,这还真折腾人。好在虽然不是按照文章说的一样的编码,但是大体还是相同的,研究了一下还是知道怎么改了。于是就写下了这么些:

---------------------------------------------------------------------------------

Module Module1

    Sub Main()

        Dim pdu As String = "0891683108707505F0040D91685198598765F3000890402261816023064F60597D3002"

        Console.WriteLine(chuli(pdu))

        Console.ReadLine()

    End Sub

    Function chuli(ByVal data As String) As String

        Dim seek As Integer = 0

        Dim sclength As Integer = CType(data.Substring(0, 2), Integer)

        Dim zhongxinma As String = data.Substring(seek + 2, sclength * 2)

        If zhongxinma.Substring(0, 2) = "91" Then

            zhongxinma = number(zhongxinma.Substring(2))      '手机中心码

            seek = sclength * 2 + seek + 2

        Else

            MsgBox("好像不对")

            Exit Function

        End If

        Dim weizhi As String = data.Substring(seek, 2)

        seek += 2

        Dim haomalength As Double = Val("&H" + data.Substring(seek, 2)) / 2 '手机号码长度

        seek += 2

        haomalength = Math.Ceiling(haomalength)

        Dim haoma As String

        If data.Substring(seek, 2) = "91" Then

            haoma = number(data.Substring(seek + 2, haomalength * 2)) '手机号码

        Else

            MsgBox("好像不对")

            Exit Function

        End If

        seek = seek + 2 + haomalength * 2

        Dim weizhi2 As String = data.Substring(seek + 1, 2)   '未知参数

        seek += 2

        Dim putong As String = data.Substring(seek, 2) '如果为08则为普通短信

        seek += 2

        Dim time As String = times(number(data.Substring(seek, 14)))   '日期

        seek += 14

        Dim contentlength As Double = Val("&H" + data.Substring(seek, 2)) / 2  '内容有多少个字符

        Dim neirong As String = content(data.Substring(seek + 2, contentlength * 4))

        Return "手机中心码为:" + zhongxinma + " 手机号码为:" + haoma + "  内容为:" + neirong

    End Function

    Function number(ByVal data As String) As String

        Dim str As String = ""

        For i As Integer = 0 To data.Length / 2 - 1

            str += Strings.StrReverse(data.Substring(i * 2, 2))

        Next

        str = str.Replace("F", "")

        Return str

    End Function

    Function content(ByVal data As String) As String

        Dim str As String = ""

        For i As Integer = 0 To data.Length / 4 - 1

            Dim temp As String = "&H" + data.Substring(i * 4, 4)

            Dim word As Char = ChrW(CType(Val(temp), Integer))

            str += word

        Next

        Return str

    End Function

    Function times(ByVal data As String) As String

        Dim yy, mm, dd, hh, ff, ss, riqi As String

        yy = data.Substring(0, 2)

        mm = data.Substring(2, 2)

        dd = data.Substring(4, 2)

        hh = data.Substring(6, 2)

        ff = data.Substring(8, 2)

        ss = data.Substring(10, 4)

        riqi = mm + "/" + dd + " " + hh + ":" + ff

        Return riqi

    End Function

End Module

---------------------------------------------------------------------------------

这里可要说明啊,如果你也想写pdu解码,千万别抄我的这个代码啊,各自不同的啊。

解决了解码问题,读短信的步伐就前进了一大步了,但是,还要从一大堆的串口回显中正确的取出这一堆堆的pdu码呢。这又是一个要分析的问题了。不过我现在还没做呢!所以待续咯------

 
下面附两张图片,为标准的pdu解码。