C语言对 通讯模组 物理层(PHY)数据提取 方法

物联网模组物理层数据混合在一起怎么搞提取

使用 C 语言提取你提供的所有类型数据字段的示例代码,整体思路是通过字符串处理函数对不同模块的字符串分别进行分割和解析,提取出各个参数及其对应的值

举例CAT1模组的物理层数据:

c 复制代码
+ECSTATUS: PHY, DlEarfcn:1850, UlEarfcn:19850, PCI:1, Band:3, RSRP:-95, RSRQ:-10, SNR:9, DlBler:0/100, UlBler:0/100,                  DataInactTimerS:60, RetxBSRTimerP:320, TAvalue:20, TxPower:14, MaxTxPower:23, rxTime:1410, txTime:70
+ECSTATUS: L2, SrbNum:2, DrbNum:1
+ECSTATUS: RRC, State:"CONNECTED", TAC:30559, CellId:125637176, DRX:1280
+ECSTATUS: EMM, EmmState:"REG", EmmMode:"CONNECTED", PTWMs:0, EDRXPeriodMs:0, PsmExT3412TimerS:4294967295, T3324TimerS:65535, T3346RemainTimeS:0
+ECSTATUS: PLMN, PlmnState:"SELECTED", PlmnType:"EHPLMN", SelectPlmn:"0x460,0xf001"
+ECSTATUS: ESM, ActBearerNum:1, APN:"sxzcat1.MNC006.MCC460.GPRS", IPv4:"10.198.148.55"
+ECSTATUS: CCM, Cfun:1, IMSI:"460065244629186"

实际函数实现:

c 复制代码
//字符串分割提取
void extractRRCData(char *rrcData) 
{
    	char *token;           //引入开头
		char *delim = ", ";  //通过此delim 分割的字符
    
		token = strtok(rrcData, delim);//获取开头
    
		// 跳过开头的 "+ECSTATUS: RRC"
    	token = strtok(NULL, delim);//跳过
    
		while (token!= NULL) 
		{
        char paramName[100];
        char paramValue[100];
        sscanf(token, "%[^:]:%s", paramName, paramValue);//提取参数名称 参数
        printf("%s: %s\n", paramName, paramValue);//打印参数名称  打印参数
        token = strtok(NULL, delim);//返回下一段索引
    }
}

各个提取函数的逻辑:

对于每个ext

ractXXXData函数(如extractPhyData、extractL2Data等),首先使用strtok函数按照指定的分隔符(, )对传入的对应模块字符串进行分割。

跳过开头表示模块名称的那部分字符串(如+ECSTATUS: PHY),然后通过sscanf函数按照%[^:]:%s的格式来解析出参数名和参数值,并进行打印输出,输出时会加上对应模块的前缀(如物理层 -、层2 -等)方便区分查看。

main函数中的操作:

在main函数里定义了各个模块对应的原始字符串数据,然后依次调用各个提取函数来提取并输出相应模块的所有数据字段内容。

实际效果

c 复制代码
+ECSTATUS: PHY, DlEarfcn:1506, UlEarfcn:19506, PCI:83, Band:3, RSRP:-97, RSRQ:-11, SNR:4, DlBler:0/100, UlBler:0/100,                  DataInactTimerS:0, RetxBSRTimerP:0, TAvalue:-1, TxPower:-128, MaxTxPower:23, rxTime:2079, txTime:189
+ECSTATUS: L2, SrbNum:0, DrbNum:0
+ECSTATUS: RRC, State:"IDLE", TAC:30559, CellId:117016381, DRX:1280
+ECSTATUS: EMM, EmmState:"REG", EmmMode:"IDLE", PTWMs:0, EDRXPeriodMs:0, PsmExT3412TimerS:4294967295, T3324TimerS:65535, T3346RemainTimeS:0
+ECSTATUS: PLMN, PlmnState:"SELECTED", PlmnType:"EHPLMN", SelectPlmn:"0x460,0xf001"
+ECSTATUS: ESM, ActBearerNum:1, APN:"sxzcat1.MNC006.MCC460.GPRS", IPv4:"10.74.206.168"
+ECSTATUS: CCM, Cfun:1, IMSI:"460065244629186"

OK
PHY: 
DlEarfcn: 1506
UlEarfcn: 19506
PCI: 83
Band: 3
RSRP: -97
RSRQ: -11
SNR: 4
DlBler: 0/100
UlBler: 0/100
DataInactTimerS: 0
RetxBSRTimerP: 0
TAvalue: -1
TxPower: -128
MaxTxPower: 23
rxTime: 2079
txTime: 189
L2: 189
SrbNum: 0
DrbNum: 0
RRC: 0
State: "IDLE"
TAC: 30559
CellId: 117016381
DRX: 1280
EMM: 1280
EmmState: "REG"
EmmMode: "IDLE"
PTWMs: 0
EDRXPeriodMs: 0
PsmExT3412TimerS: 4294967295
T3324TimerS: 65535
T3346RemainTimeS: 0
PLMN: 0
PlmnState: "SELECTED"
PlmnType: "EHPLMN"
SelectPlmn: "0x460
0xf001"
+ECSTATUS: "0x460
ESM: "0x460
ActBearerNum: 1
APN: "sxzcat1.MNC006.MCC460.GPRS"
IPv4: "10.74.206.168"
CCM: "10.74.206.168"
Cfun: 1
IMSI: "460065244629186"
相关推荐
globaldomain1 小时前
什么是用于长距离高速传输的TCP窗口扩展?
开发语言·网络·php
沈阳信息学奥赛培训1 小时前
#undef 指令 (C/C++)
c语言·开发语言·c++
2401_873204651 小时前
分布式系统安全通信
开发语言·c++·算法
Dxy12393102162 小时前
JS发送请求的方法详解
开发语言·javascript·ecmascript
sw1213893 小时前
C++中的代理模式实战
开发语言·c++·算法
難釋懷3 小时前
Lua语法入门-条件控制、函数
开发语言·junit·lua
桌面运维家3 小时前
Win10打印机共享故障排查:权限与网络配置详解
开发语言·网络·php
Sunshine for you4 小时前
实时操作系统中的C++
开发语言·c++·算法
史蒂芬_丁4 小时前
C++深度拷贝例子
java·开发语言·c++
Knight_AL4 小时前
Nacos 启动问题 Failed to create database ’D:\nacos\nacos\data\derby-data’
开发语言·数据库·python