短信猫软件的实现(C#)<十>类库(API)完善
前一段时间完成了一个简单的类库,虽然可以完成可以完成短信猫短信的发送与接收,但是类库还不是很完善,现在奉上较为完善的版本。谢谢大家支持了啊。
完善后类库说明如下:
◆ 属性
序号 |
属性名称 |
数据类型 |
说明 |
1 |
CommPort |
bool |
串口号(运行时只读) |
2 |
BaudRate |
int |
设备与计算机的串口波特率 设计时和运行时都可以读写 |
3 |
IsOpen |
bool |
设备是否已经打开(只读) True 已打开 False 未打开 |
4 |
AutoDelMsg |
bool |
设置是否在阅读短信后自动删除SIM卡内短信存档(建议在经常接收短信时设置为 true) 设计和运行时都可以读写,true 自动删除 false 不自动删除 默认为 false |
◆ 方法
² 打开设备(Open)
功能描述: 打开与设备的通讯端口,设备初始化
参数: 无
返回: 无 (打开失败将抛出异常)
² 关闭设备(Close)
功能描述: 关闭与设备的通讯端口,设备关闭
参数: 无
返回: 无(关闭失败将抛出异常)
² 取得机器码(GetMachineNo)
功能描述: 取得机器码
参数: 无
返回: string 机器码字符串(设备厂商)
² 发送AT指令(SendAT)
功能描述: 向端口发送 AT 指令
参数: ATCmd string 您要发送的 AT 指令
返回: string AT指令返回结果 (如为错误,引发异常)
² 设置短信中心号码(SetMsgCenterNo)
功能描述: 设置短信中心号码
参数: sNewValue string 短信中心号码
返回: 无 (失败将抛出异常)
² 取得短信中心号码(GetMsgCenterNo)
功能描述: 取得短信中心号码
参数: 无
返回: string 短信中心号码
² 发送短消息(SendMsg)
功能描述: 发送一条短信息
参数: phone string 对方的手机号码
msg string 短消息内容
msgCenterNo string 短信中心号码(可选)
msgType 枚举MgType 短信类型{AUSC2:USC2编码,A7Bit:7位编码} 可选(不选时USC2编码)
返回: 无 (发送失败将抛出异常)
² 取得未读信息列表(GetUnreadMsg)
功能描述: 取得未读信息
参数: 无
返回: string[] 逗号分隔的未读信息列表字符串(中心号码,手机号码,发送时间,短信内容) (失败将抛出异常)
² 读取设备新收到的短消息(ReadNewMsg)
功能描述: 读取设备新收到的短消息
参数: 无
返回: string 信息字符串,同信息列表中格式(失败将抛出异常)
² 读取短消息(ReadMsgByIndex)
功能描述: 读取 SIM 卡中指定位置的短消息
参数: index int 短信序号
返回: string 信息字符串
² 删除短消息(DelMsgByIndex)
功能描述: 删除 SIM 卡中指定位置的短信
参数: index int 要删除 SIM 卡中短信的位置
返回: 无 (失败将抛出异常)
◆ 事件
² OnReceive 当短信到达时触发这个事件,请在此事件中调用ReadNewMsg方法
程序说明:
加入了7bit的编码,发送英文短信每条可以发送160个字符(原来程序中是按USC2编码发送的英文短信,最多只能发送70个字符)
有关编码的详细信息参考:短信猫软件的实现(C#)<三>PDU格式短信解析7bit的编码详细方案参考:短信猫软件的实现(C#)<九>7bitPDU的编码
7bit编码发送短信函数:
1: public void SendMsg(string phone, string msg, MsgType msgType)2: {
3: if (msgType == MsgType.AUSC2)4: {
5: SendMsg(phone, msg);
6: }
7: else8: {9:
10: PDUEncoding pe = new PDUEncoding();11: pe.ServiceCenterAddress = msgCenter; //短信中心号码 服务中心地址12:
13: string temp = pe.PDU7BitEncoder(phone, msg);14:
15: int len = (temp.Length - Convert.ToInt32(temp.Substring(0, 2), 16) * 2 - 2) / 2; //计算长度16: try17: {18: temp = SendAT("AT+CMGS=" + len.ToString() + "\r" + temp + (char)(26)); //26 Ctrl+Z ascii码19: }20: catch (Exception)21: {
22: throw new Exception("短信发送失败");23: }
24:
25: if (temp.Substring(temp.Length - 4, 3).Trim() == "OK")26: {
27: return;28: }
29:
30: throw new Exception("短信发送失败");31: }
32: }
和原来发送函数类似:仅仅改动的地方是调用的PDUEncoding的7bit编码。
另外,类还改动了GSMModem的字段,属性,方法;增加了有关API,便于短信猫软件的实现。
字段:添加了newMsgIndex和msgCenter,newMsgIndex用于保存一条刚收到的新信息的序号,msgCenter保存设置的短信中心号,发送短信使用
1:
2: private int newMsgIndex; //新消息序号3:
4: private string msgCenter = string.Empty; //短信中心号码
属性:添加AutoDelMsg属性,代表是否需要在读取信息后自动删除SIM卡中存档。
1:
2: private bool autoDelMsg = false;3:
4: /// <summary>5: /// 对autoDelMsg访问6: /// 设置是否在阅读短信后自动删除 SIM 卡内短信存档7: /// 默认为 false8: /// </summary>9: public bool AutoDelMsg10: {
11: get12: {13: return autoDelMsg;14: }
15: set16: {17: autoDelMsg = value;18: }
19: }
AutoDelMsg为true时,将在读取短信的方法中调用DelMsgByIdex删除对应SIM卡中内容。
方法:添加 取得机器码(GetMachineNo)、设置短信中心号码(SetMsgCenterNo)、取得短信中心号码(GetMsgCenterNo)、取得未读信息列表(GetUnreadMsg)、读取设备新收到的短消息(ReadNewMsg)
取得机器码(GetMachineNo):
1: public string GetMachineNo()2: {
3: string result = SendAT("AT+CGMI");4: if (result.Substring(result.Length - 4, 3).Trim() == "OK")5: {
6: result = result.Substring(0, result.Length - 5).Trim();
7: }
8: else9: {10: throw new Exception("获取机器码失败");11: }
12: return result;13: }
通过AT指令获取设备厂商名,若需要可以再添加其他内容。
设置短信中心号码(SetMsgCenterNo):
1: public void SetMsgCenterNo(string msgCenterNo)2: {
3: msgCenter = msgCenterNo;
4: }
仅设置msgCenter字段,发送短信时:编码部分代码改为
1:
2: PDUEncoding pe = new PDUEncoding();3: pe.ServiceCenterAddress = msgCenter; //短信中心号码 服务中心地址4:
5: string temp = pe.PDUUSC2Encoder(phone, msg);取得短信中心号码(GetMsgCenterNo):
1: public string GetMsgCenterNo()2: {
3: string tmp = string.Empty;4: if (msgCenter != null && msgCenter.Length != 0)5: {
6: return msgCenter;7: }
8: else9: {10: tmp = SendAT("AT+CSCA?");11: if (tmp.Substring(tmp.Length-4,3).Trim() == "OK")12: {
13: return tmp.Split(‘\"‘)[1].Trim();14: }
15: else16: {17: throw new Exception("获取短信中心失败");18: }
19: }
20: }
若字段msgCenter有值则直接返回,无则从SIM卡存档中读取。
取得未读信息列表(GetUnreadMsg):
1: public string[] GetUnreadMsg()2: {
3: string[] result = new string[255]; //可存储255条 SIM卡不能存这么多4: string[] temp = null;5: string tmp = string.Empty;6:
7: tmp = SendAT("AT+CMGL=0"); //发送AT指令 读取未读信息8: if (tmp.Substring(tmp.Length - 4, 3).Trim() == "OK") //读取成功9: {
10: temp = tmp.Split(‘\r‘);11: }
12:
13: PDUEncoding pe=new PDUEncoding(); //解码类14: int i = 0; //计数15: foreach (string str in temp)16: { //此条为PDU串
17: if (str != null && str.Length != 0 && str.Substring(0, 2).Trim() != "+C" && str.Substring(0, 2) != "OK")18: {
19: result[i] = pe.PDUDecoder(str); //解码
20: i++;
21: }
22: }
23:
24: return result; // 返回 空则无新信息25: }
列出所有未读信息,返回string[]类型,无新信息则返回空。
读取设备新收到的短消息(ReadNewMsg):
1: public string ReadNewMsg()2: {
3: return ReadMsgByIndex(newMsgIndex);4: }
新信息序号存在序号为newMsgIndex字段中,调用ReadMsgByIndex即可读取。
其他改动:有些方法的名称有少许改动,ReadMsgByIndex方法返回值类型和参数列表有些改变,算法没有变化,在此不做详细说明;详见附件项目文件
到此,较为完善类库完成!
欢迎大家提出宝贵意见,多谢大家的支持。
附件:工程项目文件