64位树莓派4B上Node-RED RFM69Radio模块安装失败求助
问题:64位Raspi OS下无法安装node-red-contrib-rfm69radio模块
之前在32位Raspi OS的树莓派上使用node-red-contrib-rfm69radio 1.0.1节点多年,重装64位Raspi OS并安装Node-RED后,无论通过调色板菜单还是终端操作,该模块均安装失败。已提前安装pigpio、spi-device和onoff(均可正常运行),也尝试过无依赖安装,但问题未解决。由于模块近4年未更新,怀疑是与64位系统、npm、Node.js版本不兼容导致。目前需要接收RFM69Radio消息以获取多个Moteinos设备的数据,急需解决方案。
安装错误日志
martin@raspberrypi:~ $ npm -g install node-red-contrib-rfm69radio npm ERR! code 1 npm ERR! path /home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/node-red-contrib-rfm69radio/node_modules/spi-device npm ERR! command failed npm ERR! command sh /tmp/install-1c43cb4b.sh npm ERR! make: Verzeichnis „/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/node-red-contrib-rfm69radio/node_modules/spi-device/build“ wird betreten npm ERR! CXX(target) Release/obj.target/spi/src/spi.o npm ERR! CXX(target) Release/obj.target/spi/src/spidevice.o npm ERR! CXX(target) Release/obj.target/spi/src/open.o npm ERR! CXX(target) Release/obj.target/spi/src/close.o npm ERR! CXX(target) Release/obj.target/spi/src/transfer.o npm ERR! CXX(target) Release/obj.target/spi/src/getoptions.o npm ERR! make: Verzeichnis „/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/node-red-contrib-rfm69radio/node_modules/spi-device/build“ wird verlassen npm ERR! gyp info it worked if it ends with ok npm ERR! gyp info using node-gyp@9.0.0 npm ERR! gyp info using node@16.17.1 | linux | arm64 npm ERR! gyp info find Python using Python version 3.9.2 found at "/usr/bin/python3" npm ERR! gyp info spawn /usr/bin/python3 npm ERR! gyp info spawn args [ npm ERR! gyp info spawn args '/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py', npm ERR! gyp info spawn args 'binding.gyp', npm ERR! gyp info spawn args '-f', npm ERR! gyp info spawn args 'make', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args '/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/node-red-contrib-rfm69radio/node_modules/spi-device/build/config.gypi', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args '/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/npm/node_modules/node-gyp/addon.gypi', npm ERR! gyp info spawn args '-I', npm ERR! gyp info spawn args '/home/martin/.cache/node-gyp/16.17.1/include/node/common.gypi', npm ERR! gyp info spawn args '-Dlibrary=shared_library', npm ERR! gyp info spawn args '-Dvisibility=default', npm ERR! gyp info spawn args '-Dnode_root_dir=/home/martin/.cache/node-gyp/16.17.1', npm ERR! gyp info spawn args '-Dnode_gyp_dir=/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/npm/node_modules/node-gyp', npm ERR! gyp info spawn args '-Dnode_lib_file=/home/martin/.cache/node-gyp/16.17.1/<(target_arch)/node.lib', npm ERR! gyp info spawn args '-Dmodule_root_dir=/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/node-red-contrib-rfm69radio/node_modules/spi-device', npm ERR! gyp info spawn args '-Dnode_engine=v8', npm ERR! gyp info spawn args '--depth=.', npm ERR! gyp info spawn args '--no-parallel', npm ERR! gyp info spawn args '--generator-output', npm ERR! gyp info spawn args 'build', npm ERR! gyp info spawn args '-Goutput_dir=.' npm ERR! gyp info spawn args ] npm ERR! gyp info spawn make npm ERR! gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] npm ERR! In file included from ../../nan/nan.h:294, npm ERR! from ../src/getoptions.cc:4: npm ERR! ../../nan/nan_new.h: In instantiation of ‘typename Nan::imp::Factory<T>::return_t Nan::New(A0) [with T = v8::Uint32; A0 = long unsigned int; typename Nan::imp::Factory<T>::return_t = v8::Local<v8::Uint32>]’: npm ERR! ../src/getoptions.cc:35:65: required from here npm ERR! ../../nan/nan_new.h:208:30: error: call of overloaded ‘New(long unsigned int&)’ is ambiguous npm ERR! 208 | return imp::Factory<T>::New(arg0); npm ERR! | ~~~~~~~~~~~~~~~~~~~~^~~~~~ npm ERR! In file included from ../../nan/nan_new.h:189, npm ERR! from ../../nan/nan.h:294, npm ERR! from ../src/getoptions.cc:4: npm ERR! ../../nan/nan_implementation_12_inl.h:177:1: note: candidate: ‘static Nan::imp::FactoryBase<v8::Uint32>::return_t Nan::imp::Factory<v8::Uint32>::New(int32_t)’ npm ERR! 177 | Factory<v8::Uint32>::New(int32_t value) { npm ERR! | ^~~~~~~~~~~~~~~~~~~ npm ERR! ../../nan/nan_implementation_12_inl.h:183:1: note: candidate: ‘static Nan::imp::FactoryBase<v8::Uint32>::return_t Nan::imp::Factory<v8::Uint32>::New(uint32_t)’ npm ERR! 183 | Factory<v8::Uint32>::New(uint32_t value) { npm ERR! | ^~~~~~~~~~~~~~~~~~~ npm ERR! make: *** [spi.target.mk:121: Release/obj.target/spi/src/getoptions.o] Fehler 1 npm ERR! gyp ERR! build error npm ERR! gyp ERR! stack Error: `make` failed with exit code: 2 npm ERR! gyp ERR! stack at ChildProcess.onExit (/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23) npm ERR! gyp ERR! stack at ChildProcess.emit (node:events:513:28) npm ERR! gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:291:12) npm ERR! gyp ERR! System Linux 5.15.61-v8+ npm ERR! gyp ERR! command "/home/martin/.config/nvm/versions/node/v16.17.1/bin/node" "/home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" npm ERR! gyp ERR! cwd /home/martin/.config/nvm/versions/node/v16.17.1/lib/node_modules/node-red-contrib-rfm69radio/node_modules/spi-device npm ERR! gyp ERR! node -v v16.17.1 npm ERR! gyp ERR! node-gyp -v v9.0.0 npm ERR! gyp ERR! not ok npm ERR! A complete log of this run can be found in: npm ERR! /home/martin/.npm/_logs/2022-09-30T09_22_01_344Z-debug-0.log
解决方案
方案一:降级Node.js到兼容版本
错误日志显示,模块依赖的spi-device在编译时与Node.js 16的V8 API存在类型歧义问题,旧版本的spi-device仅兼容Node.js 14系列:
- 用nvm降级Node.js:
nvm install 14.21.3 nvm use 14.21.3 - 重新安装模块:
npm -g install node-red-contrib-rfm69radio
方案二:手动修复spi-device编译问题
若不想降级Node.js,可手动修改模块内的spi-device代码解决类型歧义:
- 下载模块到本地并解压:
npm download node-red-contrib-rfm69radio tar -xf node-red-contrib-rfm69radio-1.0.1.tgz cd package/node_modules/spi-device - 编辑
src/getoptions.cc第35行,将原代码中的Nan::New(value)修改为Nan::New(static_cast<uint32_t>(value)),明确类型转换; - 重新编译并安装:
npm install cd ../../.. npm install -g ./package
方案三:替换为替代方案
由于原模块多年未维护,可采用更稳定的替代方式:
- 使用Python脚本接收RFM69数据,再传递给Node-RED:
- 安装Python的rfm69库,编写接收脚本:
from rfm69 import RFM69 import time radio = RFM69(freq=433.0, node_id=1, network_id=100, cs_pin=8, reset_pin=25) radio.set_power_level(10) while True: packet = radio.receive(timeout=5.0) if packet: # 将数据发送到MQTT或写入本地文件,供Node-RED读取 print(f"Received data: {packet}") - 在Node-RED中通过
exec节点调用该脚本,或用MQTT节点实现数据传递。
- 安装Python的rfm69库,编写接收脚本:
内容的提问来源于stack exchange,提问作者martin_pi
相关产品推荐
相关产品推荐

