重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如何使用AT命令操作SIM卡进行短信发送,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
创新互联长期为近千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为天宁企业提供专业的成都网站建设、成都网站制作,天宁网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
最近投身于某电子公司的用电信息采集终端软件重写,主要负责终端与主台的通讯功能编写。本周用到了AT命令操作SIM卡进行发送短信功能,在此做一个小小的总结,希望对有类似需求的童鞋能有所帮助。
注:由于有C语言源码,再加上鄙人对硬件实在是知之甚少,所以很多操作步骤都是按照原有逻辑进行重写(尤其是短信模块的初始化),若有错误,请各位酌情添加、删除或修改。
1、 硬件的初始化
在现有代码逻辑中按如下步骤进行硬件初始化:打开串口→重启SIM硬件模块→发送AT命令检查SIM卡运行状态。
a) 打开串口
串口操作已经有很成熟的代码,这里就不赘述了。
b) 重启SIM硬件模块
使用的魔法数字定义:
static const unsigned char RESET_CTL = 0;
static const unsigned char POWER_CTL = 1;
static const unsigned char IGT_CTL = 2;
重启步骤 | 硬件操作 |
turnOffModel() | int fd = open( "/dev/gprs_io", O_RDWR | O_NONBLOCK ) |
| ioctl( fd, 0, POWER_CTL) |
| sleep(3) |
| ::close(fd) |
startModel() | int fd = open( "/dev/gprs_io", O_RDWR | O_NONBLOCK ) |
| ioctl(fd, 0, IGT_CTL) |
| ioctl(fd, 1, POWER_CTL) |
| ioctl(fd, 1, RESET_CTL) |
| usleep(500000) |
| ioctl(fd, 0, RESET_CTL) |
| usleep(500000) |
| ioctl(fd, 1, RESET_CTL) |
| sleep(2) |
| ioctl(fd, 1, IGT_CTL) |
| sleep(3) |
| ioctl(fd, 0, IGT_CTL) |
| ::close(fd) |
| sleep(5) |
c) 发送AT命令检查SIM卡运行状态
操作步骤 | 发送的AT命令(C++转意格式) | 模块正常时回复的结果 | 结果含义 |
检测模块是否正常 | “AT\n” | AT OK | OK表示模块正常 ERROR表示模块异常 |
查询移动终端国际移动台标号 | “AT+CIMI\n” | AT+CIMI 460000973136668 | 第二行数字为移动终端国际移动台标号。 此处用于系统进行操作记录,可忽略结果。 |
检测SIM是否已注册到网络 | “AT+CREG?\n” | AT+CREG? +CREG: 0,2
OK | <0,2><0,5><1,2><1,5>均认为结果正确。 +CREG: mode,state mode: 0 : 禁止网络注册主动提供结果代码(默认设置) 1:允许网络注册主动提供结果代码,格式: state: 0:未注册,并且模块当前不搜寻新的运营商 1:已注册本地网络 2:未注册,终端正在搜寻基站 4:注册被拒绝 5:已注册,并且处于漫游状态 |
查看信号值 | “AT+CSQ\n” | AT+CSQ +CSQ: 13,5
OK | 第一个数字(即接收信号强度)大于6即认为可用。 +CSQ: 有效值0-31。值越大表明信号越好,16以下,呼叫有可能失败。 模块信号强度范围在-75到-125DB,换算到有效值公式为 31×(125-|DB|)/50 信道误帧率。 |
设置短信格式 | “AT+CMGF=0\n” | AT+CMGF=0 OK | 0:PDU模式。 1:文本模式。 |
2、 接收短信
操作步骤如下:
操作步骤 | 发送的AT命令(C++转意格式) | 模块正常时回复的结果 | 结果含义 |
获取短信数量 | "AT+CPMS=\"SM\",\"SM\",\"SM\"\r" | +CPMS: 4,50,4,50,4,50
OK | 此处取前两位数字: 4表示当前存储的短信数量; 50表示SIM卡可存储的短信总量。 |
获取短信1信息 | “AT+CMGR=1\r" | +CMGR: 1,,38 0891683108200845F7240D91683121436587F9 0000617072917253231 474747A0E4ACF416110BD3CA783C66F72D905 | 错误时会返回: AT+CMGR=1 +CMS ERROR: |
删除短信 | “AT+CMGD=1\r” | OK | 错误时返回 AT+CMGD=1 +CMGD ERROR: |
短信PDU码流解析:
0891683108200845F7240D91683121436587F90000617072917253231474747A0E4ACF416110BD3CA783C66F72D905
08 | 短信中心号码(含类型码)所占字节数 | 08表示之后8个字节(即16个十六进制数)为短信中心号码(含类型码) |
91 | 短信中心号码类型 | 91表示国际码 A1表示国内码 |
68 31 08 20 08 45 F7 | 短信中心号码 | 使用的是BCD编码,该例中短信中心号码为“8613800280547”。即所有字节高低位交换。F为填充码。 |
24 | 基本参数(TP-MTI/MMS/RP) | 含义未知 |
0D | 发送方电话号码长度(个数,非字节数,不含类型码) | 本例中为13个数字 |
91 | 发送方电话号码类型 | 91表示国际码 A1表示国内码 |
68 31 21 43 65 87 F9 | 发送方电话号码 | 本例发送方电话号码为“8613123456789”(请原谅我为了保护隐私,修改了这段码流) |
00 | 参数显示SMSC以何种方式处理SM (比如FAX,、Voice等) | 00表示是普通GSM类型,点到点方式 |
00 | 用户数据(UD)编码方案 | 00为7-bit编码,08为UCS2编码 |
61 70 72 91 72 53 23 | BCD编码,时间戳 | 本例为 16年7月27日19:27:35 +8时区 |
14 | 短信的实际长度。 | 本例为20个字节。 |
74 74 7A 0E 4A CF 41 61 10 BD 3C A7 83 C6 6F 72 D9 05 | 用户数据”this is a test code.”的7-bit编码。 | 用户数据所占字节数因“编码方案”不同而不同。 |
用户数据的实际字节数(1个字节为2个16进制数)计算方式:
7-bit编码: 短信实际长度*7/8,若有余数则加1.
UCS2编码: 短信实际长度.
其他方式(不推荐,仅用于保证程序的健壮性):短信实际长度和”/r/n”之间的数据。
3、 发送短信
操作步骤如下;
操作步骤 | 发送的AT命令(C++转意格式) | 模块正常时回复的结果 | 结果含义 |
发送短信 | “AT+CMGS=33\r" | > | 等待输入短信PDU编码 |
"0891683108100005F011000D91683121436587F90000AA 1474747A0E4ACF416110BD3CA783C66F72D905"+0xA1 | OK | 发送成功。 失败返回: +CMS ERROR: : 0xa1为 |
“AT+CMGS=33\r"中33表示发送的PDU编码中除去短信中心号码(”0891683108100005F0”)外的其他信息字节数(不含0xA1)。本例中为码流” 11000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905”的长度除以2.
短信PDU码流解析:
0891683108100005F011000D91683121436587F90000AA1474747A0E4ACF416110BD3CA783C66F72D905
08 | 短信中心号码(含类型码)所占字节数 | 08表示之后8个字节(即16个十六进制数)为短信中心号码(含类型码) |
91 | 短信中心号码类型 | 91表示国际码 A1表示国内码 |
68 31 08 10 00 05 F0 | 短信中心号码 | 使用的是BCD编码,该例中短信中心号码为“8613800100500”。即所有字节高低位交换。F为填充码。 |
11 | pdu类型 | 11:160个英文字符/70个汉字以内的短信,无短信报告 31:160个英文字符/70个汉字以内的短信,有短信报告 51:长短信(多条合并),无短信报告 71:长短信(多条合并),有短信报告 |
00 | 消息基准值(TP-MR) |
|
0D | 发送方电话号码长度(个数,非字节数,不含类型码) | 本例中为13个数字 |
91 | 发送方电话号码类型 | 91表示国际码 A1表示国内码 |
68 31 21 43 65 87 F9 | 发送方电话号码 | 本例发送方电话号码为“8613123456789”(请原谅我为了保护隐私,修改了这段码流) |
00 | 参数显示SMSC以何种方式处理SM (比如FAX,、Voice等) | 00表示是普通GSM类型,点到点方式 |
00 | 用户数据(UD)编码方案 | 00为7-bit编码,08为UCS2编码 注;与短信实际长度、用户数据要相对应,否则会返回531错误。 |
AA | 短信有效期(TP-VP) | 00 表示5分钟 AA表示最长 其他未知 |
14 | 短信的实际长度。 | 20个字节。与编码方案、用户数据相对应。 |
74 74 7A 0E 4A CF 41 61 10 BD 3C A7 83 C6 6F 72 D9 05 | 用户数据”this is a test code.”的7-bit编码。 | 用户数据所占字节数因“编码方案”不同而不同。 |
4、 关闭模块
turnOffModel()、关闭串口。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。