据上篇文章,已在Linux系统中安装LinuxCsiTools,用特定IntelWiFiLink 5300无线网卡收集WiFi信道数据。然后在matlab中利用CsiTools提供的工具解析数据,画出数据实时变化图像。本文重点是在matlab中建立TcpIp连接把数据传给JavaWeb,用Echarts控件在Web界面上画实时图像。
其中得到的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]’);
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 &#