← 返回题库
初级

解析NB-IoT低功耗精简上报格式

未完成
初级参考 完整示例代码供参考,建议自己理解后重新输入
def solve():
    from pyodide.http import open_url
    from io import StringIO
    import pandas as pd, json
    devs_csv = open_url("https://data.zuihe.com/dbd/ms-greenfarm/state_00/devices.csv").read()
    devs = pd.read_csv(StringIO(devs_csv))
    COMPACT_MAP = {'sm':'soil_moisture','st':'soil_temp','ec':'soil_ec','ph':'soil_ph','n':'nitrogen','p':'phosphorus','k':'potassium'}
    UNITS = {'soil_moisture':'%','soil_temp':'degC','soil_ec':'mS/cm','soil_ph':'pH','nitrogen':'mg/kg','phosphorus':'mg/kg','potassium':'mg/kg'}
    def parse_compact(payload_str):
        p = json.loads(payload_str)
        result = {'device_id':p.get('id',''),'timestamp':p.get('ts',0),'readings':[]}
        for abbrev, full in COMPACT_MAP.items():
            if abbrev in p:
                result['readings'].append({'metric':full,'value':p[abbrev],'unit':UNITS.get(full,'')})
        return result
    payloads = [
        '{"id":"SOIL-B02","ts":1748736004,"sm":68.2,"st":21.5,"ec":1.9,"ph":6.3}',
        '{"id":"SOIL-B03","ts":1748736005,"sm":72.0,"st":20.8,"ec":2.1,"ph":6.2,"n":130,"p":45,"k":210}',
    ]
    for p in payloads:
        r = parse_compact(p)
        print(r['device_id'] + ": " + str(len(r['readings'])) + " readings")
        for reading in r['readings']:
            print("  " + reading['metric'] + "=" + str(reading['value']) + reading['unit'])

示例

输入
solve()
期望输出
SOIL-B02: 4 readings
  soil_moisture=68.2%
  soil_temp=21.5degC
  soil_ec=1.9mS/cm
  soil_ph=6.3pH
SOIL-B03: 7 readings
  soil_moisture=72.0%
  soil_temp=20.8degC
  soil_ec=2.1mS/cm
  soil_ph=6.2pH
  nitrogen=130mg/kg
  phosphorus=45mg/kg
  potassium=210mg/kg
Python 代码 🔒 登录后使用
🔒

登录后即可练习

注册免费账号,在浏览器中直接运行 Python 代码