常用AT指令

常用AT指令:接打电话 发送中英文短信 监听拨号键…

最近几天在开发项目时用到了AT指令,在这里记录一下,希望可以帮助到有需要的人

AT指令简介
用户可以通过AT指令进行呼叫、短信、电话本、数据业务、传真等方面的控制。现在各模块的基础AT指令集都已经标准化了,一般都是通用的。不过各模块厂家也会添加一些自己封装的AT命令,但也都是以AT为起始。

可以先自己用电脑或手机下载串口调试助手用来检测设备是否可用

基本AT执行流程
1.检测是否连接成功

发送:AT
返回:OK
OK代表连接成功 可以进行下一步操作

2.拨打电话

发起语音呼叫:ATD137****1302;必须要加上分号,请注意!!!! 
挂断呼叫:ATH
接听来电:ATA 

3.发送英文短信(TEXT模式)

发送:AT+CMGF=1
返回:AT+CMGF=1
OK 
发送:AT+CSCS="GSM"
返回:AT+CSCS="GSM"
OK 
发送:AT+CMGS="13717861302"   
返回:AT+CMGS="13717861302"
发送:XXXXXX(0-9,A-Z)[XXXXX是指阿拉伯数字0-9,英文26个字母A-Z]  
注意:XXXXXX为要发送的短信内容
返回:XXXXXX(0-9,A-Z) [XXXXX是指阿拉伯数字0-9,英文26个字母A-Z] 
发送:1A(十六进制发送)
注意:成功发送后会有+CMGS 指令返回
  > 

比如用手机发送短信“LCTECH”到 “10086”。步骤如下:
发送英文短信的步骤

4.发送中文短信(PDU模式)
下面我用一个简单的例子来写一个通过AT命令发送中文短信的过程
首先我们需要准备

 短信中心:+8613800100500 短信中心号码可以自行百度获取
 收信号码:+8613717861302
 短信内容:我爱听评书

第一步:格式化短信中心号码

1 - 要去掉“+”号,然后看看长度要是奇数的话就在末尾追加一个“F”。
    +8613800200500 >>>> 8613800100500F
2 - 将奇数位和偶数位交换位置。
    8613800100500F >>>> 683108100005F0
3 - 在前面加上“91”,是国际化的意思。
    683108100005F0 >>>> 91683108100005F0
4 - 最后算一算它有多长了,把长度除于2,再把结果转换为2位的16进制数,加在最前面。
    91683108100005F016 16/2=8 816进制“08” 一定要注意是291683108100005F0 >>>> 0891683108100005F0

通过java代码实现我已经写过了 待会写在文章的后面 有需要的可以直接拿去用

第二步:格式化收信号码

1 - 要去掉“+”号,然后看看长度要是奇数的话就在末尾追加一个“F”。
    +8613717861302 >>>> 8613717861302F
2 - 将奇数位和偶数位交换位置。
    8613717861302F>>>> 683117871603F2

第三步:格式化发送内容

1 - 把字符串转换为Unicode格式
    我爱听评书 >>>> 62117231542C8BC44E66
2 - 把串Unicode码的长度除于2,再把结果转换为2位的16进制数,加在最前面。
    62117231542C8BC44E66长20 20/2=10 1016进制“0A”
    62117231542C8BC44E66 >>>> 0A62117231542C8BC44E66

现在看看我们手里都得到了什么东西

格式化后的短信中心:0891683108100005F0
格式化后的收信号码:683117871603F2
格式化后的发送内容:0A62117231542C8BC44E66

第四步:对我们手里的东西进行组合处理

1 - 算一下收信号码的长度,不包括“+”号。这个收信号码指的是+8613717861302,而不是683117871603F2+8613717861302>>>> 8613717861302长度为“0D”(216进制数表示)
2 - 在长度前后分别加“1100”。
    0D >>>> 11000D
3 - 如果收信号码是手机的话就在后面追加“91”,如果是小灵通的话就要追加“81”。
    +8613717861302是手机号码所以加“9111000D >>>> 11000D91
4 - 11000D91 + 格式化后的收信号码 +000800+ 格式化后的发送内容=
    11000D91 >>>> 11000D91683117871603F20008000A62117231542C8BC44E66
5 - 计算上面那一大字符串的长度除于210进制表示。
    11000D91683104011415F6008000A62117231542C8BC44E66长50 50/2=25

再看看手里现在都有什么

格式化后的短信中心:0891683108100005F0
实际的发送内容:11000D91683117871603F20008000A62117231542C8BC44E66
发送内容的长度:25
都准备好了我们可以发短信了 ^_^

最后一步:通过AT命令发送中文PDU短信

 发送:AT+CMGF=0 <回车> (告诉它你要发的是中文PDU类的短信)
 返回:OK (这是它返回的它说:“我已经准备好了”)
 AT+CMGS=25 <回车> (告诉它你要发的实际长度)
 >0891683108100005F011000D91683117871603F20008000A62117231542C8BC44E66  (看到它返回“>” 在后面输入格式化的短信中心+实际的发送内容)
 发送:1A(HEX格式 这个代表发送的指令)

如果最后返回不是“ERROR”,那就是发送成功咯~

下面是通过java代码实现格式和各种转换 自己写的直接用 本人亲测!

	//格式化短信中心号码
    public static String smsCenter(String s) {
        String str = "";
        String replace = s.replace("+", "");//去掉+号
        String s1 = reverseString(replace);//如果是奇数后补F 将奇数位和偶数位交换位置
        s1="91"+s1;//在前面加上“91”,是国际化的意思
        String s2 = Integer.toHexString(s1.length() / 2);//计算它的长度/2,再把结果转换为2位的16进制数,加在最前面
        str="0"+s2+s1;
        return str;
    }

	//格式化收信号码
    public static String smsNumber(String s) {
        String str = "";
        String replace = s.replace("+", "");//去掉+号
        str=reverseString(replace);//如果是奇数的话就在末尾追加一个F 将奇数位和偶数位交换位置
        return str;
    }
    
	//格式化发送内容
    public static String sendSmsContent(String s) {
        String str = "";
        String convert = convert(s);//把字符串转换为Unicode格式
        String s2 = Integer.toHexString(convert.length() / 2);//计算它的长度/2,再把结果转换为2位的16进制数
        str="0"+s2+convert;//加在最前面
        return str;
    }

	//发送中文短信数据组合处理
    public static String numberGroup(String num,String content) {
        String str = "11000D91"+num +"000800"+content;
        return str;
    }

 	//奇偶数位置互换 如果长度是奇数位则后补F
    public static String reverseString(String str) {
        StringBuffer result = new StringBuffer();
        if (str.length() % 2 == 1) {//奇数位后面补F
            result.append(str).append("F");
        } else {
            result.append(str);
        }
        String s = result.toString();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < s.length() / 2; i++) {
            String temp = s.substring(i * 2, (i + 1) * 2);
            stringBuffer.append(temp, 1, 2).append(temp, 0, 1);
        }
        return stringBuffer.toString();
    }

	//将字符串转换为Unicode码
    public static String convert(String str) {
        str = (str == null ? "" : str);
        String tmp;
        StringBuffer sb = new StringBuffer(1000);
        char c;
        int i, j;
        sb.setLength(0);
        for (i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            j = (c >>>8); //取出高8位
            tmp = Integer.toHexString(j);
            if (tmp.length() == 1)
                sb.append("0");
            sb.append(tmp);
            j = (c & 0xFF); //取出低8位
            tmp = Integer.toHexString(j);
            if (tmp.length() == 1)
                sb.append("0");
            sb.append(tmp);

        }
        return (new String(sb));
    }

	/**
     * 过滤非数字
     * @param str
     * @return
     */
    public static String getNumeric(String str) {
        String regEx="[^0-9]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.replaceAll("").trim();
    }

5.监听对方手机拨号键盘按下的值


版权声明:本文为qq_25560357原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。