由于项目需要进行WIFI和BT(蓝牙)的射频测试,所以需要开发一款支持WIFI/BT射频测试的工具。开发射频测试工具的话那肯定离不开仪表的控制。我们项目用的就Litepoint的IQxel-MW无线网络测试仪。这篇文章主要就是介绍一下如何控制仪表以及实现的过程!
LitePoint是美国硅谷的一家仪器厂商,主要做一些无线通讯测试仪表,包括WIFI,BT(Bluetooth),LTE等等。IQxel-MW是一款支持WIFI/Bluetooth射频测试的仪表,图片如下:
一般的测量仪表都会同时GPIB或者Ethernet或者RS232等等通信方式,但是该仪表没有GPIB接口,可以看出不支持GPIB通信,所以最后控制该仪表的方式是通过Ethernet通信的,通过Ethernet建立Socket连接,然后即可收发指令,实现PC和仪表的通信。
射频测试的接线图如下:
要想实现PC和仪表的通信,首先要确保PC和仪表的IP地址在同一网段,
控制仪表的第一步就是建立与仪表的连接,建立Socket连接,返回socket对象
def _open_tester_connection(cls, ipAddress=None, port=None, timeout=None):
ipAddress = cls._ip if ipAddress is None else str(ipAddress)
port = cls._port if port is None else int(port)
cls._validate_ipAddress(ipAddress)
connectParams = (ipAddress, port)
try:
cls._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cls._socket.connect(connectParams)
cls._socket.settimeout(timeout)
except socket.error:
raise AssertionError('Setup socket connection failed')
else:
cls._lock_device(ipAddress)
return cls._socket
封装一个发送指令的底层函数,供其他函数调用
def _send_raw_command(cls, cmd, repeat=5):
cmd = str(cmd)
repeat = int(repeat)
resp = None
while repeat:
resp = cls._send_tcp_data(data=cmd)
if not cls._error_occurred():
#logger.info('Command {:s} was sent successfully'.format(cmd))
break
repeat -= 1
return resp
在使用设备之间需要先初始化设备,因为设备上可能存在之前的设置参数,不初始化的话可能会影响测试结果;所以每次连接设备时都建议做一次初始化的动作。
def _initialize_device(cls):
try:
cls._send_raw_command('SYS;*CLS;*RST;FORM:READ:DATA ASC')
except Exception as err:
raise TestDeviceError('Error during initializing device: {:s}'.format(err))
这里以WIFI的TX测试的设置,也就是VSA的设置为例,网页如下,包含频率,参考电平,测量间隔,采样率,抓包长度等参数。实现的方法如下:
def config_vsa_hardware_settings(self, freq=None, referLevel=None, enableAGC=None, interval=None, samRate=None, capLength=None):
"""
This function can be used for WiFi SISO and Bluetooth hardware VSA Settings.
"""
freq = int(freq) if freq is not None else freq
referLevel = int(referLevel) if referLevel is not None else referLevel
enableAGC = robottypes.is_truthy(enableAGC) if enableAGC is not None else enableAGC
interval = int(interval) if interval is not None else 5
samRate = Utils.to_enum(samRate, SamplingRate) if samRate is not None else samRate
capLength = int(capLength) if capLength is not None else capLength
vsaParams = []
if freq is not None:
vsaParams.append('FREQ {}'.format(freq * 1000000))
if enableAGC is not None:
vsaParams.append('RLEV:AUTO')
else:
if referLevel:
vsaParams.append('RLEV {}'.format(referLevel))
if samRate is not None:
vsaParams.append('SRAT {}'.format(samRate.value * 1000000))
if capLength is not None:
vsaParams.append('CAPT:TIME {}'.format(capLength / 1000))
if len(vsaParams) >= 1:
self.send_raw_command('VSA1;{:s}'.format(';'.join(vsaParams)))
else:
logger.error('No command sent, no parameter was set')
网页上其他功能的设置也是同样的道理,首先需要在官方手册中找到每个功能相应的SCPI命令,然后通过前面提到的发送指令的函数即可完成相关设置:
IQxel-MW, IQxel-M
对于WIFI/BT的射频测试工具来说控制测量仪表只是其中的一部分,更重要的一部分则是对不同芯片平台的WIFI/BT信号输出的控制。WIFI部分又分为IEEE.802.11a, IEEE.802.11b, IEEE.802.11g, IEEE.802.11n, IEEE.802.11ac, IEEE.802.11ax,等等
对于BT部分来说又分为BR, EDR, LE等不同制式!这些大家可自行百度,此处不过多赘述!
有需要源码的同学可以私聊我,或者直接wx加 xgh321324即可!