前言
由于项目需要进行WIFI和BT(蓝牙)的射频测试,所以需要开发一款支持WIFI/BT射频测试的工具。开发射频测试工具的话那肯定离不开仪表的控制。我们项目用的就Litepoint的IQxel-MW无线网络测试仪。这篇文章主要就是介绍一下如何控制仪表以及实现的过程!
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) try: cls._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 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))
VSA Hardware Setting
这里以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等不同制式!这些大家可自行百度,此处不过多赘述!
有需要源码的同学可以私聊我,随时在线!!!