基于Web的实时WIFI CSI可视化

据上篇文章,已在Linux系统中安装LinuxCsiTools,用特定IntelWiFiLink 5300无线网卡收集WiFi信道数据。然后在matlab中利用CsiTools提供的工具解析数据,画出数据实时变化图像。本文重点是在matlab中建立TcpIp连接把数据传给JavaWeb,用Echarts控件在Web界面上画实时图像。
其中得到的CSI数据如下:
这是一个单位为线性的1×2×30的CSI矩阵,它表示此时链路的输入输出信道状态信息。
这是一个单位为线性的1×2×30的CSI矩阵,它表示此时链路的输入输出信道状态信息。
然后在二个不同的空间路径对1×2×30的CSI矩阵进行测量并绘图:
plot(db(abs(squeeze(csi).’)))
legend(‘RX Antenna A’, ‘RX Antenna B’, ‘Location’, ‘SouthEast’ );
xlabel(‘Subcarrier index’);
ylabel(‘SNR [dB]’);
子载波SNR

WiFi CSI数据实时呈现在Web上必须要有数据解析与传递,Matlab负责解析数据,Java Web 负责可视化数据,所以Matlab要把解析之后的数据实时发送到Java Web。
主要算法思想:构建TCP服务器并等待Linux客户端连接,连接成功则循环从接收到的包中读取数据并解析,并把解析后的数据实时发送给Java Web。
Linux终端上运行log_to_server.c,代码如下:

#include "iwl_connector.h"

#include <arpa/inet.h>
#include <sys/socket.h>
#include <linux/socket.h>
#include <linux/netlink.h>
#include <linux/connector.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/errno.h>

#define MAX_PAYLOAD 2048
#define SLOW_MSG_CNT 1

#define SERV_PORT 8090
#define SERV_IP "127.0.0.1"

int serv_port = -1;
char serv_ip[16];

int sock_fd = -1;							// the socket to receive
int sock_cli_fd = -1;							// the socket to send data to server

void check_usage(int argc, char** argv);

void caught_signal(int sig);

void exit_program(int code);
void exit_program_err(int code, char* func);

int Socket(int, int, int);
void Inet_pton(int , const char *, void *);
void Connect(int, struct sockaddr_in * , int);

int main(int argc, char** argv)
{
   
	/* Local variables */
	struct sockaddr_nl proc_addr, kern_addr;	// addrs for recv, send, bind
	struct cn_msg *cmsg;
	char buf[4096];
	int ret;
	unsigned short l, l2;
	int count = 0;
	struct sockaddr_in servaddr;

	/* Make sure usage is correct and to use default value when necessary*/
	check_usage(argc, argv);	
	
	printf("to connect %s with port %d\n", serv_ip, serv_port);
	
	/* Connect with Internet server*/
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(serv_port);	
	Inet_pton(AF_INET, serv_ip, &servaddr.sin_addr);

	sock_cli_fd = Socket(AF_INET, SOCK_STREAM, 0);
	Connect(sock_cli_fd, &servaddr, sizeof(servaddr));


	/* Setup the socket */
	sock_fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);
	if (sock_fd == -1)
		exit_program_err(-1, "socket");

	/* Initialize the address structs */
	memset(&proc_addr, 0, sizeof(struct sockaddr_nl));
	proc_addr.nl_family = AF_NETLINK;
	proc_addr.nl_pid = getpid();			// this process' PID
	proc_addr.nl_groups = CN_IDX_IWLAGN;
	memset(&kern_addr, 0, sizeof(struct sockaddr_nl));
	kern_addr.nl_family = AF_NETLINK;
	kern_addr.nl_pid = 0;					// kernel
	kern_addr.nl_groups = CN_IDX_IWLAGN;

	/* Now bind the socket */
	if (bind(sock_fd, (struct sockaddr *)&proc_addr, sizeof(struct sockaddr_nl)) == -1)
		exit_program_err(-1, "bind");

	/* And subscribe to netlink group */
	{
   
		int on = proc_addr.nl_groups;
		ret = setsockopt(sock_fd, 270, NETLINK_ADD_MEMBERSHIP, &on, sizeof(on));
		if (ret)
			exit_program_err(-1, "setsockopt");
	}

	/* Set up the &#
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值