4G模块参数获取c实现

对于/dev/ttyUSB*设备节点不存在修改下内核menuconfig

AT+CSQ : 获取信号强度

测试结果:AT+CSQ<CR>
                  +CSQ: 31, 99

命令解释:获取4G网络信号强度
命令格式:AT+CSQ<CR>
命令返回:+CSQ:  **, ##         

  • **应在 0 到 31 之间(99表示无信号),数值越大表明信号质量越好;
  • ##为误码率,值在 0 到 99 之间。否则应检查天线或 SIM 卡是否正确安装
  • 串口下命令行获取方式

c代码实现:

通过串口获取到数据字符串后转换后再计算信号强度计算公式:信号强度 = -113dBm + (rssi * 2)


int getcsq(void *) {
	int ret = 0;
	unsigned char csq[32] = {0};
    int str_fd_ttyUSB2  =  openport("/dev/ttyUSB2");     //打开串口
	if(str_fd_ttyUSB2>0)
	{
	   ret=setport(str_fd_ttyUSB2);  //设置串口,波特率,数据位,停止位,校验
	}
	
	write(str_fd_ttyUSB2,"AT+CSQ\r\n",12);//开启定位	
	sleep(2);
	unsigned char rbuf[64];
	int len = read(str_fd_ttyUSB2, rbuf, sizeof(rbuf));  // 在串口读入字符串
	sleep(1);
	if(len < 0)
	{
		printf("Can't get /dev/ttyUSB2 Serial Port data!\n");
	}
	
	const char *str2 = "+CSQ: ";
	char *pdata = strstr(rbuf, str2);
    if(pdata)
	    strncpy(csq, pdata+6, 6);
    else {
        return  -1;
    } 
	
	printf("SIM-CSQ: %s\n", csq);

    int level;
    char *str = NULL;
	if (strstr(csq, "99,") || strstr(csq, "199,") ){
		printf("No signal ..\n");
		level = 0;
	}
	else {
		char rssi_str[4];
		int rssi;
		memset(rssi_str, 0, sizeof(rssi_str));
		if (*(csq+2) == ',') {
			rssi_str[0] = *(csq+6+0);
			rssi_str[1] = *(csq+6+1);
		}
		else if (isdigit(*(csq+2)) && isdigit(*(csq+3) == ',')) {
			rssi_str[0] = *(csq+6+0);
			rssi_str[1] = *(csq+6+1);
			rssi_str[2] = *(csq+6+2);
		}
		rssi = atoi(rssi_str);
		int signal = -113 + (2 * rssi);
		if(signal > -91)
			level = 5;
		else if (signal <= -91 && signal > -101)
			level = 4;
		else if(signal <= -101 && signal > -103)
			level = 3;
		else if(signal <= -103 && signal > -107)
			level = 2;
		else if(signal <= -107 && signal > -113)
			level = 1;
		else
			level = 0;
		printf("level = %d, signal: %d\n", rssi, signal);
		}

    return ;
}

int main(int argc, char** argv) {
	getcsq();
    return 0;
}

AT+QCCID: 获取SIM卡CID

测试结果:AT+QCCID<CR>
                  +QCCID: 898604A0235431253112

命令解释:获取SIM序列号
命令格式:AT+QCCID<CR>
命令返回:+QCCID: *********       

  • ** 20位;

c代码实现:

unsigned char* get_Qccid( ) {
	int ret = 0;
    unsigned char *ccid = NULL;
    int str_fd_ttyUSB2  =  openport("/dev/ttyUSB2");     //打开串口
    if(str_fd_ttyUSB2>0)
    {
       ret=setport(str_fd_ttyUSB2);  //设置串口,波特率,数据位,停止位,校验
       if(ret<0)
       {
         printf("Can't Set /dev/ttyUSB2!/n");
       }
   }
   else
   {
        printf("Can't Open /dev/ttyUSB2!\n");
   }

   write(str_fd_ttyUSB2,"AT+QCCID\r\n",12);
	
    usleep(200*1000);
	unsigned char rbuf[128];
	int len = read(str_fd_ttyUSB2, rbuf, sizeof(rbuf));  // 在串口读入字符串
    close(str_fd_ttyUSB2);	
	if(len < 0)
	{
		printf("Can't get /dev/ttyUSB2 Serial Port data!\n");
	}
	
    printf("buf = %s \n", rbuf);
    printf("bufff: %d\n", strlen(rbuf)); 
	const char *str2 = "+QCCID: ";
	char *pdata = strstr(rbuf, str2);
    if(pdata)
	    strncpy(ccid, pdata+8, 20);
    else {
        return  -1;
    }
    printf("SIM-CID: %s\n", ccid);

    if (strlen(data) == 20)
    {
        int fd;
        if ((fd= open("/tmp/cid.txt", O_RDWR | O_CREAT)) == -1) {
            return -1;
        }
        if (write(fd, data, 20) == -1) {
            return -1;
        }
        close(fd);
    }
    return 0;
}

int main(int argc, char** argv) {
    get_qccid();
    return 0;
}

设置串口属性代码:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <termios.h> 


static int openport(char *Dev)
{
	int fd = open( Dev, O_RDWR|O_NOCTTY|O_NDELAY );
	if (-1 == fd)
	{
		perror("Can''t Open Serial Port");
		return -1;
	}
	else
		return fd;
}

static int setport(int fd)
{
	int baudrate;
	struct   termios   newtio;
	baudrate=B115200;//波特率
	tcgetattr(fd,&newtio);
	bzero(&newtio,sizeof(newtio));
	//setting   c_cflag
	newtio.c_cflag   &=~CSIZE;
	newtio.c_cflag |= CS8; //8位数据位
	//校验
	newtio.c_cflag &= ~PARENB;   // Clear parity enable
	newtio.c_iflag &= ~INPCK;     // Enable parity checking
	//设置停止位
	newtio.c_cflag &= ~CSTOPB;  //1

	newtio.c_cc[VTIME] = 0;
	newtio.c_cc[VMIN] = 0;
	newtio.c_cflag   |=   (CLOCAL|CREAD);
	newtio.c_oflag|=OPOST;
	newtio.c_iflag   &=~(IXON|IXOFF|IXANY);
	cfsetispeed(&newtio,baudrate);
	cfsetospeed(&newtio,baudrate);
	tcflush(fd,   TCIFLUSH);
	if (tcsetattr(fd,TCSANOW,&newtio) != 0)
	{
		perror("SetupSerial 3");
		return -1;
	}
	return 0;
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 4G模块连接阿里云MQTT协议接入和发送数据涉及以下几个步骤: 1. 初始化4G模块: 首先需要初始化4G模块,包括配置串口通信参数和连接4G网络,确保能够正常访问网络。 2. 配置MQTT连接参数: 使用4G模块提供的AT指令设置MQTT协议的连接参数,包括阿里云的服务器地址、端口号、设备ID和设备密钥等信息。可以通过命令行或者编程语言的方式发送AT指令进行配置。 3. 连接阿里云MQTT服务器: 使用4G模块的AT指令建立与阿里云MQTT服务器的连接,可以通过发送CONNECT指令完成连接建立,根据返回结果判断是否连接成功。 4. 发布数据: 连接建立成功后,可以通过4G模块的AT指令发送MQTT PUBLISH消息。首先需要构建MQTT消息体,包括消息主题、消息内容和消息质量等信息。使用AT指令发送PUBLISH指令,将消息体发送到阿里云MQTT服务器。 5. 订阅数据: 同样使用4G模块的AT指令订阅阿里云MQTT服务器上的消息。构建订阅消息的主题,使用AT指令发送SUBSCRIBE指令进行订阅。当服务器有消息发布到订阅主题时,4G模块会接收到消息,可以通过AT指令进行处理。 需要注意的是,上述步骤中的具体AT指令和参数配置根据不同的4G模块厂商和阿里云MQTT协议的版本有所差异。建议查阅具体设备和协议的相关文档,以获取正确的AT指令和参数配置。 以上是使用4G模块连接阿里云MQTT协议接入和发送数据的源码的简要描述,具体代码实现和细节问题可以参考相关文档和资料,根据实际需求进行开发。 ### 回答2: 要实现4G模块连接阿里云MQTT协议接入和发送数据的源码,需要进行以下步骤: 1. 引入相关库:首先需要引入4G模块和MQTT协议相关的库。根据具体的4G模块型号和开发板,可以选择相应的库进行引入。 2. 初始化网络连接:使用4G模块的相关函数,初始化网络连接并获取SIM卡信息。确保SIM卡正常连接网络。 3. 连接阿里云MQTT服务器:使用MQTT库提供的函数,通过阿里云提供的MQTT服务器地址和端口号,建立与服务器的连接。 4. 配置连接参数:设置MQTT连接的一些参数,例如客户端ID、用户名、密码等。这些信息可以在阿里云IoT平台上进行配置和获取。 5. 设置回调函数:在连接成功的回调函数中,编写接收和处理服务器返回数据的代码。可以根据具体需求来解析和处理接收到的数据。 6. 订阅主题:使用MQTT库提供的函数,订阅需要接收的主题。根据实际情况,可以订阅多个主题。 7. 定时发送数据:使用4G模块的相关函数,获取需要发送的数据,并使用MQTT库提供的函数将数据发布到指定的主题。 8. 处理断开连接:在断开连接的回调函数中,编写相应的代码来处理断开连接的情况,例如重新连接或者进行相关提示。 以上是实现4G模块连接阿里云MQTT协议接入和发送数据的源码的基本步骤。具体的源码实现可以参考相关的4G模块和MQTT协议的开发文档,以及阿里云IoT平台上提供的相关示例代码。 ### 回答3: 连接阿里云MQTT协议接入并发送数据需要使用4G模块。以下是示例源码: 1. 导入所需的库文件 ```c #include <HttpClient.h> #include <EasyIOT.h> #include <MQTTClient.h> ``` 2. 设置阿里云MQTT服务器相关参数 ```c const char* server = "<mqtt_server>"; const char* clientId = "<mqtt_client_id>"; const char* username = "<mqtt_username>"; const char* password = "<mqtt_password>"; const int port = 1883; ``` 3. 设置4G模块网络连接参数 ```c const char* apn = "<apn>"; const char* gprsUser = "<gprs_user>"; const char* gprsPass = "<gprs_password>"; ``` 4. 创建MQTT客户端对象并设置回调函数 ```c WiFiClient wifiClient; MQTTClient mqttClient; void handleMqttMessage(String topic, String payload) { // 处理接收到的MQTT消息 } void setup() { // 初始化4G模块 EasyIOT.begin(apn, gprsUser, gprsPass); // 连接WiFi EasyIOT.connectWiFi(); // 设置MQTT服务器参数 mqttClient.begin(server, port, wifiClient); // 设置MQTT回调函数 mqttClient.onMessage(handleMqttMessage); // 连接阿里云MQTT服务器 mqttClient.connect(clientId, username, password); } void loop() { // MQTT客户端保持连接 mqttClient.loop(); // 发送数据到MQTT服务器 String data = "<data_to_send>"; mqttClient.publish("<mqtt_topic>", data); // 延时一段时间 delay(1000); } ``` 以上是一个简单的示例代码,基于Arduino平台,使用了HttpClient、EasyIOT和MQTTClient等库。你需要根据自己的实际情况修改其中的参数。这段代码可以实现4G模块连接阿里云MQTT协议接入并发送数据的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值