问题描述
我在这方面没有太多经验。但是我需要用 Python 解码 MeteoWind IoT Pro Sensor 才能得到风速。官方网站只提供了我不知道的javascript代码。官网:https://www.baranidesign.com/iot-wind-open-message-format 示例数据表:http://www.wind101.net/COM_type_03/IoT_Wind_ALLMETEO_Data_Message_Format_Decoder.htm 我尝试在 Python 中使用一个名为 js2py 的模块将 javascript 转换为 python:
import js2py
js2py.translate_file('meteowind.js','meteowind_python.py')
然后我得到了一个这样的python文档:
__all__ = ['meteowind_python']
# Don't look below,you will not understand this Python code :) I don't.
from js2py.pyjs import *
# setting scope
var = Scope( JS_BUILTINS )
set_global_object(var)
# Code follows:
var.registers(['ConvertBase','pos','pad','precisionRound','bindata','data2bits','bitShift','Decoder'])
@Js
def PyJsHoisted_pad_(num,this,arguments,var=var):
var = Scope({'num':num,'this':this,'arguments':arguments},var)
var.registers(['num','s'])
var.put('s',(Js('0000000')+var.get('num')))
return var.get('s').callprop('slice',(-Js(8.0)))
PyJsHoisted_pad_.func_name = 'pad'
var.put('pad',PyJsHoisted_pad_)
@Js
def PyJsHoisted_data2bits_(data,var=var):
var = Scope({'data':data,var)
var.registers(['binary','i','data'])
var.put('binary',Js(''))
#for JS loop
var.put('i',Js(0.0))
while (var.get('i')<var.get('data').get('length')):
try:
var.put('binary',var.get('ConvertBase').callprop('dec2bin',var.get('data').get(var.get('i'))),'+')
finally:
(var.put('i',Js(var.get('i').to_number())+Js(1))-Js(1))
return var.get('binary')
PyJsHoisted_data2bits_.func_name = 'data2bits'
var.put('data2bits',PyJsHoisted_data2bits_)
@Js
def PyJsHoisted_bitShift_(bits,var=var):
var = Scope({'bits':bits,'bits'])
var.put('num',var.get('ConvertBase').callprop('bin2dec',var.get('bindata').callprop('substr',var.get('pos'),var.get('bits'))))
var.put('pos',var.get('bits'),'+')
return var.get('Number')(var.get('num'))
PyJsHoisted_bitShift_.func_name = 'bitShift'
var.put('bitShift',PyJsHoisted_bitShift_)
@Js
def PyJsHoisted_precisionRound_(number,precision,var=var):
var = Scope({'number':number,'precision':precision,var)
var.registers(['number','factor','precision'])
var.put('factor',var.get('Math').callprop('pow',Js(10.0),var.get('precision')))
return (var.get('Math').callprop('round',(var.get('number')*var.get('factor')))/var.get('factor'))
PyJsHoisted_precisionRound_.func_name = 'precisionRound'
var.put('precisionRound',PyJsHoisted_precisionRound_)
@Js
def PyJsHoisted_Decoder_(bytes,port,var=var):
var = Scope({'bytes':bytes,'port':port,var)
var.registers(['port','bytes'])
var.put('bindata',var.get('data2bits')(var.get('bytes')))
if (var.get('bytes').get('length')!=Js(9.0)):
return Js({'status':Js('ERROR'),'describtion':Js('9 bytes are required')})
var.put('Type',var.get('bitShift')(Js(2.0)))
var.put('Battery',var.get('precisionRound')(((var.get('bitShift')(Js(5.0))*Js(0.05))+Js(3.0)),Js(1.0)))
var.put('Wind_ave10',var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(0.1)),Js(1.0)))
var.put('Wind_max10',(var.get('Wind_ave10')+var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(0.1)),Js(1.0))))
var.put('Wind_min10',(var.get('Wind_ave10')-var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(0.1)),Js(1.0))))
var.put('Dir_ave10',var.get('precisionRound')((var.get('bitShift')(Js(9.0))*Js(1.0)),Js(1.0)))
var.put('Dir_max10',Js(1.0)))
var.put('Dir_hi10',var.get('precisionRound')((var.get('bitShift')(Js(8.0))*Js(1.0)),Js(1.0)))
var.put('Dir_lo10',Js(1.0)))
var.put('decoded',Js({'1_Type':var.get('Type'),'2_Battery':var.get('Battery'),'3_Wind_ave10':var.get('Wind_ave10'),'4_Wind_max10':var.get('Wind_max10'),'5_Wind_min10':var.get('Wind_min10'),'6_Dir_ave10':var.get('Dir_ave10'),'7_Dir_max10':var.get('Dir_max10'),'8_Dir_hi10':var.get('Dir_hi10'),'9_Dir_lo10':var.get('Dir_lo10')}))
return var.get('decoded')
PyJsHoisted_Decoder_.func_name = 'Decoder'
var.put('Decoder',PyJsHoisted_Decoder_)
var.put('pos',Js(0.0))
var.put('bindata',Js(''))
@Js
def PyJs_anonymous_0_(num,var)
var.registers(['num'])
@Js
def PyJs_anonymous_1_(baseFrom,var=var):
var = Scope({'baseFrom':baseFrom,var)
var.registers(['baseFrom'])
@Js
def PyJs_anonymous_2_(baseto,var=var):
var = Scope({'baseto':baseto,var)
var.registers(['baseto'])
return var.get('parseInt')(var.get('num'),var.get('baseFrom')).callprop('toString',var.get('baseto'))
PyJs_anonymous_2_._set_name('anonymous')
return Js({'to':PyJs_anonymous_2_})
PyJs_anonymous_1_._set_name('anonymous')
return Js({'from':PyJs_anonymous_1_})
PyJs_anonymous_0_._set_name('anonymous')
var.put('ConvertBase',PyJs_anonymous_0_)
pass
@Js
def PyJs_anonymous_3_(num,var)
var.registers(['num'])
return var.get('pad')(var.get('ConvertBase')(var.get('num')).callprop('from',Js(10.0)).callprop('to',Js(2.0)))
PyJs_anonymous_3_._set_name('anonymous')
var.get('ConvertBase').put('dec2bin',PyJs_anonymous_3_)
@Js
def PyJs_anonymous_4_(num,var)
var.registers(['num'])
return var.get('ConvertBase')(var.get('num')).callprop('from',Js(2.0)).callprop('to',Js(10.0))
PyJs_anonymous_4_._set_name('anonymous')
var.get('ConvertBase').put('bin2dec',PyJs_anonymous_4_)
pass
pass
pass
pass
pass
# Add lib to the module scope
meteowind_python = var.to_python()
然后我将其导入到我的 python 代码中并使用一些示例数据对其进行了测试:
import meteowind_python as wd #wind decoder
test = bytes.fromhex('0F33568d11a2d0A980')
#print(type(test))
#print(len(test))
print(wd.PyJsHoisted_Decoder_(test))
#print(wd.PyJsHoisted_Decoder_('\x0F\x33\x56\x8d\x11\xa2\xd0\xA9\x80')
但是当我使用 print(wd.PyJsHoisted_Decoder_(test)) 时它总是显示错误,即使测试的长度是 9
{'describtion': '9 bytes are required','status': 'ERROR'}
或者当我使用 print(wd.PyJsHoisted_Decoder_('\x0F\x33\x56\x8d\x11\xa2\xd0\xA9\x80'):
{'1_Type': 0,'2_Battery': 3,'3_Wind_ave10': 0.3,'4_Wind_max10': 0.3,'5_Wind_min10': 0.3,'6_Dir_ave10': 0,'7_Dir_max10': 0,'8_Dir_hi10': 0,'9_Dir_lo10': 0}
谁能帮我找出问题所在?那个 js2py 模块把 Js 翻译成 python 错了吗?或者任何人都可以编写正确版本的python?如果有人能提供帮助,真的很感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)