Android AT指令发送后

1. 什么是AT指令?

AT指令(AT commands)是指一种用于控制调制解调器(Modem)的命令集合。AT是“ATTENTION”的缩写,最早由电话调制解调器制造商使用。后来,AT指令被广泛应用于各种设备,包括手机、蓝牙模块和GPS模块等。

AT指令使用文本格式,以字符“AT”起始,后面跟随具体的指令和参数。AT指令可以通过串口或者蓝牙等通信方式发送给设备,设备会根据指令执行相应的操作,并返回执行结果。

2. Android中的AT指令发送

在Android中,我们可以通过串口通信或者蓝牙通信发送AT指令给外部设备。在本文中,我们将重点介绍如何使用串口通信发送AT指令。

2.1. 准备工作

在使用串口通信发送AT指令之前,我们需要获取串口设备的读写权限。首先,在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

然后,在MainActivity中请求权限:

private static final int REQUEST_PERMISSION = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 请求权限
    checkPermission();
}

private void checkPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_SETTINGS)
            != PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                    != PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, Manifest.permission.MODIFY_PHONE_STATE)
                    != PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_NETWORK_STATE)
                    != PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET)
                    != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{
                Manifest.permission.WRITE_SETTINGS,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.MODIFY_PHONE_STATE,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.INTERNET}, REQUEST_PERMISSION);
    } else {
        // 已获取权限,执行后续操作
        sendATCommand();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSION) {
        boolean isAllGranted = true;
        for (int grantResult : grantResults) {
            if (grantResult != PackageManager.PERMISSION_GRANTED) {
                isAllGranted = false;
                break;
            }
        }
        if (isAllGranted) {
            // 权限已获取,执行后续操作
            sendATCommand();
        } else {
            // 权限未获取,退出应用
            Toast.makeText(this, "未获取到权限,应用无法正常运行!", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}

2.2. 发送AT指令

通过串口通信发送AT指令需要借助Android的串口通信库,常用的库有FTDI D2xxUSB Serial for Android等。

在本文中,我们以USB Serial for Android为例,介绍如何使用该库发送AT指令。

首先,在app的build.gradle文件中添加以下依赖:

dependencies {
    implementation 'com.github.felHR85:UsbSerial:5.0.2'
}

然后,在MainActivity中创建发送AT指令的方法:

private static final int BAUD_RATE = 9600; // 波特率
private static final int DATA_BITS = UsbSerialPort.DATABITS_8; // 数据位
private static final int STOP_BITS = UsbSerialPort.STOPBITS_1; // 停止位
private static final int PARITY = UsbSerialPort.PARITY_NONE; // 校验位

private static final String USB_INTERFACE = "/dev/ttyUSB0"; // USB接口路径

private UsbSerialPort mSerialPort;
private UsbSerialDevice mSerialDevice;
private UsbManager mUsbManager;

private void sendATCommand() {
    mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(m