问题遇到的现象和发生背景
温度和湿度在同一个字节无法区分
问题相关代码,请勿粘贴截图
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字节 同时分别上传 但是区分不出来
我想要达到的结果
想让温湿度等传感器的值同时上传到阿里云