技术博客

08/04/2015 作者 Magnus Carlsson

通过Python连接到远程设备(2/3)

本文是通过Python使用Kvaser产品三篇系列文章的第二篇:

  1. 通过Python访问Kvaser CANlib
  2. 通过Python连接到远程设备
  3. 通过Python访问Kvaser设备的面向对象程度更高的方法

上次我提到,在Kvaser CANlib SDK中,kvrlib还有一个Python v2.7包装器,我想我们可以快速查看下。 kvrlib库用于处理远程设备,如Blackbird和Ethercan设备。我们将在以下两个示例中尝试一些发现和配置。

首先让我们使用发现功能扫描并连接到远程设备。我们的远程设备序列号16,已经连接到与我们的计算机相同的网络:

import sys
sys.path.append("C:/temp/Canlib_SDK_v5.9/Samples/Python")

import kvrlib

kl = kvrlib.kvrlib()
print "kvrlib version: %s" % kl.getVersion()

serialNo = 16
print "Connecting to device with serial number %s" % serialNo
addressList = kvrlib.kvrDiscovery.getDefaultAddresses(kvrlib.kvrAddressTypeFlag_BROADCAST)
print "Found %d addresses." % addressList.count
#print addressList                                       
discovery = kl.discoveryOpen()
discovery.setAddresses(addressList)

delay_ms = 100
timeout_ms = 1000
discovery.setScanTime(delay_ms, timeout_ms)
print "Scanning devices...\n"
deviceInfos = discovery.getResults()
#print "Scanning result:\n%s" % deviceInfos                
for deviceInfo in deviceInfos:
    if deviceInfo.ser_no == serialNo:
        deviceInfo.connect()
        print 'Connecting to the following device:'
        print '---------------------------------------------'
        print deviceInfo
        discovery.storeDevices(deviceInfos)
        break;
discovery.close()
kl.unload()

在调用脚本之前,您应该设置好envar PYTHONPATH,而不是附加到sys.path(如第2行所示)。还要注意,打包结果变量时,Python包装器通常是非常有用的。这意味着您可以取消对第13行和第22行的注释,并获得可读输出。

以上代码输出如下:

kvrlib version: 8.9
Connecting to device with serial number 16
Found 4 addresses.
Scanning devices...

Connecting to the following device:
---------------------------------------------
name/hostname  : "Kvaser Remote #16" / "kv-07130-000016"
  ean/serial   : 73301-30007130 / 16
  fw           : 2.4.126
  addr/cli/AP  : 10.0.3.32 (IPV4) / 10.0.3.27 (IPV4) / unknown (UNKNOWN)
  usage/access : FREE / PUBLIC
  pass/enc.key : no / no

现在让我们在设备上作少许配置,为什么不更改设备名称?远程设备现在已经在CANlib通道0(第6行)上打开,我们将设备名称设置为“MrKvaser”(第7行)。

import sys
sys.path.append("C:/temp/Canlib_SDK_v5.9/Samples/Python")

import kvrlib

canChannel = 0            
deviceName = "MrKvaser"   

kl = kvrlib.kvrlib()
print "Configurating device on channel %d." % canChannel
try:
    config = kl.configOpen(channel=canChannel, mode=kvrlib.kvrConfig.MODE_RW) 
    config.getXml()       
    print "Current device configuration:\n%s" % config.xml.toxml() 
    print "Device name was '%s'" % config.xml.getElementsByTagName('NETWORK')[0].attributes['device_name'].value
    print "Setting new device name '%s'" % deviceName
    config.xml.getElementsByTagName('NETWORK')[0].attributes['device_name'].value = deviceName 
    config.setXml()       
    config.close()
except (kvrlib.kvrError) as ex:
    print ex

kl.unload()

我们从第12行开始以读/写模式打开配置,然后读入第13行的现有配置。在第14行输出整个XML配置后,我们在将其写回到第18行的设备之前设置设备名称元素。

以下内容将被输出到面板:

Configurating device on channel 0.
Current device configuration:
<?xml version="1.0" ?><KVASER>
<VERSION>4.3</VERSION>
<PRODUCTFAMILY>ethercan</PRODUCTFAMILY>
<DEVICE_ACCESS level="PUBLIC" password=""/>
<CONFIG_PROTECTION password="" protected="NO"/>
<NETWORK address_type="DHCP" device_name="Kvaser Remote #16" host_name="kv-07130-000016" mtu="1492" port="11416"/>
<PROFILE_INFO name="Unnamed Profile"/>
<TRAFFIC_ENCRYPTION key="" type="NONE"/>
<WEBSERVER change_log_settings="NO" debug_commands="NO" enabled="NO" user_data_download="NO"/>
</KVASER>
Device name was 'Kvaser Remote #16'
Setting new device name 'MrKvaser'

我们从设备获取的XML配置可以通过使用内置Python XML支持进行操作,如第14行和第17行所示。

有关配置过程XML完整说明,请在下载页面查看“Kvaser远程设备配置XML格式规范”文档。

还有,我们真的需要“知道”设备需要在CANlib通道0(第6行)上打开吗?让我们在下一篇文章中解决这个问题。

2015-05-22编辑:申明当前的包装器是为Python v2.7所编写。

若有任何评论,请直接通过support@kvaser.com与我们联系。

Author Image

Magnus Carlsson

Margus Carlsson是Kvaser AB公司的软件开发人员,从2007年以来深度参与了Kvaser固件和软件的开发。他还为Kvaser的技术博客撰写了许多用流行的Python语言编写应用程序的文章。