當前位置:編程學習大全網 - 編程語言 - 如何在android手機上使用hackrf

如何在android手機上使用hackrf

JNI方面

1)將編譯好的庫導入工程

拷貝libhackrf.h、libhackrf.so和libusb1.0.so到工程目錄,創建libusb1.0.mk和libhackrf.mk

libusb1.0.mk

通過libhackrf.mk即可將libhackrf連接到工程中。

2)初始化hackrf,註冊接收函數。

JNI接口

[cpp] view plain copy

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_test(

JNIEnv *env, jclass cls) {

int result = HACKRF_SUCCESS;

result = hackrf_init();

if (result == HACKRF_SUCCESS) {

return env->NewStringUTF("OK!");

} else {

return env->NewStringUTF("Error!");

}

}

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_init(

JNIEnv *env, jobject thiz) {

int result = HACKRF_SUCCESS;

uint8_t board_id = BOARD_ID_INVALID;

char pbuf[2048] = { 0 };

result = hackrf_init();

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_init() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

result = hackrf_open(&device);

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_open() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

result = hackrf_board_id_read(device, &board_id);

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_board_id_read() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

sprintf(pbuf, "Board ID Number: %d (%s)\n", board_id,

hackrf_board_id_name((hackrf_board_id) board_id));

return env->NewStringUTF(pbuf);

}

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_setSampleRateManual(

JNIEnv *env, jobject thiz, jlong freq, jint divi) {

int result = HACKRF_SUCCESS;

char pbuf[2048] = { 0 };

result = hackrf_set_sample_rate_manual(device, freq, divi);

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_set_sample_rate_manual() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

return env->NewStringUTF("ok");

}

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_setVgaGain(

JNIEnv *env, jobject thiz, jint vga) {

int result = HACKRF_SUCCESS;

char pbuf[2048] = { 0 };

result = hackrf_set_vga_gain(device, vga);

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_set_vga_gain() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

return env->NewStringUTF("ok");

}

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_setLnaGain(

JNIEnv *env, jobject thiz, jint lna) {

int result = HACKRF_SUCCESS;

char pbuf[2048] = { 0 };

result = hackrf_set_lna_gain(device, lna);

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_set_lna_gain() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

return env->NewStringUTF("ok");

}

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_setFreq(

JNIEnv *env, jobject thiz, jlong freq) {

int result = HACKRF_SUCCESS;

char pbuf[2048] = { 0 };

result = hackrf_set_freq(device, freq);

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_set_freq() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

return env->NewStringUTF("ok");

}

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_setAmpEnable(

JNIEnv *env, jobject thiz, jint b) {

int result = HACKRF_SUCCESS;

char pbuf[2048] = { 0 };

result = hackrf_set_amp_enable(device, b == 0 ? false : true);

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_set_amp_enable() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

return env->NewStringUTF("ok");

}

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_startRX(

JNIEnv *env, jobject thiz) {

int result = HACKRF_SUCCESS;

char pbuf[2048] = { 0 };

result = hackrf_start_rx(device, hackrf_rx_cb, env->NewGlobalRef(thiz));

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_start_rx() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

return env->NewStringUTF("ok");

}

JNIEXPORT jstring JNICALL Java_com_pagekpang_hackrftouch_HackRFTouch_stopRX(

JNIEnv *env, jobject thiz) {

int result = HACKRF_SUCCESS;

char pbuf[2048] = { 0 };

result = hackrf_stop_rx(device);

if (result != HACKRF_SUCCESS) {

sprintf(pbuf, "hackrf_stop_rx() failed: %s (%d)\n",

hackrf_error_name((hackrf_error) result), result);

return env->NewStringUTF(pbuf);

}

return env->NewStringUTF("ok");

}

java層與JNI接口的綁定

[java] view plain copy

package com.pagekpang.hackrftouch;

public class HackRFTouch {

static {

System.loadLibrary("usb1.0");

System.loadLibrary("hackrf");

System.loadLibrary("HackrfTouch");

}

public static native String test();

private native String init();

private native String setSampleRateManual(long freq, int divi);

private native String setVgaGain(int g);

private native String setLnaGain(int g);

private native String setFreq(long freq);

private native String setAmpEnable(int f);

public native String startRX();

public native String stopRX();

public native float[] readRx();

private String retString = "";

private Boolean isOpen = false;

private ReadRxThread mReadRxThread = null;

public HackRFTouch() {

// TODO Auto-generated constructor stub

retString = init();

if (!retString.contains("failed")) {

isOpen = true;

mReadRxThread = new ReadRxThread(this);

}

}

class ReadRxThread extends Thread {

HackRFTouch mThisHackRFTouch = null;

public ReadRxThread(HackRFTouch t) {

// TODO Auto-generated constructor stub

mThisHackRFTouch = t;

}

@Override

public void run() {

// TODO Auto-generated method stub

super.run();

while(true){

mThisHackRFTouch.cb(mThisHackRFTouch.readRx());

try {

Thread.sleep(100);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

public Boolean isOpen() {

return isOpen;

}

public String getLastError() {

return retString;

}

public Boolean HsetSampleRateManual(long freq, int divi) {

if (!isOpen) {

return false;

}

retString = setSampleRateManual(freq, divi);

if (retString.contains("failed")) {

return false;

} else {

return true;

}

}

public Boolean HsetLnaGain(int g) {

if (!isOpen) {

return false;

}

retString = setLnaGain(g);

if (retString.contains("failed")) {

return false;

} else {

return true;

}

}

public Boolean HsetVgaGain(int g) {

if (!isOpen) {

return false;

}

retString = setVgaGain(g);

if (retString.contains("failed")) {

return false;

} else {

return true;

}

}

public Boolean HsetFreq(long freq) {

if (!isOpen) {

return false;

}

retString = setFreq(freq);

if (retString.contains("failed")) {

return false;

} else {

return true;

}

}

public Boolean HstopRX() {

if (!isOpen) {

return false;

}

retString = stopRX();

if (retString.contains("failed")) {

return false;

} else {

return true;

}

}

3)FFT運算

[cpp] view plain copy

if (device != NULL) {

float raw[1024];

int dalen = transfer->valid_length;

float realF, imagF, maxF;

uint8_t *pbuf = transfer->buffer;

while (dalen > 0 && runcount == 0) {

complex<double>* fdata = new complex<double> [1024];

complex<double>* fout = new complex<double> [1024];

for (int i = 0; i < 2048; i += 2) {

fdata[i / 2] = complex<double>(meanN(&pbuf[i], 100), meanN(&pbuf[i + 1], 100));

}

FFT(fdata, fout, 10);

//dft(fdata, 10, 0);

//fout = fdata;

maxF = 0.0;

for (int i = 0; i < 1024; i++) {

raw[i] = pow(pow(fout[i].real(), 2) + pow(fout[i].imag(), 2),

0.5);

if (maxF < raw[i]) {

maxF = raw[i];

}

}

for (int i = 0; i < 1024; i++) {

raw[i] = raw[i] / maxF;

}

sendBuf(raw);

//send(g_client, (char *)&raw, 4*1024, 0); //發送數據

dalen -= 2048;

pbuf += 2048;

runcount = 2;

}

runcount--;

//printf("E");

} else {

printf("O");

}

  • 上一篇:梅州市十大培訓機構
  • 下一篇:加工中心對刀具的步驟有哪些?
  • copyright 2024編程學習大全網