Java对接维特智能WIT901WIFI姿态传感器
背景
最近有个项目需要对接传感器,将传感器的数据转发到其他设备,目前只有维特智能的WIT901WIFI传感器。
传感器长这样
配置网络
这个传感器是通过WIFI传输数据,所以第一步需要配置WIFI。
下载上位机软件
官方页面 https://wit-motion.yuque.com/wumwnr/docs/cmxpmgcensdqg5ag#TKIRF
直接下载上位机软件 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密码,服务器选当前上位机,点开始配网
成功后会提示服务器连接成功,并且会弹出一个TempData的窗口
如果失败检查下WIFI是否连接上了,电脑和WIFI是否在同一个局域网
然后主窗口应该会显示传感器的数据,如果没有就重启软件
设置传感器服务器
传感器服务器就是指接受传感器数据的设备
如果要设置接收传感器数据的服务器,需要先给传感器发送服务器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 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();
}
}
查看接收到的数据
数据解析
参考官方文档 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 | 磁场XYZ |
45.92 | 温度 |
4.15 | 电量 |
-65 | 信号 |
13008 | 版本号 |
0 | 报警信号 |
\r\n | 结束符 |