从temperv1设备读取温度(USB 0C45:7401)

temperusb的Python项目详细描述


这是对用户空间USB驱动程序的重写,该驱动程序用于呈现这样的USB ID:0C45:7401 microdia'.

还为netsnmp提供了一个passpersist模块(可以在debian和ubuntu的"snmpd"包中找到),通过snmp显示1-3个usb设备的温度。


ORTED备注
〈0C45:7401 microdia `〈rding temperv1.2 `第一个支持的设备〈br/>〈0C45:7401微直径回火温度传感器` ` Rding Temperat2_m12_u v1.3 `;双传感器装置
`0C45:7401微直径` ` Rding Temperat1f_u v1.3 `;单个外部传感器,但使用"传感器2"
`0C45可以获得更好的精度:7401微直径"Rding temperv1.4`NTS

基本上,python的"libusb"绑定(pyusb)和pypi的"snmp passpersist"。


sudo apt get install python usb python setuptools snmpd;后者仅对snmp使用是必需的。
sudo easy_安装snmp passpersist

l/bin/state snmp

如果您的系统不能以普通用户的身份提供对USB设备的访问,则需要将它们作为根用户运行。请参阅"USB设备权限"一节了解更多信息。

选项

$state poll-p
找到1个设备
device 0(总线1-端口1.3):22.4°C 72.3°F

/>##告诉kernel不要使用state

e设置配置并与之通信。

运行"sudo state poll"时,您将看到这两个错误之一。您的"dmesg"日志将显示类似的内容:

usb 1-1.3:usbfs:interface 0由usbhid声明,而"state poll"设置config 1


若要防止这种情况,请将其添加到内核命令行:


/命令行.txt`。保存后重新启动并重试。hat tip to and more information from[andidog here](http://unix.stackexchange.com/questions/55495/prevent usbhid to claign usb device)。

要模拟的两个oid之一:[APC的典型](http://www.oidview.com/mib s/318/powernet-mib。html)
内部/电池温度(.1.3.6.1.4.1.318.1.1.1.2.2.2.0)或
[思科的典型温度
oids](http://tools.cisco.com/support/snmp/do/browseoid.do?local=en&translate=translate&objectinput=1.3.6.1.4.1.9.9.13.1.3.1.3)
(.1.3.6.1.4.1.9.13.1.3.1.3-3.3)。


请注意,您不应同时激活这两种模式。
此限制的原因是脚本将为每个
"pass\u persist"条目保持运行。更新
温度时,它们会相互干扰。
这通常会导致系统日志条目如下:


state python:更新数据时出现异常:无法释放intf 1:无效参数


USB设备权限

zy,默认的usb设备节点只允许对根用户进行
访问。在相同的情况下,"snmpd"作为用户"snmpd"运行。BAM。无法访问。
您可能会在syslog中找到相应的注释。

要解决这个问题,文件"99 tempsensor.rules"是一个udev规则,允许任何人访问特定的usb设备(具有匹配的vid/pid)。按如下方式安装:

sudo cp etc/99-tempsensor.rules/etc/udev/rules.d/


若要检查是否成功,请按如下方式查找设备的总线和设备ID:

bus 001 device 004:id 0C45:7401 microdia
bus 001 deviceE 005:ID 0C45:7401微直径

pi@raspi-temper1~$ls-l/dev/usb*
crw----1根根189,1970年1月1日/dev/usb dev 1.1
crw----1根189,1970年1月1日/dev/usbdev1.2
crw----1根189,1970年1月2日/dev/usbdev1.3
crw rw rwt 1根目录1891970年1月3日/dev/usbdev1.4
crw rw rwt 1根目录1891970年1月4日/dev/usbdev1.5
pi@raspi-temper1~$

这对于运行
和"snmpd"的passpersist模块是有效的。

rted.

pass_persist.1.3.6.1.4.1.318.1.1.1.2.2.2/usr/local/bin/state snmp


或者,使用以下内容模拟Cisco设备的温度信息。
前三个检测到的设备将报告为..13.1.3.1.3.1、..3.2和..3.3。
值为tem温度以摄氏度为整数。

pass_persist.1.3.6.1.4.1.9.9.13.1.3/usr/local/bin/state snmp


在测线中添加"--testmode"(作为"snmp.py"的选项,以启用一种模式,其中
apc报告99°C,cisco oids报告97°C、98°C和99°C。不需要安装实际的设备,但仍需要"libusb"及其python绑定。

如果使用"python setup.py install"的安装确实在那里安装了脚本,则路径`/usr/local/bin/>是正确的。如果您不想安装它们,请查找并使用
`state/snmp.py`文件。


使用"state python"的ident string
和"log_daemon"的功能向syslog报告一些简单的信息。因此,这将为您提供可用的调试信息:

sudo tail-f/var/log/syslog grep-state python

snmp.py的spersist进程立即
,但在第一次请求激活的oid时。这也意味着您尝试的第一个snmpget可能会失败,如下所示:

ISO.3.6.1.4.1.9.9.13.1.3.1.3.2=此oid当前不存在此类实例


若要测试报告,请尝试此操作(如果它第一次报告没有此类实例,请尝试两次):


snmpget-c public-v 2c localhost.1.3.6.1.4.1.9.9.13.1.3.1.3.1"Cisco"1
snmpget-c public-v 2c localho1.3.6.1.4.1.9.9.9.1.1.3.1.3.1.3.1.1.4.1.9.1.3.1.3.3.3.3.3.Cisco.3.3.3.1.3.3.1.3.1.3.1.3.1.3.1.3.1.3.1.1.3.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.2.0.0 apc

netsnmp启动实例时(在第一个"snmpget"上),您应该看到在syslog中这样做:

jan 6 16:01:51 raspi-temper1 state python:找到2个温度计设备。
jan 6 16:01:51 raspi-temper1 state python:设备初始温度0:22.2摄氏度
jan 6 16:01:51 raspi-temper1 state python:设备初始温度#1:10.9摄氏度

如果您甚至看不到,则脚本可能有问题并异常退出。
尝试手动运行它并模拟passpersist请求(`->;`意味着您应该输入行的其余部分):

->;sudo-temper t/snmp.py
->;ping
<;-pong
->;get
>->;.1.3.6.1.4.1.318.1.1.1.1.2.2.2.2.0
<;-.1.3.6.1.1.1.1.1.1.1.1.2.2.2.2.0
<;-integer
<;-22.25


>
<;-pong
->;.1.3.6.6.1.1.3.6.6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.2.2.2.0<关于倍数的注释设备使用

我看到的设备没有任何方法来识别它们。序列号为0。
无法(并且此驱动程序不会尝试)在USB设备之间呈现持久的
顺序。有效顺序是"libusb"显示的顺序。
似乎基于设备的枚举顺序。

依次是(http://osr507doc.sco.com/en/man/html.hw/usb.hw.html\usbdevid)
主要基于根集线器中的物理顺序->;集线器端口hi启动时重新搜索。
但如果拔下并重新插入设备(或设备因故障而分离并重新检测),则设备的顺序可能会更改。

使用SNMP。

long story short:仅当USB总线稳定并且在设备上的任何插头插入后重新启动时才使用设备顺序。即使那样,你也不安全。抱歉。

请注意GM3D

如上所述,所有回火设备的序列号都是零,因此没有真正的方法来判断哪个是编程的。USB设备号无法工作,因为每次重新启动计算机或插入/拔出设备时它都会更改。可能的工作方式是通过总线号和USB端口(如果中间有集线器的话,可能是一个端口链)的组合来识别它们,这是我目前正在做的工作。

此信息基本上与使用"lsusb-t"获得的信息相同,并且基于sysfs目录`/sys/bus/usb/devices`(见下文)中的信息。到目前为止,我假设这个方案对于常规的用例来说足够持久,但是在某些情况下,甚至总线号也可能会改变,例如,如果您的机器是一台类似于平板电脑的机器,并且您将它热插拔到键盘基座上,键盘基座上有一个USB根集线器。在这种情况下,您需要重新运行"lsusb",并相应地调整配置文件中的总线端口号。目前我对snmp oid持久性一无所知。

如果您的机器上没有此文件,则可以跳过校准。如果程序c找不到与系统上实际设备匹配的行。

坚持下去。` a和b是一些由实验决定的浮动值,我们稍后再讨论这个问题,首先让我描述如何为您的设备决定n和m。

您需要在usbutils包中使用"lsusb"命令来决定"n"和"m"。使用"LSUBB"有和没有-t选项。例如,BR/> BR/>假定以下输出;BR/> BL/B> $ LSUB
总线002设备001:ID1D6B:0002 Linux基础2根HUB/BR>总线001设备016:ID0C45:7401 MydiaBR/>总线001设备015:ID1A40:0101终端技术I数控。001个设备001:0002:Linux基础2根根集线器02,端口号1,类1,类01,端口1,类1,类15,端口4,如果0,class=hub,driver=hub/4p,12m
uuuu端口3:dev 16,如果0,class=hid,driver=usbhid,1.5m
uu端口3:dev 16,如果1,class=hid,driver=usbhid,1.5m

可能会改变时间,即使你不移动它)设备ID=16。


现在看看第二个输出。看这棵树,您的总线01上的状态设备(dev 16)通过两个端口(端口4和端口3)连接到您的PC。
不要担心两个设备具有相同的dev id=16,它们都属于一个状态设备(默认情况下使用两个USB接口,这是正常的)。

因此,在这个例子中,"n=1"和"m=4.3";因此配置文件应该像


1-4.3:scale=a,offset=b


替换为"a"和"b"的实际值,您需要为自己的回火设备测量和计算这些值。这些值用于公式


一些实验和基础数学。或者把它和另一个你可以依赖的温度计比较,或者测量两个你已经知道的温度…就像冰水和开水一样,但在后一种情况下,一定要把你的回火装置牢牢地密封在塑料袋或其他东西里,因为它不是防水的!

要查找总线和端口号,还可以尝试使用-p选项运行状态轮询,该选项将包含上述示例中表单(总线1-端口4.3)中的信息。这实际上可能比查看"lsusb"输出更容易,只要它有效。

).

与python版本的兼容性

它是用python 2.7.3和3.2.3测试的。
"snmp_passpersist"模式是python 2,只是因为上游包还没有准备好。

joji monma编写的代码(@gm3d on github)
*munin plugin由alexander schier编写(@allo-on github)
*pypi包由james stewart编写并重写为"libusb1"(@amorphic on github)
*减少了内核消息,支持多个传感器,并支持temper1f\u v1.3由philip jay编写(@ps jay on github)
*python 3兼容并重写cli.py以使用argparse by will furnass(github上的@willfurnass)
*temperv1.4由christian von roques提供支持(github上的@roques)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何强制用户在允许访问活动之前处理对话框?我的许可证代码怎么了?   java ArraysList作为JSON   mysql如何在java中创建包含多个可选where子句的搜索语句?   java如何让Apache Camel在“直接”路径的末尾删除文件?   使用socket在两个Androids之间进行java实时数据传输。IO(websocket)和4G   如何在java中实现两个CORBA服务器之间的通信   会话树xml表示为java对象   java Skype4Java编号swtwin323325   java RecyclerView getAdapterPosition()不工作:第一次单击返回正确位置,第二次单击返回1   java在$TOMCAT/conf/context上为JNDI设置资源。xml   java为什么第二个矩形冲突在第一个矩形冲突时不起作用?   JScrollPane上的java JTextArea未出现在JPanel上   java如何将实现的PriorityQueue打印为字符串?   jpa使用Jersey更新用户角色RESTJava(JAXRS)