小于同志灬 2022-04-29 09:32 采纳率: 0%
浏览 16
已结题

js中modbus加MQTT上传温湿度数据到阿里云

问题遇到的现象和发生背景

温度和湿度在同一个字节无法区分

问题相关代码,请勿粘贴截图
var server = "iot-06z00e19weuhleq.mqtt.iothub.aliyuncs.com";
var port = 1883;
var pkt_id = 1;

var productKey = "gkraFmIWznW";
var deviceName = "yichuanhezi";
var deviceSecret = "7d0c91a9062a78234d586b2dd7523dee";

var clientname = "gkraFmIWznW";
var securemode = 3;
var signmethod = "hmacsha1"; //"hmacmd5";

var clientid = "gkraFmIWznW.yichuanhezi|securemode=2,signmethod=hmacsha256,timestamp=2524608000000|";
var username = "yichuanhezi&gkraFmIWznW";
var content = "productKeygkraFmIWznWdeviceNameyichuanhezitimestamp2524608000000clientidgkraFmIWznW";
var password = "543cfe44849edfdb8d05bc672fb569984b47afdee07dc422d6fc5845fb370860";
var topic1 = "/sys/gkraFmIWznW/yichuanhezi/thing/event/property/post";
var topic2 = "/sys/gkraFmIWznW/yichuanhezi/thing/event/property/post_reply";

function readModbus(addr, cmd, reg, count) 
{
    var d = Bytes.create(8); 
    d.seti(addr, 0);
    d.seti(cmd, 1);
    d.seti(reg, 2, "2b");
    d.seti(count, 4, "2b");
    d.seti(Coder.crc16(d.sub(0, 6), "modbus"), 6, "2l");
    UART.send(3, d);
}

function processData(port, data)
{
    if(port == 1)
    {
        var cmd = data.gets();
        if(cmd == "read")
        {
            readModbus(1, 3, 501, 1);  //501  温度值
        }
        else if(cmd=="read2")
        {
            readModbus(1, 3, 500, 1); //500  湿度值
        }
        else
        {
            print("unknown cmd");
        }
    }
    if(port == 3)
    {
        if(Coder.crc16(data, "modbus") == 0)
        {
            var addr = data.geti(0);
            var cmd = data.geti(1);
            var count = data.geti(2) / 2;
            for(var i = 0; i < count; i++)
            {
                return (data.geti(3 + i * 2 , "2b"))/10;
            }
        }
    }
    return 0;
}

function _processData(port, data)
{
    if(port == 3)
    {
        if(Coder.crc16(data, "modbus") == 0)
        {
            var addr = data.geti(0);
            var cmd = data.geti(1);
            var count = data.geti(2) / 2;
            for(var i = 0; i < count; i++)
            {
                return (data.geti(3 + i * 2 , "2b"))/10;
            }
        }
    }
    return 0;
}

function hmac_sha1(key, data)
{
    if(key.length > 64) key = Coder.sha1(key);
    else key = Bytes.create(key);
        
    var hkey = Bytes.create(64);
    hkey.copy(key);

  var ipad = Bytes.create(64 + data.length);
  var opad = Bytes.create(64 + 20);
  for(var i = 0; i < 64; i++)
  {
    ipad[i] = hkey[i] ^ 0x36;
    opad[i] = hkey[i] ^ 0x5C;
  }
  ipad.sets(data, 64);
  var hash = Coder.sha1(ipad);
  opad.copy(hash, 64);
  return Coder.sha1(opad, 64);
}

function handleMQTTData(data)
{
    //print(JSON.stringify(data));
    switch(data.type)
    {
        case Packet.MQTT.CONNACK:
            Net.send(1, Packet.MQTT.subscribe(pkt_id, topic2, 1));
            print("aaa");
            pkt_id++;
            break;
        case Packet.MQTT.PUBLISH:
            if(data.qos == 1)
                Net.send(1, Packet.MQTT.puback(data.id));
            break;
    }
}
var mqtt = Packet.MQTT.Parser.create(handleMQTTData);

function handleNetEvent(m)
{
    switch(m.event)
    {
        case Net.READY:
            print("csq:", Net.csq());
            print("syncTime:", Net.syncTime());
            var t = Box.getTime();
            print(t.year, t.month, t.day,t.hour, t.minute, t.second);
            Net.connect(1, server, port);
            break;
        case Net.CONN_OK:
            Net.send(1, Packet.MQTT.connect(clientid, 60, 1, username, password));
            readModbus(1, 4, 501, 1);
            readModbus(1, 4, 500, 1);
            Timer.start(1, 20000);
            Timer.start(2, 5000);
            Timer.start(3, 2000);
            break;
        case Net.CONN_FAIL:
            print("connect failed");
            break;
        case Net.CONN_CLOSE:
            print("connect closed");
            Timer.stop(1);
            Timer.stop(2);
            break;
        case Net.RECV:
            print("mqtt_data:");
            print(m.data.hex());
            mqtt.parse(m.data);
            break;
    }
}

function handleTimerOut(id, s)
{
    switch(id)
    {
        case 1: //send heartbeat packet
            Net.send(1, Packet.MQTT.ping());
            Timer.start(1, 30000);
            break;
        case 2: //send publish packet
             var sensor_data = {params:{}};
             sensor_data.params.Temperature = s; //501温度
             //sensor_data.params.RelativeHumidity = b;//500湿度
             var str = JSON.stringify(sensor_data);
            Net.send(1, Packet.MQTT.publish(topic1, Bytes.create(str), 1, pkt_id));
            pkt_id++;
            Timer.start(2, 5000);
            break;
        case 3:
            readModbus(1, 4, 501, 1);
            Timer.start(3, 2000);
            break;
        //case 4:
          //  readModbus(1, 4, 500, 1);
            //Timer.start(4, 2000);
            //break;
    }
}

UART.open(3, 4800);
GPIO.set(GPIO.POWER, 1);
Net.init();

var s = 0;
//var b = 0;
while(true)
{
    var m = Event.get();

    switch(m.msg)
    {
        case Event.NET_EVENT:
            handleNetEvent(m);
            break;
        case Event.TIMER_OUT:
            handleTimerOut(m.id, s);
            break;
        case Event.UART_RECV:
            s = processData(m.port, m.data);
            //b = _processData(m.port, m.data);
            break;
    }
}

运行结果及报错内容

阿里云上无法同时获得温度和湿度数据,同一时间只能获取一个

我的解答思路和尝试过的方法

我尝试过用modbus获取两个传感器的值 一个在3字节一个在5字节 同时分别上传 但是区分不出来

我想要达到的结果

想让温湿度等传感器的值同时上传到阿里云

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 5月7日
    • 创建了问题 4月29日

    悬赏问题

    • ¥20 指导如何跑通以下两个Github代码
    • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
    • ¥15 C++为什么这个代码没报错运行不出来啊
    • ¥15 一道ban了很多东西的pyjail题
    • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
    • ¥15 C++识别堆叠物体异常
    • ¥15 微软硬件驱动认证账号申请
    • ¥15 GPT写作提示指令词
    • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
    • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题