应用,一定要应用

BlogJava 首页 新随笔 联系 聚合 管理
  25 Posts :: 0 Stories :: 118 Comments :: 0 Trackbacks

#

自己写的一个小的发短信的程序一文中,我提到了一个我遇到的问题:
用手机(作为gsm模块)的话会因为手机截获了接收信息而不能达到聊天的效果,大家如果有什么好的方法可以在这里告诉我,或者给我email,邮箱地址是flyffa@gmail.com
这两天我有空来继续深入做的时候发现我自己犯了一个错误。用手机不能达到聊天效果的原因,不是因为手机截获了消息,而是因为消息的存储位置的变化,也就是说在简单的gsm模块中(如tc35i)消息是存储在sim卡中的,而在手机中,却是存在于ME中的,这个是由AT+CNMI决定的。
AT+CNMI指令语法为 :
AT+CNMI=[<mode>[,<mt>[,<bm>[,<ds>[,<bfr>]]]]]
其中mode指的是新短信到来时的通知方式。
而mt就指的是新短信到来时的存储方式。
  • 0 – 储存到默认的内存位置(包括class 3)
  • 1 – 储存到默认的内存位置,并且向TE发出通知(包括class 3)
  • 2 – 对于class 2,储存到SIM卡,并且向TE发出通知;对于其它class,直接将消息转发到 TE
  • 3 – 对于class 3,直接将消息转发到 TE;对于其它class,同mt=1
  • 这个默认存储位置就是由手机决定的了,在gsm0705规范的3。4。1节中,我们可以查到一段关于mt的描述,在具体的mt值的描述在gsm0338中,但这里有一句话需要注意:but use <mem3> as preferred memory,也就是说,gsm更加建议采用<mem3>做为默认的手机存储实现。

    现在的问题就是<mem3>是什么,在gsm0705的3.1节中,我们可以找到mem3的定义:
    <mem3> string type; memory to which received SMS are preferred to be stored (unless forwarded directly to TE; refer command New Message Indications +CNMI); refer <mem1> for defined values; received CBMs are
    always stored in "BM" (or some manufacturer specific storage) unless directly forwarded to TE; received status reports are always stored in "SR" (or some manufacturer specific storage) unless directlyforwarded to TE
    中间有一段话说值请参考mem1的值,查了一下mem1的值,有以下这些:
    "BM" broadcast message storage
    "ME" ME message storage
    "MT" any of the storages associated with ME
    "SM" SIM message storage
    "TA" TA message storage
    "SR" status report storage

    我再查了一下gsm0705的4.1节,关于pdu模式下的cmgl命令的执行,果然提到了存储的部分,Execution command returns messages with status value <stat> from preferred message storage <mem1> to the TE.
    这就开始有点明白了,gsm模块的<mem3>和<mem1>应该是一致的,所以,我们没有发现问题,但是手机下这两是不一致的,所以我读不到任何短信,我想应该是这样了,问题是如何读到呢。
    AT+CPMS提供了方法:
    命令:+CPMS=<mem1>[,<mem2>[,<mem3>]]
    返回:+CPMS: <used1>,<total1>,<used2>,<total2>,<used3>,<total3>

    命令:+CPMS?
    返回:+CPMS: <mem1>,<used1>,<total1>,<mem2>,<used2>,<total2>,<mem3>,<used3>,<total3>

    命令:+CPMS=?
    返回:+CPMS: (list of supported <mem1>s),(list of supported <mem2>s),(list of supported <mem3>s)

    我用Erricsion的t39做了个测试,超级终端下做的:
    at+cpms=?
    +CPMS: ("ME","SM"),("ME","SM"),("ME")

    OK
    at+cpms?
    +CPMS: "SM",0,25,"SM",0,25,"ME",0,40

    OK
    可以看到这里的<mem1>是SM,而<mem3>是ME,这就是问题所在了,由于这部手机的<mem3>不支持SM,所以把<mem1>设为ME,我的程序就可以运行了。
    以上是我解决这个问题的方法,不知道还有没有更好更方便的方法,如果有,希望能回复在blog下,我不甚感激。也欢迎同道中人关注和讨论。

    用tc35i做了个测试:
    at+cpms?
    +CPMS: "ME",0,25,"ME",0,25,"SM",0,25

    OK
    at+cpms=?
    +CPMS: ("MT","SM","ME"),("MT","SM","ME"),("MT","SM")

    OK
    这就让我有点郁闷了,这里的<mem3>和<mem1>不同,可并没有象我想象的那样,接收的短信被放到SIM卡中,而是被放到了ME中,是不是tc35i没有按照规范执行呢,请教各位。


    posted @ 2006-06-07 12:02 flyffa 阅读(1788) | 评论 (4)编辑 收藏

    20060526
    发出1.1版本,这个版本主要是在图形化界面上做了一些修改,为了提高一定的操作便捷性。
    下载地址:http://www.blogjava.net/Files/flyffa/javaSms1.1.rar
    1、将窗口改成了一般的聊天窗口形态,同时支持alt+s的快捷方式。
    2、窗口大小可拖拽
    3、增加发送声音和接收声音,以及在短信来的时候激活窗口
    4、将号码栏设置为下拉框形态,并提供地址自动保存功能,生成文件Address

    如果需要了解其他更多,访问:
    http://www.blogjava.net/flyffa/archive/2006/05/15/46177.html
    posted @ 2006-05-26 11:51 flyffa 阅读(899) | 评论 (0)编辑 收藏

         摘要: 1.1. 基本知识 短信开发指通过串口 at 命令驱动短信猫进行短信发送和接收操作。 在 java 中 主要使用 javax.comm 包进...  阅读全文
    posted @ 2006-05-15 11:22 flyffa 阅读(8811) | 评论 (21)编辑 收藏

    前段时间公司的工作涉及到了短信部分,写了一些程序,写来写去,觉得在电脑上发短信还是很方便的,就自己给自己写了一个,通过串口驱动gsm设备的短信程序。
    说是串口,其实红外口,蓝牙口,还是usb转换的com口,其实本质都是一样的,只要能在电脑里找到com口就行了。
    大家有兴趣的可以下载下去看看。下载地址列在这篇文档的下面。

    大多操作都很简单,把手机连上,(红外,蓝牙,数据线都可以)然后启动程序,当然,这是java写的程序,你的保证你的path里有$JAVA_HOME/bin的路径,或者你自己改我的bat文件也行。

    主要要注意的问题是波特率的选择,因为各个手机的各种连接方式的波特率都是不同的,选择的波特率不正确容易导致数据传输问题,甚至可能会失败。我现在不能自动获取端口的波特率,大家如果有什么好的方法可以在这里告诉我,或者给我email,邮箱地址是flyffa@gmail.com

    当然,你的手机要能支持标准的at命令了,程序是通过at命令完成的,比如发送的时候是at+cmgs,接收的时候用的是at+cmgl。

    有一个地方需要注意,我为了避免sim卡中的信息上溢,隔段时间就会把sim中的信息删除一次,呵呵,大家卡里有什么重要的内容最好提前保存起来。(1。2版本之后就不再自动删除了)

    程序写的还很不完善,后续慢慢支持吧。

    unix/linux主机没有测过,不过都是标准java,改起来应该也不难,后面有时间再继续支持吧。

    欢迎各路高手交流。

    使用说明:
    1、jdk1.4以上支持,请正确配置path,或者自行修改javaSms.bat中的命令。
    2、gsm模块一台,可以是专门的gsm模块,也可以是一些支持at命令的手机。
    3、程序在simens的tc35i模块上开发。用simens的s75,nokia的3230手机红外测试通过。
    4、西门子的SX1不能支持,由于其com口(红外,数据线,蓝牙)被内置的fax模块接管,不能直接连到gsm模块上,说白了就是不支持at命令,特别说明的原因是我的机器就是SX1,苦啊。
    5、手机或者gsm设备正确连接上电脑之后,设备管理里面应该出现一个新的com口(数据线方式连接),或者出现新的红外设备(红外方式连接),或者蓝牙设备(蓝牙方式连接),找到后通过属性可以查看其最高波特率,这个能有效帮助你选择javaSms的连接波特率。


    20060405
    发出第一版:
    下载地址:http://www.blogjava.net/Files/flyffa/javaSms.rar
    底层包实现了短信发送,超长短信发送,wap-push发送,超长wap-push发送
    图形界面实现短信发送,超长短信发送。
    图形界面支持com口选择,波特率选择。

    未支持:
    wap-push接收,超长短信接收。
    除了发送接收之外的其余四种短信格式,均未支持。

    20060526
    发出1.1版本,这个版本主要是在图形化界面上做了一些修改,为了提高一定的操作便捷性。
    下载地址:http://www.blogjava.net/Files/flyffa/javaSms1.1.rar
    1、将窗口改成了一般的聊天窗口形态,同时支持alt+s的快捷方式。
    2、窗口大小可拖拽
    3、增加发送声音和接收声音,以及在短信来的时候激活窗口
    4、将号码栏设置为下拉框形态,并提供地址自动保存功能,生成文件Address

    20060607
    1.2版本,下载地址
    http://www.blogjava.net/Files/flyffa/javaSms1.2.rar
    1、对联通手机号码进行支持,主要的处理就是在短信中心的控制上
    2、对容错能力进行提高,对于发送失败的信息,加以提示.
    3、解决以手机做为gsm模块时不能正常接收短信的问题,从而达到聊天的效果。
    4、停止自动删除短消息的功能。

    posted @ 2006-05-15 11:10 flyffa 阅读(7601) | 评论 (65)编辑 收藏

    向dudu申请了这个站点有些日子了,一直被些琐事缠身,一篇都没有贴,实在是汗颜,今天先开个张吧,回头有空再把该发的都发上来。
    做Java也有些年头了,中间也涉及到了各种各样其他的技术,写到这里,算是做个整理和记载吧。
    过两天把手头的项目忙完,再做个细致的分类吧。
    欢迎各路高手交流。

    posted @ 2006-05-12 11:43 flyffa 阅读(153) | 评论 (0)编辑 收藏

    仅列出标题
    共3页: 上一页 1 2 3