上一次发过一篇文章,是使用AT指令集对手机短信进行收发的。最近使用的时候发现了一些问题,因此进行了一系列的重构与修改。
问题:
(1) 有一些编码没有支持;
(2) 使用定时器接收短信,造成接收短信实时性很低;
(3) 所有操作均为同步操作,是应用程序效率降低;
调整:
1. 解码支持了3种编码:7位、8位与16位。
对应于PDU编码中的TP-DCS,7位对应为00,8位对应为08,16位对应为19。7位解码对应的算法为7-bit解码,8位与16位对应于UniCode解码。经过测试,可以将手机、飞信与一款国外手机收发短信软件的短信解码成功。
2. 抛弃定时器方式接收短信
前一版本中使用定时器对短信设备进行短信列表读取,AT+CMGL=4,这样造成实时性向当低,因此抛弃这种方式,采用轮询的方式进行设计,将发送短信列表命令与处理反馈信息封装为GetAllMessage方法。
在类中定义一个BackgroundWorker实例,在后台轮询此方法。如果接收到短信之后进行处理。受到新的短信后会触发一个事件,但是这个事件是在异步调用中发送的,在消费端使用时需要进行主线程处理。
3. 在接收短信时采用失败处理
我发现,如果手机终端对服务器发送短信过于频繁时,会出现读取不成功,解析随之不成功的问题。因此需要在Thread.Sleep(x),这个等待时间上下功夫。如果读取不成功,多等一等。我采用的方式就是将不成功的次数记录下来,如果发现有不成功的时候,瞪大的时间加长,让失败次数乘以默认等待时间,然后去等待,发现这个办法可行。但是如果客户端手机设备发送失败,我就没辙了。
4. 发送和接收的行为修改为异步
以前接收和发送都是同步的方式,这样效率颇低。现在把发送改为异步,接收短信在单独的线程中异步执行,采用BackgroundWorker方式。这样整个应用程序不会出现假死现象。