佰马BMD100 5G/4G DTU是为无人值守场景设计的无线数传终端,常用于工业物联网、智慧水利、智慧环保等领域,实现数据无线传输。告警短信群发,也是其中一项常用的功能,经常被应用于远程监测告警信息发布、报警短信发送等,可以同时发送到20个手机,可以在后台预设告警信息发布的内容、告警信息接收的手机号码等。
案例:DTU短信群发在某空调生产公司的典型应用:
空调测试台位自动化的项目,软件由Labview编写。 有一项功能为:当某传感器值超过阈值后,要立即发送报警短信给每个测试员。即使测试员不在公司也要能即时收到此报警短信。 因此需要一台可以通过上位机编程控制的DTU设备实现这个发送短信的功能,要求成本低,信号稳定。
佰马BMD100 5G/4G DTU实现短信群发的配置步骤:
1.使用佰马配套的DTU管理软件,直接出厂设置即可
比如要把 “设备使用异常”这种告警短信发送给13912345678和18812345678,现在直接可以向串口发送: #13812345678,13912345678#设备使用异常#,接受号码每隔5个一组,组与组之间要用英文分号隔开,一次最多4组。
2. DTU开启短信备份功能
DTU里面配置好接收短信的号码,最多20个,然后往串口发数据,则DTU会把数据发给接收号码
3. AT指令发送
DTU配置成modem模式
然后通过发AT指令发短信,具体实现过程如下:
用AT命令发送中文短信(PDU模式中英文混发)
实例:
接收号码:13812345678
内容:你好PDU模式
发送的AT指令
发送: AT+CMGF=0 (回车换行)
接收:OK
发送: AT+CSCS="UCS2" (回车换行)
接收:OK
发送:AT+CMGS=29 (回车换行)
接收:>
发送:
0011000D91683118325476F80008AA0e4f60597d0050004400556a215f0f(用ASCII类型发送)
发送:1A (Ctrl~z) (用16进制类型发送)
接收:+CMGS: 168(168:发送了多少条短信数量)
(不回车换行)
00 //为SCA预留
11 // FO 设置PDU 类型
00 // MR 发送参考号
0D //DA 目的号码长度
91 //DA 目的号码类型
68 //DA 中国的区号
3118325476F8 //接收号码编码 奇偶位互换,接收号码为奇数个末尾用F补充
00 // PID 发送方式
08 //DCS 编码模式
AA //VP 有效期
PDU 中用户数据前的PDU 头的长度是15 字节
0e //UDL 数据长度(16进制)
4f60597d0050004400556a215f0f //短信 数据内容Unicode 译码
发送拼接方式:
根据规律有些数据可以不变
0011000D9168+接收号码编码+0008AA+内容长度+数据内容Ucde 译码
接收号码编码:
列如:13812345678
1. 因为位数是奇数11位所以在末尾加F变为:13812345678F
2. 进行奇偶位置互换变为:3118325476F8
以Java代码为列下面是奇偶互换代码
public static String Odevity(String string) {
String st ="";
if((string.length()&1) !=1) {
for (int i = 0; i < string.length(); i++) {
if((i&1) != 1){ //是偶数
st += string.charAt(i+1);
}
else {
st += string.charAt(i-1);
}
}
}
return st;
}
短信内容转换成Unicode 译码
下面是任何内容转换成Unicode 译码Java代码
public static String GBK2Unicode(String gbString) {
char[] utfBytes = gbString.toCharArray(); //utfBytes = [测, 试]
String unicodeBytes = "";
for (int byteIndex = 0; byteIndex < utfBytes.length; byteIndex++) {
String hexB = Integer.toHexString(utfBytes[byteIndex]); //转换为16进制整型字符串
if (hexB.length() <= 2) {
hexB = "00" + hexB;
}
unicodeBytes = unicodeBytes + hexB;
}
return unicodeBytes;
}
发送内容长度计算
如:真实内容长度/2=发送内容长度(要转换成16进制)
如果转换成16进制长度少于2位在前面加个0
列:28/2 = 14 转换成16进制得到“e” 少于两位要在前面+0 得到“0e”。
佰马Baimatech,集M2M产品研发、IoT平台服务、国际化运营于一体,让我们联接,共创未来