0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术标准socket编程应用于英创主板的蓝牙接口

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-05 10:30 次阅读

蓝牙(bluetooth)技术是一种低功耗短距离的无线通信技术,被广泛应用于10米以内的嵌入式设备通信当中。其最高传输速度根据蓝牙协议的版本不同,有1Mbps(BR、LE)、2-3Mbps(EDR)、24Mbps(HS)之分。在工业现场,蓝牙技术可以代替串行线缆,实现无线通信。在智能手机普及的今天,通过蓝牙与手机建立连接,手机作为上位机发送指令给下位机,可以实现低成本的UI控制方案。

BlueZ是当前比较成熟的蓝牙协议栈,作为Linux系统的官方协议栈,集成在Linux内核之中。英创公司在ESM928x的Linux系统中,又移植了BlueZ用户空间协议栈和相关工具,使得ESM928x Linux平台能够支持蓝牙技术,通过socket编程实现蓝牙无线连接,代替串行线缆进行通信。

图1ESM928xW系列主板+底板

用户使用蓝牙串口功能主要分为两个步骤:蓝牙功能配置和socket应用程序编写。

1、蓝牙功能配置

1、加载ap2610蓝牙模块上电驱动

insmod /lib/modules/4.1.14/ap6210_bt_bcm20710.ko

2、加载蓝牙固件,设定波特率、蓝牙地址、使能hci等

brcm_patchram_plus --patchram /lib/firmware/ap6210/bcm20702a.hcd --baudrate 3000000 --enable_hci --bd_addr aa:00:55:44:33:22 --no2bytes --tosleep 5000 /dev/ttyS5 1> /dev/null&

3、启动dbus后台服务

dbus-daemon --system --nofork --nopidfile &

4、以兼容模式启动bluetooth后台服务

/libexec/bluetooth/bluetoothd -C &

5、启动hci0,并设置name和可见属性

hciconfig hci0 up

hciconfig hci0 name esm9287

hciconfig hci0 piscan

hciconfig hci0 reset

以上5个步骤已经写成一个shell脚本set_bluetooth.sh,用户也可以直接运行该脚本完成以上设置。至此,完成了对蓝牙的设置,可以通过hciconfig hci0 -a来查看蓝牙信息,如图2。这时,其他蓝牙设备就可以搜索到esm9287,图3所示是android手机搜索到esm9287蓝牙设备,点击即可完成配对。

图2使用hciconfig查看蓝牙信息

图3搜索esm9287并配对

2、Socket应用编程

蓝牙协议栈中的RFCOMM协议实现了对串口RS232仿真,最多能提供两个蓝牙设备之间60路的连接。应用程序中,可以使用socket进行服务端和客户端的编程,其过程与TCP/IP的socket通信没有太大区别。

a)环境配置

开发bluez协议栈的蓝牙应用需要用到libbluetooth.so和相关头文件,需要添加到eclipse对应的蓝牙项目中。libbluetooth.so是编译bluez协议栈生产的动态链接库,提供了头文件bluetooth.h、hci_lib.h、sdp_lib.h中的函数实体,实现蓝牙地址与常用数据类型的转换、hci设备和sdp服务的一系列操作函数。

1、在项目中新建文件夹include/bluetooth,其中放入蓝牙协议相关头文件;新建文件夹lib,其中放动态链接库libbluetooth.so。

图4新建include和lib文件夹

2、进入项目Properties设置,添加项目下的include文件夹为GCC C++ Compiler和GCC C Complier编译器的头文件路径(下图是GCC C++ Compiler的设置,GCC C Compiler设置步骤相同)。

图5添加头文件搜索路径

3、为Sourcery G++ Lite C++ Linker链接器添加libbluetooth.so库文件及搜索路径,如下图。

图6添加编译库及搜索路径

b)服务端程序

1、申请蓝牙RFCOMM socket

s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

2、绑定本地适配器,BDADDR_ANY默认为第一个可用蓝牙适配器

loc_addr.rc_family = AF_BLUETOOTH;

loc_addr.rc_bdaddr = *BDADDR_ANY;

loc_addr.rc_channel = (uint8_t) 1;

bind(s, (structsockaddr *)&loc_addr,sizeof(loc_addr));

3、设置socket监听模式,这里只允许建立一个连接

listen(s, 1);

4、等待连接

client = accept(s, (structsockaddr *)&rem_addr, &opt);

5、select模式读取socket数据流

while(1)

{

FD_ZERO(&working_set);

max_sd = client;

FD_SET(client, &working_set);

timeout.tv_sec = 3 * 60;

timeout.tv_usec = 0;

// Call select() and wait 5 minutes for it to complete.

printf("Waiting on select() %ld sec...\n", timeout.tv_sec);

intrc_select = select(max_sd + 1, &working_set, NULL, NULL, &timeout);

// Check to see if the select call failed.

if(rc_select < 0)

{

perror(" select() failed");

break;

}

elseif(rc_select > 0)

{

if(FD_ISSET(max_sd,&working_set))

{

// read data from the client

bytes_read = read(client, buf,sizeof(buf));

if( bytes_read > 0 ) {

printf("received: [%s]\n", buf);

}

else

{

break;

}

write(client,ack,sizeof(ack));

}

}

// Else if rc_select == 0 then the 5 minute time out expired.

else

{

printf(" select() timed out.\n");

break;

}

}

6、关闭套接字

close(client);

close(s);

c)客户端

1、申请蓝牙RFCOMM socket

s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

2、设置蓝牙连接服务器的地址

structsockaddr_rc addr = { 0 };

// set the connection parameters (who to connect to)

addr.rc_family = AF_BLUETOOTH;

addr.rc_channel = (uint8_t) 1;

str2ba( dest, &addr.rc_bdaddr );

3、连接蓝牙服务器

// connect to server

status = connect(s, (structsockaddr *)&addr,sizeof(addr));

4、读写socket数据流

for(i = 0; i < 3; i++)

{

// send a message

write(s, message[i], strlen(message[i])+1);

printf("write "%s" to %s\n", message[i],dest);

bytes_read = read(s, buf,sizeof(buf));

if( bytes_read > 0 ) {

printf("received: [%s]\n", buf);

}

}

其中,message[i]为发送内容的地址。

5、关闭socket

close(s);

在一张板子上运行蓝牙rfcomm服务程序,在另一张板子上运行蓝牙rfcomm客户端程序,如图6、图7所示:

图7服务端程序

图8客户端程序

通过socket编程,蓝牙应用程序可以像tcp/ip的网络编程一样,建立连接,实现无线通信。如果有用户对蓝牙的串口socket编程感兴趣,可以联系我们。我们将提供驱动文件、蓝牙库文件及相应的示例程序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6081

    浏览量

    34941
  • 安卓
    +关注

    关注

    5

    文章

    2107

    浏览量

    56702
收藏 人收藏

    评论

    相关推荐

    北方华自研射频电源批量应用于多款产品

    近日,北方华在互动平台宣布了一项重要进展:公司自主研发的射频电源已成功批量应用于多款产品中,标志着其在半导体核心部件国产化道路上迈出了坚实的一步。随着国内零部件供应商能力的显著提升,北方华的国内采购比例逐年攀升,进一步促进了
    的头像 发表于 09-10 17:12 417次阅读

    中软国际信服务助力大连信产业发展

    为进一步激发大连本地信产业生态的活力与潜力,搭建一个高效、开放的交流平台。由大连软件行业协会携手大连市信息技术应用创新综合服务中心主办,中软国际协办的,2024年大连市信息技术应用创新产业发展大会
    的头像 发表于 08-27 16:49 663次阅读

    简述socket编程中的常用函数

    Socket编程是一种基于TCP/IP协议的网络编程技术,它允许应用程序通过网络进行通信。在Socket编程中,有许多常用的函数,它们
    的头像 发表于 08-16 10:49 152次阅读

    如何理解socket编程接口

    Socket编程接口是一种网络编程的基本概念,它提供了一种在不同计算机之间进行通信的方法。 Socket
    的头像 发表于 08-16 10:48 219次阅读

    集芯IP2341:适用于音箱电源解决方案的多节串联锂电池异步升压充电芯片

    的操作空间。同时,它还具备NTC保护功能,可与NTC电阻配合使用,实时监测电池温度,确保电池在充电过程中的安全性。集芯IP2341广泛应用于音箱、玩具、小家电设备、个护电器等锂电池充电设备中,为这些设备提供了稳定、高效、安全的充电解决方案。
    发表于 07-17 16:27

    通过大小鼠无血压测量实验明白了无血压测量技术的重要性

    血压测量技术的重要性:无血压测量技术是一种非侵入性的测量方法,可以避免对动物造成不必要的伤害。在医学研究中,无血压测量
    发表于 04-22 09:40

    泰斯特承办“联企投汇·周三会”,协同打造智能网联新高地

    2024年3月27日,由市委统战部、市工商联主办、武汉市高新技术产业协会协办的“联企投汇·周三会”第十三期活动在武汉英泰斯特电子技术有限公司(以下简称“泰斯特”)成功举办。
    的头像 发表于 03-29 09:50 374次阅读

    股份今日登陆科

    山东中软件商用中间件股份有限公司(以下简称“中股份”)近日在上海证券交易所科板成功上市,标志着这家国内知名的民营软件和信息技术服务企业正式进入资本市场,迎来全新的发展机遇。
    的头像 发表于 03-13 14:19 414次阅读

    股份在上交所科板上市

    山东中软件商用中间件股份有限公司(以下简称“中股份”)近日在上海证券交易所科板成功上市,标志着这家国内知名的民营软件和信息技术服务企业正式进入资本市场,开启了发展的新篇章。
    的头像 发表于 03-13 14:02 396次阅读

    软通动力与捷技术签订战略合作协议

    近日,软通动力信息技术(集团)股份有限公司(以下简称“软通动力”)与宁波捷技术股份有限公司(以下简称“捷技术”)正式签订战略合作协议,并
    的头像 发表于 02-03 16:35 1001次阅读

    PCB企业力三期项目顺利投产

    近日,PCB企业四川力电子科技股份有限公司三期(载板厂和特种板厂)顺利投产。通过这个项目,力公司成功地将业务范围从单一的普通通孔多层板扩展到了高端的IC载板、MiniLED基板
    的头像 发表于 01-15 14:20 462次阅读

    Crucial睿达移动固态硬盘体验评测

    提及睿达,相信很多人都知道这个品牌,因为当年组装电脑没少使用睿达的内存,实际上睿达是美光旗下的SSD和内存高端品牌。睿达所使用的的存储颗粒也都是美光。
    的头像 发表于 12-16 11:34 924次阅读
    Crucial<b class='flag-5'>英</b>睿达移动固态硬盘体验评测

    Socket 网络编程框架介绍

    Socket 网络编程框架 Socket(套接字)是一个网络编程概念,描述了一个通信端点(Endpoint),用于建立网络连接(Connec
    的头像 发表于 11-09 14:19 855次阅读
    <b class='flag-5'>Socket</b> 网络<b class='flag-5'>编程</b>框架介绍

    码科技精彩亮相火爆的IOTE 2023,多面赋能AIoT产业发展!

    算力硬件为基础,搭载自研的0代码移植工具链,在不触碰客户模型文件的前提下,实现算法从GPU到XPU的一键移植,最快1天实现算法适配,快、易、省赋能长尾AI算法在AI视觉产业的广泛应用; 目前已广泛应用于
    发表于 09-25 10:03

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48