通过AT指令操作串口收发短信

在之前配置短信语音网关的时候买了一台华为EC122(CDMA)插电信卡使用,配置到gammu之后执行发送命令提示SMSC没有配置。
查了一下貌似CDMA没有什么短信中心号的东西。

且这台设备好多操作指令都是华为自定义的,gammu无法直接操作。
决定自己写程序操作设备串口实现短信收发。

基本思路:
1、程序文件打开串口设备,轮询串口返回;
2、当接收到+CMTI指令的之后解析指令的值,例如:+CMTI:”ME”,37,该指令意思是接到一条短信,存储在手机内存,存储Index为37;
3、通过指令:AT^HCMGR=37,读取短信内容,短信内容编码为UCS2格式,需要进行转码;

4、发送短信指令:AT^HCMGS=”电话号码” \CR\CL 之后跟着短信内容,然后输入Ctrl+Z即可发出。发送之前确认一下当前发送短信的内容格式:AT+CMGF,0为PDU格式,1为Text格式。

HUAWEI CDMA AT Command文档
Ref: http://www.letswireless.com/asp_bin/downfile/2009929121443234.pdf

TODO: 理论上上网卡总是可以通过程序操作串口发送AT指令进行操作,后续考虑完全自己实现,连gammu都不用了。

根宝了不起

作为一个伪球迷,昨天也是一个相当开心的日子:上海上港足球俱乐部夺得中超联赛冠军。
这是中国顶级足球联赛冠军时隔23年重回上海(上一次还是1995年,根宝带领的申花)。

我倒是基本上一直粉球星不太粉球队,比如之前德国队的巴拉克、西班牙队的托雷斯,再到武磊,差不多是2013年前后开始粉武磊。

早上刷微博,看到一张图,从昨天晚上开始累积的情绪瞬间释放 在中环上 止不住的泪流满面,触碰到心里柔软的地方。

还有多少人记得当年的根宝足球网?

短信语音网关的一些记录

Just For Fun. 这些事情就是乐趣本身,有人从看剧中获得满足感,有人从游戏中获得满足感,而我的乐趣来源更多是折腾这些东西,这些也都是我的小玩具。

事情要回到年初:换了iPhone之后,由于没有双卡,不得不随身带2个手机,作为热点以及小号。

期间有尝试过找一些解决方案,比如使用SIM800的扩展板接到NanoPi上实现自动接收转发短信,但是扩展板就成本来讲还是略高,暂时搁置。

直到前几天看到可以使用“上网卡”来实现发短信以及语音电话功能,瞬间选择就多了不少。3G时代的各种品牌的上网卡在闲鱼上淘淘,20块包邮就可以到手,成色非常新,原盒包装都还在。

作了一番调研,选择主要有两大品牌:华为和中兴ZTE。这类设备的英文名称一般是叫做:USB 3G Modem Dongle,如果是搜索英文资料可以基于这个关键词搜索。

抱着试试看的态度先买了一个中兴的MF190,是一款WCMDA的联通3G上网卡,默认开启短信功能,没有提供语音电话功能(插上卡之后拨打该号码会提示正在通话中),接到电脑可以正确识别出,虽然是联通定制款上网卡,但是插入移动的SIM卡也是可以正常收发短信,只不过需要一点点设置,该上网卡默认首选的网络制式是3G的WCMDA,这种制式移动SIM卡不支持,需要将网络制式调整为GPRS,这样就可以了,具体操作如下:

1、eject /dev/sr0 (设备名称根据实际情况确定),弹出网卡的cdrom之后,网卡就会切换为modem运行模式;
2、连接到设备串口,波特率是9600,执行执指令:
      AT+ZOPRT=5(保持在线)
      AT+ZCDRUN=8(禁用CD自动运行)
      AT+ZSNT=1,0,0(切换为GPRS网络)
      AT+COPS?(执行该命令可以查询当前连接的移动网络名称,如正常则会返回China Mobile相关字样)
3、执行完上述指令之后可能需要根据实际情况重新插拔上网卡才会生效;
4、语音电话功能网上找了很多资料都没有找到如何开启,也罢,单纯作为短信使用。

操作成功之后又在咸鱼淘了3台MF190,有点冲动了。

说完了中兴,现在说说华为。
华为相关的案例以及资料比中兴更多,看来通信类的产品还是首选华为,因为用的人多,遇到问题更容易解决。

选择了一台E261的联通3G上网卡,可以解锁实现语音通话功能,昨天刚到手还没有时间去折腾,周末再补充。

插曲:关于USB Hub的选择,一下子买了这么多USB上网卡,NanoPi只有一个USB,完全不够用,势必要买个USB Hub,作了一番调研,主要选择如下,按照网上的评价排名:

1、西普莱,之前也没听过,在SMZDM看评论有人提到说做工很好,搜索了一下,不少人买这个牌子的Hub做群控,看来品质还可以;
2、Anker,国人做的牌子,主要面向海外市场,做工以及口碑不错,但是国内只能淘宝或者咸鱼淘淘了;
3、Orico,据说是给Anker代工的,京东有一款京造的USB Hub好像也是Orico做的,但是口碑上不太好,据说容易坏,但是他们的Hub用的是威盛的USB Hub芯片,所以打算选择他们家的产品;
4、绿联,之前买过不少他家的线材,也买过一个USB 3.0的一拖四的Hub,轻度使用下来倒也正常,没出过什么问题,接的都是低功率设备,对电源没什么要求;

3G上网卡通信峰值电流要求可能高达1A,所以Hub务必需要带独立辅助电源,电源功率上来看,绿联有24W的,Orico 有36W的,Anker有高的60W的产品,综合下来比较倾向于Orico的36W产品,继续咸鱼淘淘。

最终选择了西普莱10口的Hub。


短信服务软件的选择:
1、kannel,最先研究的方案,细节的配置较多比较繁琐,暂时不考虑
2、smstools,第二研究的方案,已经配置好能够收发短信了,但是嫌麻烦:短信需要转码处理
3、gammu,第三研究的方案,自带数据库存储接口,短信接收到之后可以配置直接存入数据库,很方便

配置记录:
1、后端服务使用gammu,配置存储为:MySQL SQLITE
2、在gammu的RunOnReceive配置项设置触发脚本,在接收到短信的时候执行,可以在脚本里处理长短信合并,以及调用WebHook等等,更多功能就发挥自己想象力了

最终我们是要将操作系统接收到的短信让我们自己的手机可以看到,那么方式无外乎以下几种:
1、直接转发,这个最简单,但是如果是没有短信套餐的话,转发短信是需要额外付费的,我希望成本最小化,1毛钱都不想多付
2、通过邮件发送,这种可能会被邮件服务商拦截为垃圾邮件,邮件的及时性也是一个问题,作为可选方案
3、通过微信推送,这个需要申请公众号才能操作推送服务,虽然有ServerChan已经提供了这类功能,但是短信内容隐私性比较强,还是选择自己搭建服务比较可靠,暂不考虑
4、集成第三方的推送服务比如有人使用PushOver来实现,PushOver也是需要付费,暂不考虑
5、提供Web网页访问接口,需要的时候访问网页即可获得短信内容,手机上只需要保存一个网页的快捷方式即可,目前定下这个方案。

处理流程:
1、创建一张新表,比如叫做pushsms(ID, PhoneID, SenderNumber, Message, CreateAt)
2、接收到短信之后触发脚本,存储到pushsms表,如是长短信,还需要进行短信合并
3、新建一个脚本从pushsms读取短信提供Web访问

处理好短信之后接下来就是搭建一个VoIP网关,转发通话至手机,基本思路:
1、先构建VoIP网络,外线呼入使用USB Modem接入,可以设置通话路由规则,很灵活
2、手机安装VoIP客户端,配置接入自己搭建的VoIP网关,分配内网分机号,当小号手机有电话呼入的时候VoIP网关转发通话至手机的分机号,实现通话功能
3、待续,周末继续折腾