AT-Command/samples/linux/cmd/cmd_gsm.c
2022-12-31 22:42:31 +08:00

129 lines
3.0 KiB
C

/******************************************************************************
* @brief GSM 模块AT命令模拟器
* Change Logs:
* Date Author Notes
* 2022-04-01 Roger.luo 初版
******************************************************************************/
#include "cli.h"
#include <stddef.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/**
* @brief AT测试
*/
static int do_cmd_at(struct cli_obj *obj, int argc, char *argv[])
{
return true;
}
cmd_register("AT", do_cmd_at, NULL);
/**
* @brief 查询SIM卡状态
*/
static int do_cmd_cpin(struct cli_obj *obj, int argc, char *argv[])
{
obj->print(obj, "+CPIN:READY\r\n");
return true;
}
cmd_register("CPIN", do_cmd_cpin, NULL);
/**
* @brief 查询信号质量
*/
static int do_cmd_csq(struct cli_obj *obj, int argc, char *argv[])
{
obj->print(obj, "+CSQ:31,99\r\n");
return true;
}
cmd_register("CSQ",do_cmd_csq, NULL);
/**
* @brief 网络注册状态
*/
static int do_cmd_creg(struct cli_obj *obj, int argc, char *argv[])
{
obj->print(obj, "+CREG: 2,1,\"1052\",\"D619\",0\r\n");
return true;
}
cmd_register("CREG", do_cmd_creg, NULL);
/**
* @brief 查询模块IMEI
*/
static int do_cmd_cgsn(struct cli_obj *obj, int argc, char *argv[])
{
obj->print(obj, "123456789012345\r\n");
return true;
}
cmd_register("CGSN", do_cmd_cgsn, NULL);
/**
* @brief 查询模块版本号
*/
static int do_cmd_ver(struct cli_obj *obj, int argc, char *argv[])
{
obj->print(obj, "+VER:V1.02\r\n");
return true;
}
cmd_register("VER", do_cmd_ver, NULL);
/**
* @brief 配置参数设置
*/
static int do_cmd_param(struct cli_obj *obj, int argc, char *argv[])
{
static int a = 0, b = 0;
char *p;
if (obj->type == CLI_CMD_TYPE_QUERY) { //参数查询
obj->print(obj, "+PARAM=%d,%d\r\n" ,a, b);
return true;
} else { //参数设置
p = strchr(obj->recvbuf, '=');
if (argc == 2 && p != NULL) {
a = atoi(p + 1);
b = atoi(argv[1]);
obj->print(obj, "Parameter setting is successfully, a=%d, b=%d\r\n", a, b);
return true;
}
}
return false;
}
cmd_register("PARAM", do_cmd_param, NULL);
/**
* @brief 读取二进制数据命令
*/
static int do_cmd_read_bin(struct cli_obj *obj, int argc, char *argv[])
{
int i;
unsigned char check; //数据校验码
int len;
char buf[256];
srand((unsigned)time(NULL));
len = rand() % sizeof(buf);
for (i = 1, check = 0; i < len; i++) {
buf[i] = rand() % 128;
check ^= buf[i]; //计算校验码
}
buf[0] = check;
//=> AT+RDBIN=<socket id>,<read size>
//
//<= +BINDAT:<socket id>,<real size>\r\n<raw data......>
//
//<= OK
obj->print(obj, "+BINDAT:%d,%d\r\n" ,1, len);
obj->write(buf, len);
return true;
}
cmd_register("BINDAT", do_cmd_read_bin, NULL);