首页 > 系统相关 >t507嵌入式linux经典蓝牙通讯demo

t507嵌入式linux经典蓝牙通讯demo

时间:2023-10-26 15:36:01浏览次数:48  
标签:__ int demo start t507 linux tv include buf

//

 

/*

开启蓝牙

echo 1 > /sys/class/rfkill/rfkill0/state
rtk_hciattach -n -s 115200 /dev/ttySAC1 rtk_h5 &


hciconfig -a
hciconfig hci0 up                打开
hciconfig hci0 piscan            使自身可以被发现
# hciconfig hci0 sspmode 1        设置蓝牙适配器以启用简单配对/
sdptool add SP                 配置好以后,需要手动添加SPP服务
/usr/libexec/bluetooth/bluetoothd -C -n &        这个能读取配置文件中的名称  /var/lib/bluetooth/54:F2:9F:B8:44:BD/settings 


正确的启动顺序

echo 1 > /sys/class/rfkill/rfkill0/state
rtk_hciattach -n -s 115200 /dev/ttySAC1 rtk_h5 &
等待3秒

hciconfig hci0 up
/usr/libexec/bluetooth/bluetoothd -C -n &        
sdptool add SP
hciconfig hci0 piscan 
hciconfig -a


hcitool scan



编译此处是  经典蓝牙的demo 与普通服务器的搭建基本一致
aarch64-linux-gnu-gcc -I/opt/EmbedSky/TQT507/CoreA/longan/out/t507/evb/longan/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/include -g bt_data_demo.c -o 22_bt_data_demo -lpthread && cp ./22_bt_data_demo /home/book/nfs_rootfs



*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include <sys/time.h>
#include <time.h>
#define mydebug printf("[%s %s] %s: %s: %d\n", __DATE__, __TIME__, __FILE__, __func__, __LINE__);
#define mydebugMsg(msg) printf("[%s %s] %s: %s: %d msg:%s\n", __DATE__, __TIME__, __FILE__, __func__, __LINE__, msg);
#define mydebugNum(msg) printf("[%s %s] %s: %s: %d num:%d\n", __DATE__, __TIME__, __FILE__, __func__, __LINE__, msg);
#define mydebugHex(buf, len)                                                                       \
    do                                                                                             \
    {                                                                                              \
        unsigned char *__buf_ptr = (unsigned char *)(buf);                                         \
        printf("[%s %s] %s: %s: %d %s: ", __DATE__, __TIME__, __FILE__, __func__, __LINE__, #buf); \
        for (int i = 0; i < (len); i++)                                                            \
        {                                                                                          \
            printf("%02X ", __buf_ptr[i]);                                                         \
        }                                                                                          \
        printf("\n");                                                                              \
    } while (0);

#define mydebugUs                                                             \
    do                                                                        \
    {                                                                         \
        struct timeval tv_start;                                              \
        gettimeofday(&tv_start, NULL);                                        \
        uint64_t start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec);   \
        printf("[%ld] %s: %s: %d\n", start_ms, __FILE__, __func__, __LINE__); \
    } while (0);

// static uint64_t start_ms_mydebugCalusStart__inner_used=0;
#define getustimestampCalusCurrent() ({ struct timeval tv_start;  gettimeofday(&tv_start, NULL); (tv_start.tv_sec * 1000000 + tv_start.tv_usec); })
#define mydebugCalusStart static uint64_t start_ms_mydebugCalusStart__inner_used = getustimestampCalusCurrent();
#define mydebugCalusUpdate(msg)                                                                                                    \
    {                                                                                                                              \
        start_ms_mydebugCalusStart__inner_used = getustimestampCalusCurrent() - start_ms_mydebugCalusStart__inner_used;            \
        printf("%s: %s: %d \t us:[%ld] %s:%s\n", __FILE__, __func__, __LINE__, start_ms_mydebugCalusStart__inner_used, #msg, msg); \
    }
#define mydebugCalusEnd(msg)                                                                                         \
    {                                                                                                                \
        uint64_t start_ms_mydebugCalusEnd = getustimestampCalusCurrent() - start_ms_mydebugCalusStart__inner_used;   \
        printf("%s: %s: %d \t us:[%ld] %s:%s\n", __FILE__, __func__, __LINE__, start_ms_mydebugCalusEnd, #msg, msg); \
    }

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>

#include <pthread.h>

#define BT_CHANNEL 1
#define MAX_DATA_SIZE 1024
int client;
pthread_mutex_t fastmutexcp = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
int bt_send_info(int socket, void *buf, int len)
{
    mydebugMsg(buf);
    int status = 0;
    pthread_mutex_lock(&fastmutexcp); // 互斥锁上锁
    status = write(socket, buf, len);
    if (status == -1)
    {
        perror("write");
    }
    pthread_mutex_unlock(&fastmutexcp);
    return status;
}
static void *timer_send_data(void *arg)
{
    int _client = (int)arg;
    int count=0;
    char buf[64];
    mydebug;
    while (_client == client)
    {
        count+=1;
        snprintf(buf,64,"timer_timer_timer_timer_timer_timer:%d",count);
        int status = bt_send_info(_client, buf, strlen(buf));
        sleep(3);
    }
}
void receive_data(int socket)
{
    char buffer[MAX_DATA_SIZE] = {0};
    int bytes_read;
    mydebug;

    while (1)
    {
        // 从RFCOMM socket接收数据
        bytes_read = read(socket, buffer, sizeof(buffer));
        if (bytes_read > 0)
        {
            printf("Received data: %s\n", buffer);
            // 处理接收到的数据
            char buf[] = "recv ok!";
            int status = bt_send_info(socket, buf, strlen(buf));
            if (status == -1)
            {
                break;
            }
        }
        else if (bytes_read == 0)
        {
            // 远程设备关闭了连接
            printf("Remote device disconnected.\n");
            break;
        }
        else
        {
            // 发生错误
            perror("read");
            break;
        }
    }
}

int main()
{
    struct sockaddr_rc loc_addr = {0}, rem_addr = {0};
    char buf[MAX_DATA_SIZE] = {0};
    int s;
    mydebug;

    // 创建RFCOMM socket
    s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
    if (s == -1)
    {
        perror("socket");
        exit(1);
    }

    // 设置本地设备的地址
    loc_addr.rc_family = AF_BLUETOOTH;
    loc_addr.rc_bdaddr = *BDADDR_ANY;
    loc_addr.rc_channel = BT_CHANNEL;

    // 将RFCOMM socket绑定到本地设备
    if (bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr)) == -1)
    {
        perror("bind");
        close(s);
        exit(1);
    }

    // 监听RFCOMM socket上的连接请求
    if (listen(s, 1) < 0)
    {
        perror("listen");
        close(s);
        exit(1);
    }

    while (1)
    {
        // 等待连接请求并接受连接
        mydebug;
        socklen_t opt = sizeof(rem_addr);
        client = accept(s, (struct sockaddr *)&rem_addr, &opt);
        if (client == -1)
        {
            perror("accept");
            close(s);
            exit(1);
        }

        // 定时发送
        pthread_t pthid_handle;
        pthread_create(&pthid_handle, NULL, timer_send_data, (void *)client);

        // 连接已建立,接收数据
        receive_data(client);
        close(client);
        client=-1;
    }

    // 关闭连接和socket
    close(s);
    client = -1;

    return 0;
}

 

//

标签:__,int,demo,start,t507,linux,tv,include,buf
From: https://www.cnblogs.com/RYSBlog/p/17789461.html

相关文章

  • 《精通Linux.第2版》PDF高清高质量电子书
    下载:https://pan.quark.cn/s/8c7434ccba69......
  • Linux认证 | 国内常见的Linux认证有哪些?
    国内常见的linux认证有哪些?许多打算从事或者正在从事IT事业的朋友,都对linux认证非常感兴趣,毕竟Linux作为目前世界上最受认可的网络技术认证之一,一直深受IT行业的青睐。考取Linux认证,能够作为你进入行业的敲门砖,成为你职业道路上的加分项,更好地提高自己的职业技能。01国内常见的Lin......
  • Linux-Source insight支持shell脚本
    【脚本链接】https://www.sourceinsight.com/pub/languages/Bash.xclf【设置教程】https://www.cnblogs.com/archive-ch/p/13941358.html......
  • 《Unix/linux系统编程》教材第4章学习笔记
    |第4章|并发编程并行计算导论基于分治原则(如二叉树查找和快速排序等)的算法经常表现出高度的行性,可通过使用并行或并发执行来提高计算速度。并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速地解决问题。顺序算法与并行算法用一个begin-end代码块列出代码......
  • Linux服务器远程文件拷贝两种方法介绍
    假设有两台linux服务器,如何将111.22.3.64上的/usr/local/example-server目录下的所有文件和目录拷贝到55.166.77.246的/usr/local/example-server目录下?  Linux服务器远程文件拷贝两种方法介绍要从一个Linux服务器拷贝文件到另一个Linux服务器,可以使......
  • Linux--Shell
    早上好,未来Dreamin'Her-僕は、彼女の夢を見るShell创建与使用新命令步骤:将脚本保存到文件中赋予文件执行权chmod+xfile将文件放到$PATH目录下(一般都是保存到\home\用户名\bin下)当然我们也可以直接如下这种方法每一次都要写./不同方便上述步骤方法可以......
  • Linux 7 升级git
    环境当前系统版本GIt:1.8.3.1OS:RedHatEnterpriseLinuxServerrelease7.6(Maipo)准备工作Git下载:https://git-scm.com/downloads下载版本:git-2.25.5.tar.xz安装上传至服务器解压xz-dgit-2.25.5.tar.xztar-xfgit-2.25.5.tar安装编译所需要的依......
  • 捡起ctf学习 day2 Linux BUU LFI COURSE 1(Local File Include) burpsuite爆破
    1.LocalFileInclude打开网页 文件包含漏洞,参考知乎专栏https://zhuanlan.zhihu.com/p/540864302随着网站的业务的需求,程序开发人员一般希望代码更加灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个......
  • Linux (KDE) 中使用Network Settings设置静态ip
    在Linux(KDE)中使用NetworkSettings设置s5静态IP详细教程。首先,打开KDE的设置面板。可以通过点击桌面上的设置图标,或者在开始菜单中搜索“Settings”并打开。在设置面板中,点击“Network”选项。接下来,你会看到一个“NetworkConnections”的窗口。在这个窗口中,你需......
  • LINUX | hexdump以16进制查看文件内容
    LINUX|hexdump以16进制查看文件内容时间:2023-10-20文章目录`LINUX`|`hexdump`以`16`进制查看文件内容1.参考2.示例1.以`ASCII`字符显示文件中字符2.以16进制和相应的`ASCII`字符显示文件里的字符3.只显示文件中前n个字符4.以偏移量开始格式输出1.参考1.Linux命令–hexdump(以1......