JAVA对接维特智能WIT901WIFI传感器

发布时间 2023-03-29 18:00:12作者: 星耀寂夜

背景

最近有个项目需要对接传感器,将传感器的数据转发到其他设备,目前只有维特智能的WIT901WIFI传感器。
传感器长这样
image

配置网络

这个传感器是通过WIFI传输数据,所以第一步需要配置WIFI。

下载上位机软件

官方页面 https://wit-motion.yuque.com/wumwnr/docs/cmxpmgcensdqg5ag
直接下载上位机软件 https://witpic-1253369323.cos.ap-guangzhou.myqcloud.com/wit-cloud/ep/uploadFile/0b22e450-5040-402f-a404-2c34f6a109cfwifi-udp上位机(v3.0.11).zip

配置WIFI

先通过Type-C线连接传感器至电脑,将传感器开关打开,拨到ON
需要明确一点,WIFI必须是2.4G的,而且不能是中文名,否则会连接不上
打开UDP上位机软件,菜单->系统设置->有线配网
选择一个通讯串口,不知道选哪个自己试一试就行
填写WIFI名称和WIFI密码,服务器选当前上位机,点开始配网
image

成功后会提示服务器连接成功,并且会弹出一个TempData的窗口
如果失败检查下WIFI是否连接上了,电脑和WIFI是否在同一个局域网
image
然后主窗口应该会显示传感器的数据,如果没有就重启软件
image

设置传感器服务器

如果要设置接收传感器数据的服务器,需要先给传感器发送服务器IP
如果已知传感器IP,可直接向传感器IP:9250发送UDP数据包,数据包内容如下

WIT192.168.0.13\r\n

其中192.168.0.13是接收传感器数据的服务器IP地址

如果未知传感器IP,可通过发送数据包到广播地址255.255.255.255:9250,数据包内容同上

Java代码如下

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import static java.net.InetAddress.getByName;

public class SensorUtil {
    public static void setSensorServer() throws IOException {
        // 设置要发送的消息和目标地址
        String message = "WIT192.168.137.1\r\n";
        InetAddress address = getByName("192.168.137.255"); // 192.168.137.1网段的广播地址
        int port = 9250; // 目标端口
        // 将消息转换为字节数组
        byte[] buffer = message.getBytes();
        DatagramSocket socket = new java.net.DatagramSocket();
        // 创建DatagramPacket对象,用于发送消息
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
        // 设置socket的广播属性
        socket.setBroadcast(true);
        // 将消息发送出去
        socket.send(packet);
        socket.close();
    }
}

接收传感器数据

接收传感器数据需要服务器监听本机UDP的1399端口
重点:UDP上位机软件也会监听1399端口,所以需要先关闭UDP上位机软件

使用netty监听并打印数据

import cn.hutool.core.util.StrUtil;
import com.gk.recover.server.NettyServer;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.nio.NioDatagramChannel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

@Slf4j
@Component
public class WIT901UDPServer {

    private static final int PORT = 1399;
    private final EventLoopGroup group = new NioEventLoopGroup();

    public void start() {
        Bootstrap b = new Bootstrap();
        b.group(group)
                .channel(NioDatagramChannel.class)
                .option(ChannelOption.SO_BROADCAST, true)
                .handler(new SimpleChannelInboundHandler<DatagramPacket>() {
                    @Override
                    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) {
                        ByteBuf buf = msg.content();
                        String receiveData = StrUtil.removeSuffix(buf.toString(StandardCharsets.UTF_8), "\r\n");
                        log.info("Receive Data: {}", receiveData);
                    }
                });
        try {
            b.bind(PORT).sync();
        } catch (InterruptedException e) {
            shutdown();
        }
    }

    public void shutdown() {
        group.shutdownGracefully();
    }

}

查看接收到的数据

image

数据解析

参考官方文档 https://wit-motion.yuque.com/wumwnr/docs/lhinmv#2dc7f764
接收数据格式如下

WT5300005765030.026,0.127,0.998,0.000,0.000,0.000,7.349,-1.527,8.618,31,215,262,45.92,4.15,-65,13008,0\r\n
数据内容 数据名称
WT5300005765 设备编号
03 未知,官方没有说明
0.026,0.127,0.998 加速度X,加速度Y,加速度Z
0.000,0.000,0.000 角速度XYZ
7.349,-1.527,8.618 角度XYZ
31,215,262 磁场XYYZ
45.92 温度
4.15 电量
-65 信号
13008 版本号
0 报警信号
\r\n 结束符