转贴:短消息 gsm modem 手机 c# 短信

第一次花时间写点东西,以前一直看大家的。

最近接触到了短消息的编程, 相信有不少兄弟已经实现了,我仅仅写一下自己的心得。

首先查了csdn上的帖子,其中有不少的广告,没相信他们:)
看了大家推荐的天极上面那个蚕蛹写的经典程序,收获颇大
以那个程序为核心,开始尝试。中间得到了egpscar的热情回复,特此感谢。

蚕蛹那个是不能不看的入门教程啊,一定要看
http://soft.yesky.com/SoftChannel/72342380468109312/20040523/1800310.shtml

还有 popcorn(米花) 提供的 http://0926.net/archive/sms.htm
还有一个at指令的下载地址 http://www.cetinet.com/download/list.asp?id=179

在蚕蛹示例程序的基础上, 我边调试边增加了一些控制,基本上可以达到每小时800条。
我用的是win form,暂时还没有用windowns service来做。

源代码下载地址
http://bbs.gzeasy.com/index.php?showtopic=275782  没有地方上传,就借用了gz的bbs

我增加了
1 多线程处理,以保证可以同时回馈com口读出的内容, 而不是等到读一个at命令返回结束才显示结果
2 读com口增加重试, 50ms读一次
3 读com口增加处理buffer,
因为发一个命令给com口以后, 然后读com口获取返回信息, 注意com口的数据读走就不保存在com口上了. 下次读就是新的了,50ms读一次,等下一次读或者读n次放到buffer中,才组成一个符合协议的字符串, 在这上我花了一点时间才搞清楚的, 让高手见笑了。这样就ok了.

我用我的西门子3518i手机, 然后在卖手机配件的那里买了一个数据线30块, 就开始调试了

这里说明一下, 这个程序有日志记录的, 可以在界面上看到两个数据框, 黑底绿字的是发送log, 白底黑字的是bufferlog。记录啥内容呢, 就是本次发送失败还是成功,如果失败,还会重新发的. 发送的内容在数据库里,用的是sql, 表在database目录下可以找到创建的文件, 一个扩展名为sql的.

我发了200条, 看日志重发了若干条, 接受端多收了2条. 不是很理想是吧, 而且每小时估计只有400~600条.

后来我打算买一个gsm modem, 主要原因是充电的问题,因为我数据线和充电的线用的接口是一个, 也不能老换电池呀. 插曲(后来蚕蛹告诉我说手机可以同时充电和连数据线的,不过我想可能需要有硬件支持, 再说后来设备买好了,我也就没尝试)

gsm modem这个东西上海不知道哪里有卖的,反正我是没找到, 然后在一些卖这种dd的网站论坛上询价, 主要是北京和福建广东, 就是我们经常收到你中奖了的,现在大家都知道是福建和广东的骗子发的消息,我估计他们用的就是这类设备不过模块更多而已, 这里没有说某地域人坏话的意思.呵呵

有一家给了我报价, 我不敢马上买,主要担心这个程序不能用, 我就让他帮我测试,结果好几天没有回复, 等待之中www.sendsms.com 的一个小伙给我来信说他们也卖, 我说那你帮我试试看吧, 这小伙没装.net, 竟然连windows update都没用过:(, 只好我传给他一个framework, 他辛苦帮我试了一下午, 结果是好用的. 这个小伙还是蛮主动热情的, 所以这里给想买专业设备的兄弟们提供一个去处. 算是对他敬业精神的鼓励吧,呵呵

收到设备以后, 我马上测试100条, 用了7分钟不到一点, 这样看一小时发800条没有问题的,而且发送端日志没有失败和重发, 接收的手机上也全部收到,没有重复.

这个设备和手机的差别给大家分析一下
我的手机的连接速度是19200bps,而这个gsm modem(wavecom的)只有9600
但是它主要是稳定和反应速度快, 像我的手机大概要等稍微长一点时间才会读出来ok还是error,这个modem很快的. 我重复读一次就在日志中打印一个点, 手机平均要打7,8个点,而modem大概4,5个点,而且因为手机连续发好像容易出现error, 然后重新发,虽然最后也能发成功,但是时间就浪费了.

好了基本就是这样,前后用了大概两个星期不到, 要是没有蚕蛹的代码, 我不知道要如何下手呢, 所以也提供我的代码给大家参考(在征得蚕蛹的同意以后), 希望能节省需要这个的兄弟们的时间, 没有啥注释,如有疑问和探讨可以写信给我guanfei@hotmail.com,要中文主题的,否则垃圾邮件太多我容易忽视的。下一步打算做读消息.估计也不会太难了.

希望大家喜欢,hoho,需要这个的人不多,放在csdn上供像我一样的人search到
2004-11-02 08:55

 




前一个关于[收短信]的帖子请看这里
http://community.csdn.net/Expert/topic/3512/3512498.xml?temp=.9925501

本次代码下载地址
http://bbs.gzeasy.com/index.php?showtopic=275782 看最后面的那个附件


本次

1 增加了收短信的功能, 采用的是米花提供的解码程序,感谢!

2 更正了justinio.cs 的一个问题,问题的现象是必须要用Hyper Terminal初始化一下com口以后,才可以正常使用,我前面没有注意,以为是特殊情况,经过调试和捕捉端口的信息,增加了dcbCommPort.fOutxCtsFlow = 524800; 就可以了。Com口编程我不了解,不知道为什么要这个值,知道的兄弟请解说一下。

3 因为增加了收的功能,对于收发并存,有两个方案
  a 收发交替,这样不需要锁
  b 收发同时进行,都用各自的线程,这样就需要锁来控制com口

  我采用了同时进行收发,所以增加了锁。 这样采用了2个线程分别控制收和发,每个线程都需要2个txtbox(一个是显示本线程运行到哪个步骤,一个是显示本线程的com口的buffer) 所以异步显示日志就采用了4个txtbox。

4 数据库文件还是那个database\sms.sql(用来在数据库中执行,生成表的脚本),增加了一个记录收的表,修改了原来那个发的表结构。数据库连接定义在AppConst.cs文件中

总结,短信收发程序分成3部分

1 com口编程采用蚕蛹原来使用的Justin Harrell 写的 justinio.cs
2 编码采用了蚕蛹的encode,和米花的decode,感兴趣的兄弟可以自行合并。
3 收发程序控制 在蚕蛹的基础上增加了重试、缓存、锁、日志显示部分采用异步,这样使收发和显示达到比较令人满意的程度。

另:收发的间隔和频率可以根据需要调整,我目前是估计设置的,没有经过大量的实践数据来优化

写好以后。经过两周左右的运行,修改了一些bug,现在基本没有问题了。如果作成windown service更加容易,不需要异步显示日志了。

感谢蚕蛹和米花的无私奉献,放在csdn上供像我一样需要这个的人search到。
guanfei@gmail.com

posted on 2005-04-20 14:41  Leon  阅读(2025)  评论(2编辑  收藏  举报

导航