Popravljen sprejemnik za linux (monitor mode)

main
Jurij Podgoršek 2024-09-16 00:07:59 +02:00
parent 9948e344d5
commit 93cf9f9e72
6 changed files with 123 additions and 70 deletions

Binary file not shown.

View File

@ -20,7 +20,7 @@ $ sudo ifconfig wlp5s0 down
$ sudo iwconfig wlp5s0 mode monitor $ sudo iwconfig wlp5s0 mode monitor
$ sudo ifconfig wlp5s0 up $ sudo ifconfig wlp5s0 up
3/Run this code as root 3/Run this code as root or regular user!
*/ */
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
@ -45,18 +45,34 @@ $ sudo ifconfig wlp5s0 up
#include "lo/lo_lowlevel.h" #include "lo/lo_lowlevel.h"
#include "lo/lo_osc_types.h" #include "lo/lo_osc_types.h"
#define PACKET_LENGTH 400 //Approximate // OSC destination; localhost supercollider running @ default port (57121)
// @TODO get this from argv?
lo_address osc_dest;
//Approximate
#define PACKET_LENGTH 400
#define MAX_PACKET_LEN 1000 #define MAX_PACKET_LEN 1000
// ESPNOW data payload starts at byte 60
#define ESP_DATA_OFFSET 57
// Sensor message
#include "../src/sensor_msg.h"
// Maksimalno stevilo // Maksimalno stevilo
#define ST_SPREJEMNIKOV 10 #define ST_SPREJEMNIKOV 10
// Receiver MAC start at byte 52
#define WLAN_DA_OFFSET 52
/*our MAC address*/
uint8_t sprejemnikMac[] = { 0x9c, 0xb6, 0xd0, 0xc4, 0xe8, 0xb9 };
uint8_t wlan_da[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
// ESPNOW packet identifier
#define ESP_ID_OFFSET 82
uint8_t esp_id[] = { 0x18, 0xfe, 0x34, 0x04 };
uint8_t pkg_header[] = { 0x0, 0x0, 0x0, 0x0 };
// ESPNOW data payload starts at byte 87
#define ESP_DATA_OFFSET 87
// Sensor message
#include "../src/sensor_msg.h"
uint8_t odcitekId; uint8_t odcitekId;
sensor_msg odcitki[ST_SPREJEMNIKOV]; sensor_msg odcitki[ST_SPREJEMNIKOV];
bool poslji[ST_SPREJEMNIKOV]; bool poslji[ST_SPREJEMNIKOV];
@ -66,9 +82,6 @@ struct timeval cas;
struct timeval zdaj; struct timeval zdaj;
int eps = 0; int eps = 0;
/*our MAC address*/
//{0xF8, 0x1A, 0x67, 0xB7, 0xeB, 0x0B};
/*ESP8266 host MAC address*/ /*ESP8266 host MAC address*/
//{0x84,0xF3,0xEB,0x73,0x55,0x0D}; //{0x84,0xF3,0xEB,0x73,0x55,0x0D};
@ -102,17 +115,52 @@ static struct sock_filter bpfcode[FILTER_LENGTH] = {
}; };
void print_packet(uint8_t *data, int len) { void print_packet(uint8_t *data, int len) {
/* // Beri samo primerne pakete!
char macNaslov[18]; memcpy(&wlan_da, data + WLAN_DA_OFFSET, 6);
snprintf(macNaslov, sizeof(macNaslov), "%02x:%02x:%02x:%02x:%02x:%02x", #ifdef DEBUG
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); printf("Dest MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", wlan_da[0],wlan_da[1],wlan_da[2],wlan_da[3],wlan_da[4],wlan_da[5]);
#endif
/* DEBUG - print whole raw packet */
#ifdef DEBUG
for (int i = 0; i < len; i++) {
printf("0x%02x ", data[i]);
}
printf("\n");
#endif
// Ignoriraj pakete, ki so namenjeni drugam
for (int i = 0; i < 6; i++) {
if (wlan_da[i] != sprejemnikMac[i]) {
return;
}
}
// Ignoriraj pakete, ki niso ESP paketi!
memcpy(&pkg_header, data + ESP_ID_OFFSET, 4);
for (int i = 0; i < 4; i++) {
if (pkg_header[i] != esp_id[i]) {
return;
}
}
// Stetje paketov na sekundo
eps += 1;
gettimeofday(&zdaj, NULL);
if (zdaj.tv_sec != cas.tv_sec) {
printf("Paketov na sekundo: %i\n", eps);
eps = 0;
gettimeofday(&cas, NULL);
}
printf("%s\n", macNaslov);
*/
//printf("Prejel podatke dolzine %i \n", len);
// ID senzorja // ID senzorja
odcitekId = (uint8_t) data[ESP_DATA_OFFSET]; memcpy(&odcitekId, data + ESP_DATA_OFFSET, 1);
#ifdef DEBUG
printf("Odcitek ID: %i\n", odcitekId);
#endif
// Vrednosti // Vrednosti
memcpy(&odcitki[odcitekId], data + ESP_DATA_OFFSET, sizeof(sensor_msg)); memcpy(&odcitki[odcitekId], data + ESP_DATA_OFFSET, sizeof(sensor_msg));
@ -131,18 +179,6 @@ void print_packet(uint8_t *data, int len) {
#endif #endif
eps += 1;
gettimeofday(&zdaj, NULL);
if (zdaj.tv_sec != cas.tv_sec) {
printf("Paketov na sekundo: %i\n", eps);
eps = 0;
gettimeofday(&cas, NULL);
}
return;
// @TODO locen thread za posiljanje? // @TODO locen thread za posiljanje?
char glava[32]; char glava[32];
lo_bundle svezenj; lo_bundle svezenj;
@ -176,6 +212,7 @@ void print_packet(uint8_t *data, int len) {
sporocilo = lo_bundle_serialise(svezenj, NULL, &dolzina); sporocilo = lo_bundle_serialise(svezenj, NULL, &dolzina);
lo_bundle_pp(svezenj); lo_bundle_pp(svezenj);
lo_send_bundle(osc_dest, svezenj);
printf("%s\n", sporocilo); printf("%s\n", sporocilo);
lo_bundle_free(svezenj); lo_bundle_free(svezenj);
@ -183,12 +220,6 @@ void print_packet(uint8_t *data, int len) {
//free(sporocilo); //free(sporocilo);
} }
} }
/* DEBUG - print whole raw packet
for (int i = 0; i < len; i++) {
printf("0x%02x ", data[i]);
}
printf("\n");
*/
} }
int create_raw_socket(char *dev, struct sock_fprog *bpf) int create_raw_socket(char *dev, struct sock_fprog *bpf)
@ -221,8 +252,7 @@ int create_raw_socket(char *dev, struct sock_fprog *bpf)
return fd; return fd;
} }
int main(int argc, char **argv) int main(int argc, char **argv) {
{
assert(argc == 2); assert(argc == 2);
uint8_t buff[MAX_PACKET_LEN] = {0}; uint8_t buff[MAX_PACKET_LEN] = {0};
@ -232,12 +262,13 @@ int main(int argc, char **argv)
sock_fd = create_raw_socket(dev, &bpf); /* Creating the raw socket */ sock_fd = create_raw_socket(dev, &bpf); /* Creating the raw socket */
printf("\n Waiting to receive packets ........ \n"); // @TODO get this from args?
osc_dest = lo_address_new("localhost", "57121");
printf("\n Waiting to receive packets ........ \n");
gettimeofday(&cas, NULL); gettimeofday(&cas, NULL);
while (1) while (1) {
{
int len = recvfrom(sock_fd, buff, MAX_PACKET_LEN, MSG_TRUNC, NULL, 0); int len = recvfrom(sock_fd, buff, MAX_PACKET_LEN, MSG_TRUNC, NULL, 0);
if (len < 0) { if (len < 0) {

View File

@ -0,0 +1,9 @@
#!/bin/bash
rmmod ath10k_pci
rmmod ath10k_core
modprobe ath10k_core
modprobe ath10k_pci
systemctl start NetworkManager

View File

@ -0,0 +1,21 @@
#!/bin/bash
dev=${1:-wlp3s0}
chan=${2:-1}
rmmod ath10k_pci
rmmod ath10k_core
systemctl stop NetworkManager
sleep 1
modprobe ath10k_core awmode=1 cryptmode=1
sleep 1
modprobe ath10k_pci
sleep 1
ifconfig $dev down
iwconfig $dev mode monitor
ifconfig $dev up
iwconfig $dev channel $chan

View File

@ -1,3 +1,5 @@
#!/bin/bash #!/bin/bash
sudo ./bin/receiver wlxd0aeec558360 dev=${1:-wlp3s0}
sudo ./bin/receiver $dev

View File

@ -1,10 +0,0 @@
#!/bin/bash
dev="wlxd0aeec558360"
chan="1"
# sudo bash prep.sh *iface* *channel*
# sudo bash prep.sh wlp1s0 8
ifconfig $dev down
iwconfig $dev mode monitor
ifconfig $dev up
iwconfig $dev channel $chan