From 65a094bd57829118503802220b7125053c643c41 Mon Sep 17 00:00:00 2001 From: qvyuanxin <qvyuanxin@454eff88-639b-444f-9e54-f578c98de674> Date: 星期二, 04 七月 2017 18:58:25 +0800 Subject: [PATCH] --- VisitFace/RtspNativeCodec/app/src/main/cpp/serial.c | 240 ++++++++++++++++++++++++++++++ VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java | 3 VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp | 92 +++++++++++ VisitFace/RtspNativeCodec/app/src/main/cpp/serial.h | 139 +++++++++++++++++ 4 files changed, 472 insertions(+), 2 deletions(-) diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp index 6aa67c6..902077f 100644 --- a/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp @@ -17,7 +17,7 @@ #include <stdlib.h> #include "DebugNetwork.h" - +#include "serial.h" //#include <mediastreamer2/include/mediastreamer2/msjava.h> std::stringstream logss; @@ -691,3 +691,93 @@ } } + + +void Delay(unsigned int nDelay) +{ + unsigned int i,j,k; + for ( i=0;i<nDelay;i++ ) + for ( j=0;j<6144;j++ ) + k++; +} + +void callNum(int fd,char phone) +{ + switch ( phone) + { + case '1': + serialWriteString(fd,"DA");//1 + break; + case '2': + serialWriteString(fd,"DB");//2 + break; + case '3': + serialWriteString(fd,"DC");//3 + break; + case '4': + serialWriteString(fd,"DD");//4 + break; + case '5': + serialWriteString(fd,"DE");//5 + break; + case '6': + serialWriteString(fd,"DF");//6 + break; + case '7': + serialWriteString(fd,"DG");//7 + break; + case '8': + serialWriteString(fd,"DH");//8 + break; + case '9': + serialWriteString(fd,"DI");//9 + break; + case '0': + serialWriteString(fd,"DJ");//0 + break; + } +} + +void call(const char * phone) +{ + int fd = serialOpen("/dev/ttyS1",2400); + serialWriteString(fd,"AA"); + Delay(10000); + while (*phone) + { + Delay(10000); + callNum(fd,*(phone++)); + } +} + + +char* jstringTostring(JNIEnv* env, jstring jstr) +{ +char* rtn = NULL; +jclass clsstring = env->FindClass("java/lang/String"); +jstring strencode = env->NewStringUTF("utf-8"); +jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); +jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode); +jsize alen = env->GetArrayLength(barr); +jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE); +if (alen > 0) +{ +rtn = (char*)malloc(alen + 1); + +memcpy(rtn, ba, alen); +rtn[alen] = 0; +} +env->ReleaseByteArrayElements(barr, ba, 0); +return rtn; +} + +void Java_cn_com_basic_face_util_RtspFaceNative_telCall(JNIEnv* env, jclass clazz,jstring phone) + { + call(jstringTostring(phone)); + } + + void Java_cn_com_basic_face_util_RtspFaceNative_Hang(JNIEnv* env, jclass clazz) + { + int fd = serialOpen("/dev/ttyS1",2400); + serialWriteString(fd,"BA"); + } \ No newline at end of file diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.c b/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.c new file mode 100644 index 0000000..d8d3c25 --- /dev/null +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.c @@ -0,0 +1,240 @@ +/* + * Copyright 2012 - 2014 Thomas Buck <xythobuz@xythobuz.de> + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <termios.h> +#include <dirent.h> +#include <errno.h> +#include <time.h> +#include <poll.h> + +#include "serial.h" + +#ifndef XON +#define XON 0x11 +#endif + +#ifndef XOFF +#define XOFF 0x13 +#endif + +#ifndef TIMEOUT +#define TIMEOUT 2 +#endif + +int serialOpen(const char *port, unsigned int baud) { + struct termios options; + + int fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY); + if (fd == -1) { + fprintf(stderr, "Couldn't open port \"%s\": %s\n", port, strerror(errno)); + return -1; + } + + tcgetattr(fd, &options); + + options.c_lflag = 0; + options.c_oflag = 0; + options.c_iflag = 0; + + // Set Baudrate + switch (baud) { + case 9600: + cfsetispeed(&options, B9600); + cfsetospeed(&options, B9600); + break; + case 19200: + cfsetispeed(&options, B19200); + cfsetospeed(&options, B19200); + break; + case 38400: + cfsetispeed(&options, B38400); + cfsetospeed(&options, B38400); + break; + //case 76800: + // cfsetispeed(&options, B76800); + // cfsetospeed(&options, B76800); + // break; + case 115200: + cfsetispeed(&options, B115200); + cfsetospeed(&options, B115200); + break; + default: + fprintf(stderr, "Warning: Baudrate not supported!\n"); + serialClose(fd); + return -1; + } + + // Input Modes + options.c_iflag |= IGNCR; // Ignore CR +#ifdef XONXOFF + options.c_iflag |= IXON; // XON-XOFF Flow Control +#endif + + // Output Modes + options.c_oflag |= OPOST; // Post-process output + + // Control Modes + options.c_cflag |= CS8; // 8 data bits + options.c_cflag |= CREAD; // Enable Receiver + options.c_cflag |= CLOCAL; // Ignore modem status lines + + // Local Modes + options.c_lflag |= IEXTEN; // Extended input character processing + + // Special characters + options.c_cc[VMIN] = 0; // Always return... + options.c_cc[VTIME] = 0; // ..immediately from read() +#ifdef XONXOFF + options.c_cc[VSTOP] = XOFF; + options.c_cc[VSTART] = XON; +#endif + + tcsetattr(fd, TCSANOW, &options); + + tcflush(fd, TCIOFLUSH); + + return fd; +} + +void serialClose(int fd) { + tcflush(fd, TCIOFLUSH); + close(fd); +} + +int serialHasChar(int fd) { + struct pollfd fds; + fds.fd = fd; + fds.events = (POLLIN | POLLPRI); // Data may be read + if (poll(&fds, 1, 0) > 0) { + return 1; + } else { + return 0; + } +} + +void serialWaitUntilSent(int fd) { + while (tcdrain(fd) == -1) { + fprintf(stderr, "Could not drain data: %s\n", strerror(errno)); + } +} + +unsigned int serialWriteRaw(int fd, const char *d, int len) { + unsigned int processed = 0; + time_t start = time(NULL); + + while ((processed < len) && (difftime(time(NULL), start) < TIMEOUT)) { + int t = write(fd, (d + processed), (len - processed)); + if (t == -1) { + fprintf(stderr, "Error while writing: %s\n", strerror(errno)); + return processed; + } else { + processed += t; + } + } + + return processed; +} + +unsigned int serialReadRaw(int fd, char *d, int len) { + unsigned int processed = 0; + time_t start = time(NULL); + + while ((processed < len) && (difftime(time(NULL), start) < TIMEOUT)) { + int t = read(fd, (d + processed), (len - processed)); + if (t == -1) { + fprintf(stderr, "Error while reading: %s\n", strerror(errno)); + return processed; + } else { + processed += t; + } + } + + return processed; +} + +void serialWriteChar(int fd, char c) { + while (serialWriteRaw(fd, &c, 1) != 1); +} + +void serialReadChar(int fd, char *c) { + while (serialReadRaw(fd, c, 1) != 1); +#ifdef XONXOFF + if (*c == XON) { + if (tcflow(fd, TCOON) == -1) { + fprintf(stderr, "Could not restart flow: %s\n", strerror(errno)); + } + serialReadChar(fd, c); + } else if (*c == XOFF) { + if (tcflow(fd, TCOOFF) == -1) { + fprintf(stderr, "Could not stop flow: %s\n", strerror(errno)); + } + serialReadChar(fd, c); + } +#endif +} + +void serialWriteString(int fd, const char *s) { + while (*s) + serialWriteChar(fd, *(s++)); +} + +char** getSerialPorts(void) { + DIR *dir; + struct dirent *ent; + + int size = 0; + dir = opendir("/dev/"); + while ((ent = readdir(dir)) != NULL) { +#ifdef SEARCH + if (strstr(ent->d_name, SEARCH) != NULL) +#endif + size++; + } + closedir(dir); + + char **files = (char **)malloc((size + 1) * sizeof(char *)); + + int i = 0; + dir = opendir("/dev/"); + while (((ent = readdir(dir)) != NULL) && (i < size)) { + +#ifdef SEARCH + if (strstr(ent->d_name, SEARCH) != NULL) { +#endif + + int tmp = strlen(ent->d_name) + 6; + files[i] = (char *)malloc(tmp * sizeof(char)); + strcpy(files[i], "/dev/"); + strcpy(files[i] + 5, ent->d_name); + files[i][tmp - 1] = '\0'; + +#ifdef TRY_TO_OPEN_PORTS + int fdtmp = serialOpen(files[i], 9600); + if (fdtmp != -1) { + serialClose(fdtmp); +#endif + + i++; + +#ifdef TRY_TO_OPEN_PORTS + } else { + free(files[i]); + } +#endif + +#ifdef SEARCH + } +#endif + + } + closedir(dir); + files[i] = NULL; + return files; +} + diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.h b/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.h new file mode 100644 index 0000000..2df81b3 --- /dev/null +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.h @@ -0,0 +1,139 @@ +/* + * Copyright 2012 - 2014 Thomas Buck <xythobuz@xythobuz.de> + */ + +#ifndef _SERIAL_H_ +#define _SERIAL_H_ + +/* + * Configuration + */ + +/*! + * \brief Enable XON/XOFF flow control. + * + * If you uncomment this definition, the serial port code will + * stop sending when a XOFF was received, and start again upon + * receiving XON. However, you need to use the blocking + * read/write functions! + */ +//#define XONXOFF +#define XON 0x11 //!< XON flow control character +#define XOFF 0x13 //!< XOFF flow control character + +/*! + * \brief Search term to filter the list of available ports. + * + * If you define SEARCH, instead of simply returning a list of + * files in /dev/, getSerialPorts() will only return items that + * contain the string defined to SEARCH. + */ +#define SEARCH "tty" + +/*! + * \brief Only list real serial ports. + * + * If you uncomment this definition, getSerialPorts() will try to + * open every port, only returning the name if it is a real serial + * port. This could cause a big delay, if eg. your system tries to + * open non-existing bluetooth devices, waiting for their timeout. + * Also, if your console tty is probed, it might change it's settings. + */ +//#define TRY_TO_OPEN_PORTS + +/*! + * \brief The timeout in seconds for raw reading/writing. + * + * If this amount of time passes without being able to write/read + * a character, the raw I/O functions will return 0. + */ +#define TIMEOUT 2 + +/* + * Setup + */ + +/*! + * \brief open a serial port + * \param port name of port + * \param baud baudrate + * \returns file handle or -1 on error + */ +int serialOpen(const char *port, unsigned int baud); + +/*! + * \brief close an open serial port + * \param fd file handle of port to close + */ +void serialClose(int fd); + +/*! + * \brief query available serial ports + * \returns string array with serial port names. + * Last element is NULL. Don't forget to free() + * after using it! + */ +char **getSerialPorts(void); + +/* + * Raw, non-blocking I/O + */ + +/*! + * \brief read from an open serial port + * \param fd file handle of port to read from + * \param data buffer big enough to fit all read data + * \param length maximum number of bytes to read + * \returns number of bytes really read + */ +unsigned int serialReadRaw(int fd, char *data, int length); + +/*! + * \brief write to an open serial port + * \param fd file handle of port to write to + * \param data buffer containing data to write + * \param length number of bytes to write + * \returns number of bytes really written + */ +unsigned int serialWriteRaw(int fd, const char *data, int length); + +/*! + * \brief wait until data is sent + * \param fd file handle of port to wait for + */ +void serialWaitUntilSent(int fd); + +/* + * Blocking I/O + */ + +/*! + * \brief check if a character has arrived and can be read + * \param fd file handle of port to check + * \returns 1 if a character is available, 0 if not + */ +int serialHasChar(int fd); + +/*! + * \brief read a single character + * \param fd file handle of port to read from + * \param c where read character will be stored + */ +void serialReadChar(int fd, char *c); + +/*! + * \brief write a single character + * \param fd file handle to write to + * \param c character to write + */ +void serialWriteChar(int fd, char c); + +/*! + * \brief write a string + * \param fd file handle to write to + * \param s C string to be written + */ +void serialWriteString(int fd, const char *s); + +#endif + diff --git a/VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java b/VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java index e2e6899..768bb27 100644 --- a/VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java +++ b/VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java @@ -61,7 +61,8 @@ public static native void startCapturePlayer(String uri); public static native void stopCapturePlayer(); public static native ArrayList<NativeImg> getCaptureImages(); - + public static native call(String phone); + public static native hang(); public static int COMPANY_ID = 1001; public static void faceCallBack(int cameraIdx, int count) -- Gitblit v1.8.0