准备工作
众所周知,注册、登录一个网站,永远要填写手机号→手忙脚乱找手机收验证码,非常麻烦,那有没有什么办法能在电脑上插SIM卡收验证码?肯定有,只需要:
- 一张SIM卡(非
奠电信的),因为该模块背面的卡槽是中卡大小,所以可能还需要个卡套(直接插也能用,注意方向,不好拔出来) - 一个SIM模块,这里我使用SIM800C模块
- SSCOM,也可以使用自己喜欢的串口模块
- 电脑、手、聪明的大脑以及一个有信号的人类聚集地
图片上同款模块是板载CH340T USB转串口芯片的,若没安装CH340驱动需要去安装一下
我使用的是图上的模块,用CH340T USB转串口模块,大虾丁丁做的SSCOM软件因为大虾电子网已经关了,网上很难找到下载链接,这个是官方发布页:http://www.daxia.com/sscom/官方下载地址:http://www.daxia.com/sscom/sscom5.13.1.rar,若失效了下载这个SSCOM 5.13.1.7z
关于为什么不能使用奠信的SIM卡,是因为SIM800C 只支持 2G GSM,而中国网络基建情况:
| 运营商 | 2G状态 |
|---|---|
| 中国移动 | 仍有2G |
| 中国联通 | 部分地区保留 |
| 中国电信 | 从未使用GSM |
中国奠信在2G时代并没有采用GSM制式,而是采用的CDMA制式(CDMA2000/CDMA)
接码
把SIM卡插入模块,如果是小卡注意缺口朝外,然后打开SSCOM软件
端口号选模块端口号,不知道是那个可以插拔一下看看那个不见了,波特率选择9600,勾选加回车换行,然后输入AT,发送,若回复“OK”就是OK了。若没有回复OK,而是□或其他,那说明可能是没插牢、波特率错了,可以尝试把波特率依次改为9600 -> 115200 -> 57600,然后发送AT,那个回复OK就是那个。
注意,一定要在输入框里回车,或者勾选“加回车换行”选项!如果没有回车模块无法识别命令的,模块没有识别到换行符的话只会原样还回(或者忽略,取决于是否开启回显模式)
测试成功后输入AT+CPIN?查看SIM卡状态,若回应为:READY说明SIM卡已就绪
[21:02:03.079]发→◇AT+CPIN?
□
[21:02:03.127]收←◆AT+CPIN?
+CPIN: READY
OK
可选:输入
AT+CSQ查看信号强度,返回值+CSQ: 信号值输入
AT+COPS?查看运营商,返回值+COPS: 0,0,"运营商"输入
AT+CREG?查看网络注册状态,返回值+CREG: 0,1。0,1是已注册本地网络,0,2是搜索中,0,5是已注册漫游网络
当确认模块就绪,SIM卡已正确识别时就可以接码了,当收到短信时模块会主动向串口推送+CMTI: "SM",1,说明成功接收短信并储存存储器(SM)里,序号1,这时就可以执行以下步骤读取短信:
- 输入
AT+CMGF=1将模式切换为文本模式该命令只是让 AT 指令以文本方式操作短信,不影响短信的实际编码格式。
- 输入
AT+CMGR=1读取短信,这里的1就是刚刚CMTI的序号
SM表示 SIM 卡存储,如果配置为ME则短信会存在模块内部
如果一切顺利,返回的内容应该是:
[21:15:50.491]发→◇AT+CMGF=1
□
[21:15:50.515]收←◆
OK
[21:15:56.369]发→◇AT+CMGR=1
□
[21:15:56.446]收←◆
+CMGR: "REC READ","10692994314
[21:15:56.479]收←◆27239","","26/03/09,19:17:07+32"
[21:15:56.512]收←◆
301054D454E954D454E93011003700
[21:15:56.545]收←◆31003800360034003100204E3A4F6076
[21:15:56.577]收←◆84624B673A63627ED19A8C8BC17801FF
[21:15:56.611]收←◆0C8BF7572800355206949F51855B8C62
[21:15:56.644]收←◆1063627ED130024E3A4FDD8BC18D2653
[21:15:56.677]收←◆F75B895168FF0C8BF752FF6CC46F0F6B649A8C8BC178013002
OK
可以看到成功读取出短信了,+CMGR: "REC READ","1069299431427239","","26/03/09,19:17:07+32"这一行字符串是 SIM800C 的标准短信元数据响应,格式是+CMGR: "状态","发件人","","时间戳"
但是返回的内容是十六进制字符串,一般来说没有人可以直接阅读它,这时候就需要进行解码了,我做了个短信解码小工具,你可以直接在下方的输入框中输入进行解码,比如上面这个例子中我应该粘贴:
301054D454E954D454E9301100370031003800360034003100204E3A4F607684624B673A63627ED19A8C8BC17801FF0C8BF7572800355206949F51855B8C621063627ED130024E3A4FDD8BC18D2653F75B895168FF0C8BF752FF6CC46F0F6B649A8C8BC178013002
到输入框中,解码结果为:
【哔哩哔哩】718641 为你的手机换绑验证码,请在5分钟内完成换绑。为保证账号安全,请勿泄漏此验证码。
非常完美~
Tips: 本工具适用于 UCS2 编码短信(常见于中文短信),如果是英文短信直接阅读就行了。
短信解码工具
粘贴从串口收到的 Hex 字符串(如 301054D4...):
解码结果:
Tip:
在读取短信时可以把“加时间戳和分包显示”选项关掉,这样返回的内容就是:
+CMGR: "REC READ","1069299431427239","","26/03/09,19:17:07+32"301054D454E954D454E9301100370031003800360034003100204E3A4F607684624B673A63627ED19A8C8BC17801FF0C8BF7572800355206949F51855B8C621063627ED130024E3A4FDD8BC18D2653F75B895168FF0C8BF752FF6CC46F0F6B649A8C8BC178013002短信内容直接一长串返回无时间戳分包显示干扰,直接复制粘贴很方便
至此,成功实现最基本的在电脑上使用SIM卡模块接码功能,进一步更方便自动转码、系统提醒请等待下篇文章更新~~
为什么短信内容是十六进制?
在上述步骤中读取短信时,你会发现返回的内容并不是普通文字,而是一长串类似:
301054D454E954D454E930110037003100380036...
的十六进制字符串。
这是因为 短信在 GSM 网络中并不是直接以文字形式传输的,而是使用一种叫做 PDU(Protocol Data Unit) 的数据结构进行编码。
短信常见的编码方式有三种:
| 编码方式 | 用途 |
|---|---|
| GSM 7-bit | 英文短信 |
| UCS2 | 中文、日文等 Unicode 字符 |
| 8-bit | 二进制数据(基本见不到) |
其中:
- GSM 7-bit:每个字符使用 7 bit,最多可以发送 160 个字符
- UCS2:每个字符使用 2 字节(16 bit),常用于中文短信,最多 70 个字符
当短信使用 UCS2 编码 时,每个字符会变成:
2 字节 = 4 个十六进制字符
例如:
4F60 = 你
597D = 好
所以一条短信就会变成类似:
4F60597D...
的十六进制字符串。
所以在本文中使用的解码工具,其实就是把:
每4个十六进制字符 → 转换为一个Unicode字符
从而还原出真正的短信内容。
顺便提一嘴,有时候解码十六进制字符串后会发现短信内容不完整啊,咋话说到一半没了?为什么短信头部还有个乱码Ԁͺȁ?这是因为短信最多只能发 70 个中文 / 160 个英文,因为在 GSM 网络中,一条标准短信的数据大小其实是 固定的,叫做 SMS Payload,大小为:
140 Bytes
也就是 140 字节(1120 bit)。
单条短信之所以会出现最大70 个中文 or 160 个英文限制,是因为不同编码方式占用空间不同,短信常见编码有两种:
| 编码 | 每个字符占用 | 一条短信最多 |
|---|---|---|
| GSM 7-bit(英文) | 7 bit | 160 字符 |
| UCS2(中文) | 16 bit | 70 字符 |
而有的超长短信有不止70 个中文 or 160 个英文,这时候短信系统会自动使用 分段短信(Concatenated SMS),也就是把超长短信拆除几节并在短信头部加入一个 UDH(User Data Header)记录总段数、当前段序号、同一短信的标识,这时候在SIM800C模块里读取就会发现短信内容不完整,需要把剩下几段一并提取查看才行。
UDH头部通常表现为:
0500037A0201
之后正文才开始
0500037A02014F60597D
由于0500037A0201并不是合法的十六进制字符串,所以会显示为乱码。
至于这一串UDH头部啥意思可以对照下表:
| 字节 | 含义 |
|---|---|
| 05 | UDH长度 |
| 00 | 信息元素标识 (IEI) |
| 03 | IE数据长度 |
| 7A | 短信引用号 |
| 02 | 总段数 |
| 01 | 当前段序 |
AT指令大全
文末附上AT指令大全,感兴趣的可以研究下
简单联网测试
| 命令 | 说明 | 返回值 |
|---|---|---|
| AT | AT测试指令 | OK |
| ATE | ATE1设置回显,ATE0关闭回显 | OK |
| AT+CSQ | 网络信号质量查询,返回信号值 | OK |
| AT+CGMR | 查询固件版本 | OK |
| AT+CREG? | 查询网络注册状态 | OK |
| AT+CGATT? | 检查GPRS附着状态 | OK |
AT+CSQ 信号质量反馈
当发送 AT+CSQ 时,模组会返回:+CSQ: <rssi>,<ber>
<rssi> (Received Signal Strength Indication)
这是信号强度,范围是 0-31,以及一个特殊值 99。
- 0 - 9: 信号极差,基本无法通信。
- 10 - 14: 信号较弱,偶尔可能断连。
- 15 - 20: 信号良好,可以稳定工作。
- 21 - 31: 信号极好,连接非常稳健。
- 99: 模组未检测到信号或初始化未完成。
AT+CSQ 为什么只有 0-31?因为GSM 为了节省数据量,没有直接返回 dBm,而是返回 一个等级值,真实映射换算公式:RSSI = -113 + 2 × value (dBm)
| CSQ | 信号 |
|---|---|
| 0 | -113 dBm |
| 10 | -93 dBm |
| 20 | -73 dBm |
| 31 | -51 dBm |
<ber> (Bit Error Rate)
这是误码率。范围是 0-7。
- 0: 误码率极低,信号纯净。
- 7: 误码率极高,数据传输可能会频繁出错。
- 99: 未知/不可用。
TCP/IP通信
非透传模式下的客户端通信
| AT指令 | 指令说明 | 返回值 |
|---|---|---|
| AT+CGATT? | 检查GPRS附着状态 | OK |
| AT+CSTT=”CMNET” | 设置APN | OK |
| AT+CIICR | 建立无线链路 | OK |
| AT+CIFSR | 获得本地IP地址 | OK |
| AT+CIPSTART=”TCP”,”118.190.93.84”,2317 | 建立TCP客户端链接 | OK |
| AT+CIPSTART=”UDP”,”118.190.93.84”,2317 | 建立UDP客户端链接 | OK |
| AT+CIPSEND=<字符长度> | 发送指定长度字符串 | OK |
| AT+CIPCLOSE | 关闭链路通信 | OK |
| AT+CIPSHUT | 关闭PDP上下文连接 | OK |
透传模式下的客户端通信
| AT指令 | 指令说明 | 返回值 |
|---|---|---|
| AT+CGATT? | 检查GPRS附着状态 | OK |
| AT+CIPMODE=1 | 设置为透传模式 | OK |
| AT+CSTT=”CMNET” | 设置APN | OK |
| AT+CIICR | 建立无线链路 | OK |
| AT+CIFSR | 获得本地IP地址 | OK |
| AT+CIPSTART=”TCP”,”118.190.93.84”,2317 | 建立TCP客户端链接 | OK |
| AT+CIPSTART=”UDP”,”118.190.93.84”,2317 | 建立UDP客户端链接 | OK |
| AT+CIPSEND=<字符长度> | 发送指定长度字符串 | OK |
| AT+CIPCLOSE | 关闭链路通信 | OK |
| AT+CIPSHUT | 关闭PDP上下文连接 | OK |
HTTP通信
HTTP GET
| AT指令 | 指令说明 | 返回值 |
|---|---|---|
| AT+SAPBR=3,1,”Contype”,”GPRS” | 配置承载场景1 | OK |
| AT+SAPBR=3,1,”APN”,”CMNET” | 配置承载场景APN | OK |
| AT+SAPBR=1,1 | 激活一个 GPRS 上下文 | OK |
| AT+SAPBR=2,1 | 查询 GPRS 上下文 | OK |
| AT+SAPBR=0,1 | 关闭 GPRS 上下文. | OK |
| AT+HTTPINIT | 检查HTTP连接状态 | OK |
| AT+HTTPPARA=”CID”,1 | 设置HTTP会话参数 | OK |
| AT+HTTPPARA=”URL”,”hcyhub.com” | 设置HTTP会话参数 | OK |
| AT+HTTPACTION=0 | GET会话开始 | OK |
| AT+HTTPREAD | 读取HTTP服务器的数据 | OK |
| AT+HTTPTERM | 结束HTTP服务 | OK |
HTTP POST
| AT指令 | 指令说明 | 返回值 |
|---|---|---|
| AT+SAPBR=3,1,”Contype”,”GPRS” | 配置承载场景1 | OK |
| AT+SAPBR=3,1,”APN”,”CMNET” | 配置承载场景APN | OK |
| AT+SAPBR=1,1 | 激活一个 GPRS 上下文 | OK |
| AT+SAPBR=2,1 | 查询 GPRS 上下文 | OK |
| AT+SAPBR=0,1 | 关闭 GPRS 上下文. | OK |
| AT+HTTPINIT | 检查HTTP连接状态 | OK |
| AT+HTTPPARA=”CID”,1 | 设置HTTP会话参数 | OK |
| AT+HTTPPARA=”URL”,”hcyhub.com” | 设置HTTP会话参数 | OK |
| AT+HTTPDATA=100,10000 | 上传100字节数据,等待10000毫秒 | OK |
| AT+HTTPACTION=1 | POST会话开始 | OK |
| AT+HTTPTERM | 结束HTTP服务 | OK |
邮件收发
由于现代邮件服务器普遍要求 TLS 加密,该功能在实操的话可能无法直接使用
真男人就给我关掉加密裸奔。
发送邮件
| AT指令 | 指令说明 | 返回值 |
|---|---|---|
| AT+SAPBR=3,1,”Contype”,”GPRS” | 配置承载场景1 | OK |
| AT+SAPBR=3,1,”APN”,”CMNET” | 配置承载场景APN | OK |
| AT+SAPBR=1,1 | 激活一个 GPRS 上下文 | OK |
| AT+SAPBR=2,1 | 查询 GPRS 上下文 | OK |
| AT+SAPBR=0,1 | 关闭 GPRS 上下文. | OK |
| AT+EMAILCID=1 | 配置电子邮件参数 | OK |
| AT+EMAILTO=30 | 配置 SMTP 会话超时时间(秒) | OK |
| AT+SMTPSRV=”smtp.example.com”,25 | 设置SMTP服务器地址和端口 | OK |
| AT+SMTPAUTH=1,”admin@example.com“,”123456” | 设置用户名和密码 | OK |
| AT+SMTPFROM=”admin@example.com“,”admin” | 设置发送方地址和名字 | OK |
| AT+SMTPRCPT=0,0,”admin@example.com“,”admin” | 设置接受方 | OK |
| AT+SMTPRCPT=1,0,”admin@example.com“,”admin” | 设置抄送方 | OK |
| AT+SMTPSUB=”Test” | 设置邮件主题 | OK |
| AT+SMTPBODY=19 | 设置邮件正文 | OK |
| This is a new Email | 邮件内容 | OK |
| AT+SMTPSEND | 发送邮件 | OK |
收取邮件
| AT指令 | 指令说明 | 返回值 |
|---|---|---|
| AT+SAPBR=3,1,”Contype”,”GPRS” | 配置承载场景1 | OK |
| AT+SAPBR=3,1,”APN”,”CMNET” | 配置承载场景APN | OK |
| AT+SAPBR=1,1 | 激活一个 GPRS 上下文 | OK |
| AT+SAPBR=2,1 | 查询 GPRS 上下文 | OK |
| AT+SAPBR=0,1 | 关闭 GPRS 上下文. | OK |
| AT+EMAILCID=1 | 配置电子邮件参数 | OK |
| AT+EMAILTO=30 | 配置 SMTP 会话超时时间(秒) | OK |
| AT+POP3SRV=”pop.example.com”,”admin@example.com“,”123456”,110 | 设置 POP3 服务器地址和账户信息 | OK |
| AT+POP3IN | 登录POP3 服务器 | OK |
| AT+POP3NUM | 得到邮件总数和总的大小 | OK |
| AT+POP3LIST=1 | 得到第一封邮件的大小 | OK |
| AT+POP3CMD=4,1 | 读取第一封邮件 | OK |
| AT+POP3READ=1460 | 读取该邮件内容 | OK |
短信收发
| AT指令 | 指令说明 | 返回值 |
|---|---|---|
| AT+CMGF=1 | 设置短信模式为TEXT | OK |
| AT+CMGS=”PN” | 设置收信人 | > |
| AT+CSCS=”UCS2” | 设置信息文本为UCS2类型 | OK |
| AT+CSMP=17,167,2,8 | 设置文本模式参数 | OK |
| AT+CMGL=”ALL” | 查看所有短信 | 所有短信 |
| AT+CMGR=1 | 查看槽位为1的短信 | 槽位1短信内容 |
| AT+CMGD=1 | 删除槽位为1的短信内容 | OK |
| AT+CNMI=2,2,0,0,0 | 直接把收到的短信内容推到串口 | OK |
关于AT+CSMP指令完整语法是AT+CSMP=[fo],[vp],[pid],[dcs],具体参考下表
| 参数 | 含义 | 解释与常用值 |
|---|---|---|
| fo | First Octet | 第一字节。决定短信类型和发送选项。常用值 17,表示这是一个发送给短信中心(SMSC)的普通短信。 |
| vp | Validity Period | 有效期。决定短信在短信中心存储多久。0-167 表示 5 分钟到 24 小时不等。167 通常代表 24 小时(最大有效期)。 |
| pid | Protocol ID | 协议标识。通常设为 0,即默认协议。 |
| dcs | Data Coding Scheme | 数据编码方案。这是最重要的!0 代表 GSM 7-bit 编码(纯英文);8 代表 UCS2 编码 |
蓝牙调试
没错,SIM800C有蓝牙功能,具体指令:
| AT指令 | 指令说明 | 返回值 |
|---|---|---|
| AT+BTPOWER=1 | 打开蓝牙电源 | OK |
| AT+BTHOST? | 查询蓝牙名称和地址 | 返回蓝牙名称和MAC地址 |
| AT+BTSCAN=1,10 | 搜索蓝牙附近的设备 | 返回搜索到的蓝牙设备信息 |
| AT+BTPAIR=1,1 | 数字确认方式响应配对 | OK |
| AT+BTACPT=1 | 接受客户端的连接请求 | OK |
| AT+BTSPPSEND | 发送数据 | 返回>可以开始输入数据,发送16进制1A结束发送 |
| AT+BTPOWER=0 | 断开蓝牙电源 | OK |
门罗币钱包地址