您尚未登录。

#1 2021-03-03 19:22:05

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

平台 V3S, TINA
基于C,玩弄bluez的时候总感觉要在代码里去使用bluez的agent极其蛋疼,又没怎么处理过dbus的东西,既然如此,拿现成工具搞起来? 好!
如果要直接新开进程bluetoothctl , 可以这样:
使用Local socket 去访问,用socketpair 到一个文件流节点,然后 vfork 出进程,用一个循环去读文件流节点,来取得bluetoothctl 的返回值,
代码如下:

void bluetooth_pthread(void)
{
	int i = 0, ret,haveconnect = 0,sizeread = 0;
	char * Connectedyes = NULL,* Pairedyes = NULL,* yesorno = NULL,*tt = NULL;
   	int fds[2];
	pid_t pid; 
	unsigned char *datareadp = buf;
	memset(buf,0,sizeof(buf));

	char startbluetooth[128];
	sprintf(startbluetooth, "/usr/bin/bluetoothctl\n");

	if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0)
		return -1;

	switch(pid=vfork()) {
	case -1:    /* Error */
		close(fds[0]);
		close(fds[1]);
		return -1;
	case 0:     /* child */
		close(fds[0]);
		dup2(fds[1], 0);
		dup2(fds[1], 1);
		close(fds[1]);
		execl("/bin/sh", "sh", "-c", startbluetooth, NULL);
		//system(bluectl);
		_exit(127);
	}
	/* parent */
	close(fds[1]);
	bluectl =  fds[0];


	bluesafe_write(bluectl,"power on\n",sizeof("power on\n"));//Changing power on succeeded

	while(!blueQuit)
    {
		if((sizeread = read(bluectl,datareadp,4096))> 0)
		{
			printf("\nsizeread = %d\n", sizeread);
			if(LoopBluetoothStateAndHandle(buf) == 0 )//处理你收到的bluetoothctl的返回数据
			{
				
			}
			else
			{
				
			}
		}
	}
	
	blueThreadId = 0;

	close(bluectl);

}

啊这? 大写的蛋疼! 测试的时候还发现read 会断流,简直了还得处理断帧和粘帧? 不要啊!

好了,因为蛋疼所以倒腾。
直接抓了bluetoothctl 单独拿出来编译,这样你可以嵌入任何你自己的代码里,同时可以在代码里去控制bluetooth的任何状态。
这样可以更愉快地玩耍bluez 了,dbus还不用怎么操作, 如果大佬们有更好的办法,可以分享一下,那更感谢了。
当然,这个编译,只要你平台支持了bluez, 那换个平台也是OK的。

文件见附件:
mybluetoothctl.zip

离线

#2 2021-03-05 08:40:05

奔跑的孩子
会员
注册时间: 2021-01-28
已发帖子: 13
积分: 11

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

请问楼主 bluetoothctl 是bluez 的源码包里面的吗?

离线

#3 2021-03-05 08:42:19

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

对的,我直接拿这部分嵌入我的代码,做蓝牙播放器界面

奔跑的孩子 说:

请问楼主 bluetoothctl 是bluez 的源码包里面的吗?

离线

#4 2021-03-05 08:48:36

raspberryman
会员
注册时间: 2019-12-27
已发帖子: 458
积分: 442.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

感谢楼主分享,我以前参考晕哥那个 btstack帖子搞了一个demo,后来没有玩了

郁闷,没有搞定 Ubuntu下用btstack协议栈驱动 RTL8723BS
http://whycan.com/t_1133.html#p53670

咦,居然发现楼主也玩了 btstack...

TeveT 说:

对的,我直接拿这部分嵌入我的代码,做蓝牙播放器界面

奔跑的孩子 说:

请问楼主 bluetoothctl 是bluez 的源码包里面的吗?

最近编辑记录 raspberryman (2021-03-05 08:49:10)

离线

#5 2021-03-05 08:54:00

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

主要就是不想花大时间弄dbus,既然拿出来单独用就分享一下,都是bluez的代码哈哈哈哈,嵌入自己的代码只要回调注册搞一搞,界面交互效率高

raspberryman 说:

感谢楼主分享,我以前参考晕哥那个 btstack帖子搞了一个demo,后来没有玩了

郁闷,没有搞定 Ubuntu下用btstack协议栈驱动 RTL8723BS
http://whycan.com/t_1133.html#p53670

咦,居然发现楼主也玩了 btstack...

TeveT 说:

对的,我直接拿这部分嵌入我的代码,做蓝牙播放器界面

奔跑的孩子 说:

请问楼主 bluetoothctl 是bluez 的源码包里面的吗?

离线

#6 2021-03-05 08:58:13

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

没有玩btstack啦,那时候测试驱动包,
最后测试发现,蓝牙声音出问题是因为驱动打印log问题

raspberryman 说:

感谢楼主分享,我以前参考晕哥那个 btstack帖子搞了一个demo,后来没有玩了

郁闷,没有搞定 Ubuntu下用btstack协议栈驱动 RTL8723BS
http://whycan.com/t_1133.html#p53670

咦,居然发现楼主也玩了 btstack...

TeveT 说:

对的,我直接拿这部分嵌入我的代码,做蓝牙播放器界面

奔跑的孩子 说:

请问楼主 bluetoothctl 是bluez 的源码包里面的吗?

离线

#7 2021-03-05 09:11:19

raspberryman
会员
注册时间: 2019-12-27
已发帖子: 458
积分: 442.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

dbus不适合嵌入式环境,在桌面也有点奇葩,估计是为了进程互操作和解藕吧。

我也想试一试,请问楼主这个代码可以在Ubuntu玩吗?

TeveT 说:

主要就是不想花大时间弄dbus,既然拿出来单独用就分享一下,都是bluez的代码哈哈哈哈,嵌入自己的代码只要回调注册搞一搞,界面交互效率高

raspberryman 说:

感谢楼主分享,我以前参考晕哥那个 btstack帖子搞了一个demo,后来没有玩了

郁闷,没有搞定 Ubuntu下用btstack协议栈驱动 RTL8723BS
http://whycan.com/t_1133.html#p53670

咦,居然发现楼主也玩了 btstack...

TeveT 说:

对的,我直接拿这部分嵌入我的代码,做蓝牙播放器界面

离线

#8 2021-03-05 09:12:38

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

编译器和库的依赖路径要改一下,应该是没问题的。

raspberryman 说:

dbus不适合嵌入式环境,在桌面也有点奇葩,估计是为了进程互操作和解藕吧。

我也想试一试,请问楼主这个代码可以在Ubuntu玩吗?

TeveT 说:

主要就是不想花大时间弄dbus,既然拿出来单独用就分享一下,都是bluez的代码哈哈哈哈,嵌入自己的代码只要回调注册搞一搞,界面交互效率高

raspberryman 说:

感谢楼主分享,我以前参考晕哥那个 btstack帖子搞了一个demo,后来没有玩了

郁闷,没有搞定 Ubuntu下用btstack协议栈驱动 RTL8723BS
http://whycan.com/t_1133.html#p53670

咦,居然发现楼主也玩了 btstack...

离线

#9 2021-03-05 09:20:39

raspberryman
会员
注册时间: 2019-12-27
已发帖子: 458
积分: 442.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

那有空我试一试,再次感谢楼主分享!  有不明白的问题再跟帖请教。

离线

#10 2021-03-05 09:21:50

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

吾乃菜狗,请多指教

raspberryman 说:

那有空我试一试,再次感谢楼主分享!  有不明白的问题再跟帖请教。

离线

#11 2021-03-05 13:37:17

sy373466062
会员
注册时间: 2018-11-12
已发帖子: 115
积分: 111

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

还是DBUS功能全一些

离线

#12 2021-03-05 13:45:09

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

可以通过bluetoothctl的代码骚修改来打开dbus的大门,哈哈哈,

sy373466062 说:

还是DBUS功能全一些

离线

#13 2021-03-08 14:52:21

leonaTian
会员
注册时间: 2021-03-08
已发帖子: 1
积分: 1

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

楼主,你好,最近也在这个蓝牙,用你这个代码编译(交叉编译器:arm-himix200-linux-gcc)失败,如下:

/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: ./client/main.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file ./client/main.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: gdbus/polkit.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file gdbus/polkit.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: gdbus/watch.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file gdbus/watch.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: gdbus/mainloop.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file gdbus/mainloop.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: gdbus/object.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file gdbus/object.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: gdbus/client.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file gdbus/client.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: client/display.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file client/display.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: client/agent.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file client/agent.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: client/gatt.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file client/gatt.o
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: error: monitor/uuid.o uses VFP register arguments, mybluetoothctl does not
/opt/hisi-linux/x86-arm/arm-himix200-linux/host_bin/../lib/gcc/arm-linux-gnueabi/6.3.0/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file monitor/uuid.o

这个是什么情况?

离线

#14 2021-03-08 15:28:16

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

依赖库对了吗,make clean 一下编。

leonaTian 说:

楼主,你好,最近也在这个蓝牙,用你这个代码编译(交叉编译器:arm-himix200-linux-gcc)失败,如下:
...
这个是什么情况?

离线

#15 2021-03-26 15:12:42

test0001
会员
注册时间: 2019-12-04
已发帖子: 19
积分: 19

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

大佬,bluez做蓝牙音箱要咋用,用pulseaudio,
搞晕了都

离线

#16 2021-03-26 18:13:25

TeveT
会员
注册时间: 2019-07-01
已发帖子: 67
积分: 54.5

Re: 玩弄bluetoothctl的时候直接拿过来单独编译搞事情(附源码)

参考我的这个: https://whycan.com/t_5305.html

test0001 说:

大佬,bluez做蓝牙音箱要咋用,用pulseaudio,
搞晕了都

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn