5台树莓派3采集IoT数据时单台Paho MQTT客户端报TypeError: 'an integer is required'错误求助
这个问题我之前帮朋友排查过类似的,咱们先从报错栈入手分析:错误出在paho/mqtt/client.py的_pack_str16方法里,这个方法负责把MQTT协议要求的字符串(比如client_id)打包成符合规范的二进制格式。报错TypeError: an integer is required说明执行packet.extend(data)时,data不是预期的字节序列或可迭代整数类型——说白了就是client_id的处理出了格式问题,而其他四台正常,大概率是这台树莓派的环境有差异。
按下面的步骤一步步来,应该能解决问题:
1. 先确认client_id的实际类型
在你的publish.single调用前加一行打印,先排除最基础的类型错误:
print("client_id类型:", type(client_id), "值:", client_id)
运行后如果输出不是<class 'str'> testNode,那说明client_id被意外修改成了其他类型(比如整数或None)——不过从你的代码看概率很低,但先确认准没错。
如果类型是对的,那强制把client_id转成UTF-8编码的字节串试试,修改client_id的定义:
client_id = "testNode".encode("utf-8")
某些特殊系统编码环境下,字符串自动转字节的过程会出问题,显式编码能绕过这个坑。
2. 重新安装paho-mqtt,排除包损坏
虽然你说所有客户端用的是相同版本,但不排除这台树莓派安装时网络波动导致包损坏。执行以下命令重新安装:
pip3 uninstall -y paho-mqtt pip3 install paho-mqtt==1.5.1
安装完成后再运行脚本测试。
3. 检查系统默认编码设置
树莓派的系统编码如果不是UTF-8,会影响Python字符串的处理逻辑。在终端执行命令查看当前默认编码:
如果输出不是utf-8,可以在运行脚本前临时设置环境变量:
export PYTHONIOENCODING=utf-8
再运行你的Python脚本;如果想永久生效,把这个环境变量加到~/.bashrc文件里即可。
这种单机器异常基本都是环境差异导致的:比如这台树莓派的系统编码被修改过、paho-mqtt安装包损坏,甚至是Python底层依赖库的版本和其他机器细微不同——哪怕是相同的Python版本,不同机器的系统库也可能有差异。
内容的提问来源于stack exchange,提问作者Norman Su

