我正在使用覆盆子将一些传感器数据发送到SOAP Web服务。 RPi从串口获取数据。格式为'DATE,VALUE1,VALUE2,VALUE3,VALUE4 \ r \ n'。 Web服务请求如下所示
<sensors>
<Sensor>
<SensorId>int</SensorId>
<NodeId>int</NodeId>
<SensorTypeId>int</SensorTypeId>
<Value>double</Value>
<Status>string</Status>
<Date>dateTime</Date>
<Deleted>boolean</Deleted>
<Updated>boolean</Updated>
<RemoteId>int</RemoteId>
<DateOfLastUpdate>dateTime</DateOfLastUpdate>
<UserId>int</UserId>
<ErrorMessage>string</ErrorMessage>
</Sensor>
<Sensor>
<SensorId>int</SensorId>
<NodeId>int</NodeId>
<SensorTypeId>int</SensorTypeId>
<Value>double</Value>
<Status>string</Status>
<Date>dateTime</Date>
<Deleted>boolean</Deleted>
<Updated>boolean</Updated>
<RemoteId>int</RemoteId>
<DateOfLastUpdate>dateTime</DateOfLastUpdate>
<UserId>int</UserId>
<ErrorMessage>string</ErrorMessage>
</Sensor>
</sensors>
<username>string</username>
<password>string</password>
<UniqueClientID>string</UniqueClientID>
<project>string</project>
我从串口获得的每一行都有4个传感器值,并记录了这些值的日期时间。因此,我需要使用SUDS库方法client.factory.create()为串行解析的每一行创建4个对象,将值添加到每个属性,并将对象追加()到Web服务接受的Sensor对象数组中作为它的第一个参数。问题是我找不到动态创建对象的方法,输入属性的值,并将它们附加到大数组。我将从串口解析大约600行,因此需要创建4x600 = 2400。像这样的硬编码对象名称
while True:
serial_str = port.readline()
if serial_str:
string_list = serial_str.split(',')
date = 'T'.join( [ string_list[i] for i in [0, 1] ] )
temperature = string_list[2]
humidity = string_list[3]
rain = string_list[4]
wind = string_list[5].replace("\r\n","")
Sensor_obj1 = client.factory.create('Sensor')
Sensor_obj1.SensorId = -1
Sensor_obj1.NodeId = 1
Sensor_obj1.SensorTypeId = 2
Sensor_obj1.Value = temperature
Sensor_obj1.Status = ''
Sensor_obj1.Date = date
Sensor_obj1.Deleted = 0
Sensor_obj1.Updated = 0
Sensor_obj1.RemoteId = 0
Sensor_obj1.DateOfLastUpdate = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')datetime.now()
Sensor_obj1.UserId = 0
Sensor_obj1.ErrorMessage = ''
Sensor_list_obj.Sensor.append(Sensor_obj1)
Sensor_obj2 = client.factory.create('Sensor')
...
如果我只有一行发送,会工作,但即便如此,它的编程风格也不错。我刚开始使用python 2.x,所以如果有人能指出我正确的方向,我将不胜感激。提前致谢
答案 0 :(得分:0)
我对手头的问题不太熟悉,但我猜你可以在调用client.factory.create(&#39; Sensor&#39;)调用时添加更多参数。它是否接受,** kwargs,以便您可以致电:
client.factory.create('Sensor', SensorID=-1, NodeId=1, ...)
如果没有,您始终可以通过以下方式抽象初始化:
另外,我想我会创建一个传感器列表(或者字典,如果在你的代码中有意义的话),这样你就可以将所有传感器附加到那个结构中,否则你的程序将无法使用或五个传感器而不是4.