标准的linux系统一般都不带ble的应用功能,需要客户自己自定义开发,不过一般可以采用开源的bluez架构,目前最新的已经到5.5版本了,我用的5.4版本。

里面包含了bt的各种应用场景,可以作为bt设备,以及ble主设备和从设备功能 ,而我们项目需要将linux系统作为一个ble从设备,所以需要使用peripheral这个文件夹。

attach.c  attach.h  efivars.c  efivars.h  gap.c  gap.h  gatt.c  gatt.h  log.c  log.h  main.c

代码逻辑可以从main.c开始分析, 找到其中的gap_start函数。

void gap_start(void)
{
    mgmt = mgmt_new_default();
    if (!mgmt) {
        fprintf(stderr, "Failed to open management socket\n");
        return;
    }

if (!mgmt_send(mgmt, MGMT_OP_READ_COMMANDS,
                MGMT_INDEX_NONE, 0, NULL,
                read_commands_complete, NULL, NULL)) {
        fprintf(stderr, "Failed to read supported commands\n");
        return;
    }
}

在这个read_commands_complete函数中找到index_added_event函数,然后进入到read_info_complete函数,在这里会初始化ble的各种配置信息,包括BD地址,以及设备初始化名称。还有其中最为关键的gatt_server_start();

void gatt_server_start(void)
{
    struct sockaddr_l2 addr;

if (att_fd >= 0)
        return;

att_fd = socket(PF_BLUETOOTH, SOCK_SEQPACKET | SOCK_CLOEXEC,
                            BTPROTO_L2CAP);
    if (att_fd < 0) {
        fprintf(stderr, "Failed to create ATT server socket: %m\n");
        return;
    }

memset(&addr, 0, sizeof(addr));
    addr.l2_family = AF_BLUETOOTH;
    addr.l2_cid = htobs(ATT_CID);
    memcpy(&addr.l2_bdaddr, static_addr, 6);
    addr.l2_bdaddr_type = BDADDR_LE_RANDOM;

if (bind(att_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
        fprintf(stderr, "Failed to bind ATT server socket: %m\n");
        close(att_fd);
        att_fd = -1;
        return;
    }

if (listen(att_fd, 1) < 0) {
        fprintf(stderr, "Failed to listen on ATT server socket: %m\n");
        close(att_fd);
        att_fd = -1;
        return;
    }

gatt_db = gatt_db_new();
    if (!gatt_db) {
        close(att_fd);
        att_fd = -1;
        return;
    }

populate_gap_service(gatt_db);
    populate_devinfo_service(gatt_db);

gatt_cache = gatt_db_new();

conn_list = queue_new();
    if (!conn_list) {
        gatt_db_unref(gatt_db);
        gatt_db = NULL;
        close(att_fd);
        att_fd = -1;
        return;
    }

mainloop_add_fd(att_fd, EPOLLIN, att_conn_callback, NULL, NULL);
}

这里会初始化gap 以及device的service服务。这些service里配置了ble从设备需要对外发送的信息。

static void populate_gap_service(struct gatt_db *db)
{
    struct gatt_db_attribute *service;
    bt_uuid_t uuid;

bt_uuid16_create(&uuid, UUID_GAP);
    service = gatt_db_add_service(db, &uuid, true, 6);

bt_uuid16_create(&uuid, GATT_CHARAC_DEVICE_NAME);
    gatt_db_service_add_characteristic(service, &uuid,
                    BT_ATT_PERM_READ,
                    BT_GATT_CHRC_PROP_READ,
                    gap_device_name_read, NULL, NULL);

gatt_db_service_set_active(service, true);
}

bluez-5.41  CMakeLists.txt  src
源代码通过cmake管理,下载路径://download.csdn.net/download/punmpkin/12064879

源码解压之后路径,执行cmake即可,最终生成一个ble_emulator的bin文件,在执行这个bin文件以前需要先将ble功能打开。

需要执行ble_setup.sh脚本,内容如下

# bring up bluetooth
echo 0 > /sys/class/rfkill/rfkill2/state
echo 1 > /sys/class/rfkill/rfkill2/state
brcm_patchram_plus -d --enable_hci --no2bytes --tosleep 200000 --baudrate 3000000 --patchram /lib/firmware/bcm/APM_BCM43456/bcmdhd.hcd /dev/ttymxc2 &
sleep 25
rfkill unblock bluetooth
hciconfig hci0 up
/usr/libexec/bluetooth/bluetoothd --experimental start &

执行这个bin文件,然后在手机设置界面搜索这个ble设备,并点击配对,配对完成之后打开ble 的app,就可以在app里查看信息以及发送数据了。

bluez协议栈移植:https://www.jianshu.com/p/dec269a76700

Linux 系统ble功能开发相关推荐

  1. 在线教育平台系统后台功能开发

    如今许多网校平台开始网络直播在线教育培训,你是不是也想着开发一个这样的平台呢,大家跟着我来看一下,这个在线教育系统首页功能开发到底是怎样开发呢. 在这里先给大家唠叨一下这个开发流程,当客户在某处找到们 ...

  2. 迅为IMX6ULL教程更新至2060+页,裸机开发,Linux系统移植,驱动开发,构建文明系统,QT开发,系统编程

    教程更新至2060+页 彻底让零基础的同学真正学会 更完善的教程更全面的讲解更高效的学习 第一部分 总领及学习指引:主要探讨的学习方法,我们将尽量用比较简洁的方式,让大家明白嵌入式系统知识体系,以及它 ...

  3. 玩转开发板--Linux系统移植至开发板fl2440实践过程

    一.开发板介绍     CPU:S3C2440(SAMSUNG).ARM920T.400MHz     Pone/mic:耳机和话筒 JTAG:可以通过外部插入直接控制CPU,因此在初始化内存时,起到 ...

  4. LKT5103A Hid接口LINUX系统下JNI开发流程

    一.什么是JNI Java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能.解决Java对本地操作的一种方法就是JNI.JNI是Java ...

  5. linux系统回收站功能的实现

    如何实现linux系统的回收站功能,对rm权限做限制,避免误删造成不可逆问题. 这就要靠环境变量去实现,首先需要了解环境变量的作用. /etc/profile,/etc/bashrc 是系统全局环境变 ...

  6. linux系统中用c开发东西可以吗,Linux下的C的开发之GCC的初级使用

    Linux下的C开发,可能与win平台的C有点不太一样,但可能不太多,遇到再说吧,我们今天要说的就是GCC的使用技巧(初级的),完全菜鸟级的!! 很多人的感觉,特别是离开win平台,到Linux平台写 ...

  7. linux系统移植与开发

    文章目录 前言 1 .第一次拿到开发板需要做什么 1.1 . 开发板启动方式,接线方法 1.2 . 开发板驱动安装 2.U-BOOT的修改和完善 2.1.简单的源码修改 2.1.1.串口输出欢迎图案和 ...

  8. linux系统修改时区开发板,Linux系统时区时间修改

    我们知道,计算机系统有两个时钟,一个是硬件时钟,一个是系统时钟,硬件时钟的工作原理就是电脑在开机运行的时候会给主板上的纽扣电池充电,关机后这块电池还为存放系统参数的CMOS.RAM供电,以保存其中的系 ...

  9. 嵌入式Linux系统基础程序开发

    文章目录 一.​ ubuntu开发环境下使用gcc编译c程序 1.编写helloworld的c程序 2.编写一个主程序文件 main1.c 和一个子程序文件 sub1.c 二,在window系统中使用 ...

最新文章

  1. [转载]oracle索引的简单总结
  2. Debug模式下加载文件,运行程序异常的慢
  3. ios转向前端进阶之:html标签类型
  4. hdu4179 限制最短路
  5. 活动 | 5 位大咖,手把手教你玩转数据驱动精细化运营
  6. ADOQuery代替ClientDataSet做3-Tier系统
  7. 单片机驱动DM9000网卡芯片(详细调试过程)【下】
  8. 1.1.2 操作系统的特征(并发、共享、虚拟、异步)
  9. json 服务器 文件,json属于服务器文件吗
  10. C++中的也能使用正则表达式
  11. java使用validator进行校验
  12. python tkinter pack 同一行_用python tkinter中的一行连接2个复选按钮
  13. Linux 使用正则表达式的常用命令
  14. 漫步最优化十三——驻点
  15. [转]Postgres-XL 10r1英文文档
  16. android 62 手机存储目录的划分
  17. 【每日算法Day 96】腾讯面试题:合并两个有序数组
  18. Git的介绍和常用命令使用
  19. Codeforces Gym 101142 C. CodeCoder vs TopForces(思维+图论)
  20. 影音先锋 android下载地址,影音先锋安卓版下载

热门文章

  1. 解决Edge浏览器无法同步问题
  2. pcb之Altium Designer 软件介绍和安装流程。
  3. Visio Studio Code 图标美化
  4. 我为12306想想办法
  5. ANSYS-Workbench-Multizone网格划分_51CAE_新浪博客
  6. mysql xor详细_MySQL XOR运算符与IN子句?
  7. Android模拟器软键盘不在了怎么办及快捷键
  8. 【C语言】简单三子棋游戏/井字棋游戏
  9. 局域网内补丁更新80072EE2错误
  10. 如何使用git下载别人在github的代码?