1. 移远EC20模块与长短信收发基础在嵌入式物联网项目中短信通信是最可靠的远程通信方式之一。相比网络通信依赖基站信号和IP连接短信只需要最基本的蜂窝网络覆盖即可工作。移远EC20作为一款工业级4G通信模块支持通过AT命令实现短信收发功能特别适合用于远程监控、设备报警等场景。我第一次在项目中使用EC20发送长短信时发现当内容超过70个汉字时手机接收到的全是乱码。经过排查才发现普通短信有长度限制GSM编码下每条短信最多153个字符而UCS2中文编码下只有67个字符容量。这就引出了级联短信Concatenated SMS的概念——当内容超长时模块会自动将短信拆分成多条发送接收端再重新组装显示。级联短信的实现依赖三个关键技术点UDH头信息每条分片短信都携带序号和总条数唯一标识符同一组短信使用相同的Message ID编码一致性必须统一采用UCS2编码格式在EC20模块上级联短信功能已经内置实现开发者只需要通过正确的AT命令序列配置参数即可。不过中文环境下的使用有几个关键陷阱需要注意这也是我踩过坑之后要重点分享的内容。2. 环境准备与基础配置2.1 硬件连接与初始化使用EC20发送短信前需要确保硬件正确连接。以嵌入式Linux开发板为例通常通过USB接口连接EC20模块系统会自动生成多个/dev/ttyUSB设备节点。短信功能一般使用ttyUSB2端口波特率默认为115200。建议先用minicom或microcom工具手动测试AT命令microcom -p /dev/ttyUSB2 -s 115200输入AT后应该收到OK响应这表明模块已就绪。如果无响应请检查天线是否安装信号强度影响AT命令响应SIM卡是否插好建议使用支持4G的普通卡非物联网卡模块供电是否充足EC20峰值电流可达2A2.2 恢复出厂设置开始配置前强烈建议先执行恢复出厂设置避免历史配置干扰ATF这个命令会将所有参数重置为默认值返回OK表示成功。我曾在项目中遇到短信发送失败的问题最后发现是之前测试时修改了编码参数没有还原导致后续所有操作都异常。2.3 关键参数配置发送中文长短信需要一组特定的参数组合以下是必须配置的AT命令序列设置短信存储位置避免SIM卡存储空间不足ATCPMSME,ME,ME启用文本模式PDU模式不支持级联显示ATCMGF1配置UCS2编码中文必需ATCSCSUCS2设置短信参数关键参数组合ATCSMP17,167,0,8其中最后一个参数8表示使用UCS2编码这是支持中文的关键。我曾误设为0导致发送的中文全部变成问号。检查短信中心号码通常自动获取ATCSCA?如果返回空需要手动设置当地运营商短信中心号例如北京移动ATCSCA86138001005003. 长短信发送实战3.1 短信分段原理当短信内容超过单条限制时EC20会自动将其分割成多条发送。以中文短信为例单条限制67个汉字/字符超出部分按67字符分段每段添加UDH头接收端根据UDH重组显示为一条完整信息分段控制通过ATQCMGS命令的参数实现ATQCMGS号码,总段数,当前段序号,消息ID其中号码需转换为Unicode格式如00310038003600310035003300380030003900340033003300310030对应8615380943310消息ID0-255的随机数同一组短信保持相同3.2 发送完整示例假设要向8615380943310发送长短信《春江花月夜》前四句84字春江潮水连海平海上明月共潮生。 滟滟随波千万里何处春江无月明。实际操作步骤将手机号转为Unicode# Python转换示例 number 8615380943310 unicode_num .join([f{ord(c):04X} for c in number]) # 结果002B0038003600310035003300380030003900340033003300310030发送第一段前67字符ATQCMGS002B0038003600310035003300380030003900340033003300310030,2,1,123 66258F665E8698FB6EE54E009670CE67087155895F20FF0C6D77E54E0A67087151776E10665EFF0C6D0B6D0B968F7A7B975E26FF0C4F55E0424F55166258F666CA16709FF1F CtrlZ发送第二段剩余17字符ATQCMGS002B0038003600310035003300380030003900340033003300310030,2,2,123 4F55565E84265BFF1F CtrlZ注意输入内容后需要按CtrlZ发送不是回车。我在首次测试时因为按回车导致命令一直处于等待输入状态。3.3 电信卡兼容性问题根据社区反馈电信卡用户可能会遇到ERROR:350错误。这是因为电信已逐步关闭CDMA网络需要EC20 R08及以上版本支持VoLTE部分省份需要特殊APN配置解决方案确认模块版本ATI查看是否包含R08标识检查网络注册状态ATCEREG?返回,1或,5表示已注册必要时配置电信专用APNATQCFGims,1 ATQCFGapn,ctnet4. 短信接收与解析4.1 接收通知设置当有新短信到达时模块会通过URCUnsolicited Result Code通知。需要先配置通知方式ATCNMI2,1,0,0,0参数说明第一个2新短信立即通知忙时缓存第二个1将短信存储到ME内存并通知测试时我曾设为0导致收不到任何通知排查半天才发现是这个参数的问题。4.2 短信读取与解码收到通知后如CMTI: ME,0可以读取短信ATCMGR0返回示例CMGR: REC READ,002B0038003600310035003300380030003900340033003300310030,,23/08/15,14:30:2532 4F60597D其中4F60597D是Unicode编码的你好可以通过Python解码text bytes.fromhex(4F60597D).decode(utf-16be) # 输出你好4.3 级联短信重组当收到分片短信时观察两个特征短信内容开头有6字节UDH头如0500030A0102多条短信的Message ID相同处理流程提取UDH中的总段数和当前序号按序号缓存各段内容收齐所有段后去除UDH并拼接UCS2解码得到完整内容5. 常见问题排查5.1 ERROR:350错误分析这个错误在电信卡场景最常见可能原因包括模块不支持VoLTE需R08版本当地电信网络已关闭CDMAAPN配置错误解决步骤确认模块版本支持VoLTE检查网络注册状态ATCEREG?尝试手动设置APNATQCFGapn,ctnet5.2 中文乱码问题如果收到全是???或乱码检查编码是否设为UCS2ATCSCS?CSMP参数是否正确ATCSMP?确认第四个参数是8手机是否支持UCS2显示老年机可能有问题5.3 短信发送失败返回CMS ERROR时代码304内存已满需删除旧短信ATCMGD1,4代码305短信中心号错误重新设置ATCSCA8613800100500代码330SIM卡未插好检查硬件连接在实际项目中我建议每次发送前都检查短信中心号因为有些地区的自动获取可能不可靠。另外定期清理短信存储空间也很重要特别是需要长期稳定运行的设备。
移远EC20 4G模块长短信(级联)收发实战:AT命令详解与中文编码避坑指南
1. 移远EC20模块与长短信收发基础在嵌入式物联网项目中短信通信是最可靠的远程通信方式之一。相比网络通信依赖基站信号和IP连接短信只需要最基本的蜂窝网络覆盖即可工作。移远EC20作为一款工业级4G通信模块支持通过AT命令实现短信收发功能特别适合用于远程监控、设备报警等场景。我第一次在项目中使用EC20发送长短信时发现当内容超过70个汉字时手机接收到的全是乱码。经过排查才发现普通短信有长度限制GSM编码下每条短信最多153个字符而UCS2中文编码下只有67个字符容量。这就引出了级联短信Concatenated SMS的概念——当内容超长时模块会自动将短信拆分成多条发送接收端再重新组装显示。级联短信的实现依赖三个关键技术点UDH头信息每条分片短信都携带序号和总条数唯一标识符同一组短信使用相同的Message ID编码一致性必须统一采用UCS2编码格式在EC20模块上级联短信功能已经内置实现开发者只需要通过正确的AT命令序列配置参数即可。不过中文环境下的使用有几个关键陷阱需要注意这也是我踩过坑之后要重点分享的内容。2. 环境准备与基础配置2.1 硬件连接与初始化使用EC20发送短信前需要确保硬件正确连接。以嵌入式Linux开发板为例通常通过USB接口连接EC20模块系统会自动生成多个/dev/ttyUSB设备节点。短信功能一般使用ttyUSB2端口波特率默认为115200。建议先用minicom或microcom工具手动测试AT命令microcom -p /dev/ttyUSB2 -s 115200输入AT后应该收到OK响应这表明模块已就绪。如果无响应请检查天线是否安装信号强度影响AT命令响应SIM卡是否插好建议使用支持4G的普通卡非物联网卡模块供电是否充足EC20峰值电流可达2A2.2 恢复出厂设置开始配置前强烈建议先执行恢复出厂设置避免历史配置干扰ATF这个命令会将所有参数重置为默认值返回OK表示成功。我曾在项目中遇到短信发送失败的问题最后发现是之前测试时修改了编码参数没有还原导致后续所有操作都异常。2.3 关键参数配置发送中文长短信需要一组特定的参数组合以下是必须配置的AT命令序列设置短信存储位置避免SIM卡存储空间不足ATCPMSME,ME,ME启用文本模式PDU模式不支持级联显示ATCMGF1配置UCS2编码中文必需ATCSCSUCS2设置短信参数关键参数组合ATCSMP17,167,0,8其中最后一个参数8表示使用UCS2编码这是支持中文的关键。我曾误设为0导致发送的中文全部变成问号。检查短信中心号码通常自动获取ATCSCA?如果返回空需要手动设置当地运营商短信中心号例如北京移动ATCSCA86138001005003. 长短信发送实战3.1 短信分段原理当短信内容超过单条限制时EC20会自动将其分割成多条发送。以中文短信为例单条限制67个汉字/字符超出部分按67字符分段每段添加UDH头接收端根据UDH重组显示为一条完整信息分段控制通过ATQCMGS命令的参数实现ATQCMGS号码,总段数,当前段序号,消息ID其中号码需转换为Unicode格式如00310038003600310035003300380030003900340033003300310030对应8615380943310消息ID0-255的随机数同一组短信保持相同3.2 发送完整示例假设要向8615380943310发送长短信《春江花月夜》前四句84字春江潮水连海平海上明月共潮生。 滟滟随波千万里何处春江无月明。实际操作步骤将手机号转为Unicode# Python转换示例 number 8615380943310 unicode_num .join([f{ord(c):04X} for c in number]) # 结果002B0038003600310035003300380030003900340033003300310030发送第一段前67字符ATQCMGS002B0038003600310035003300380030003900340033003300310030,2,1,123 66258F665E8698FB6EE54E009670CE67087155895F20FF0C6D77E54E0A67087151776E10665EFF0C6D0B6D0B968F7A7B975E26FF0C4F55E0424F55166258F666CA16709FF1F CtrlZ发送第二段剩余17字符ATQCMGS002B0038003600310035003300380030003900340033003300310030,2,2,123 4F55565E84265BFF1F CtrlZ注意输入内容后需要按CtrlZ发送不是回车。我在首次测试时因为按回车导致命令一直处于等待输入状态。3.3 电信卡兼容性问题根据社区反馈电信卡用户可能会遇到ERROR:350错误。这是因为电信已逐步关闭CDMA网络需要EC20 R08及以上版本支持VoLTE部分省份需要特殊APN配置解决方案确认模块版本ATI查看是否包含R08标识检查网络注册状态ATCEREG?返回,1或,5表示已注册必要时配置电信专用APNATQCFGims,1 ATQCFGapn,ctnet4. 短信接收与解析4.1 接收通知设置当有新短信到达时模块会通过URCUnsolicited Result Code通知。需要先配置通知方式ATCNMI2,1,0,0,0参数说明第一个2新短信立即通知忙时缓存第二个1将短信存储到ME内存并通知测试时我曾设为0导致收不到任何通知排查半天才发现是这个参数的问题。4.2 短信读取与解码收到通知后如CMTI: ME,0可以读取短信ATCMGR0返回示例CMGR: REC READ,002B0038003600310035003300380030003900340033003300310030,,23/08/15,14:30:2532 4F60597D其中4F60597D是Unicode编码的你好可以通过Python解码text bytes.fromhex(4F60597D).decode(utf-16be) # 输出你好4.3 级联短信重组当收到分片短信时观察两个特征短信内容开头有6字节UDH头如0500030A0102多条短信的Message ID相同处理流程提取UDH中的总段数和当前序号按序号缓存各段内容收齐所有段后去除UDH并拼接UCS2解码得到完整内容5. 常见问题排查5.1 ERROR:350错误分析这个错误在电信卡场景最常见可能原因包括模块不支持VoLTE需R08版本当地电信网络已关闭CDMAAPN配置错误解决步骤确认模块版本支持VoLTE检查网络注册状态ATCEREG?尝试手动设置APNATQCFGapn,ctnet5.2 中文乱码问题如果收到全是???或乱码检查编码是否设为UCS2ATCSCS?CSMP参数是否正确ATCSMP?确认第四个参数是8手机是否支持UCS2显示老年机可能有问题5.3 短信发送失败返回CMS ERROR时代码304内存已满需删除旧短信ATCMGD1,4代码305短信中心号错误重新设置ATCSCA8613800100500代码330SIM卡未插好检查硬件连接在实际项目中我建议每次发送前都检查短信中心号因为有些地区的自动获取可能不可靠。另外定期清理短信存储空间也很重要特别是需要长期稳定运行的设备。