蓝牙编程-l2cap协议层的c/s程序

[Android源码分析]L2CAP的bind分析以及psm和cid的介绍和实现 继续上文的socke的创建之后,我们自然而然就会想到下面的工作了,没错就是bind。 5.6 l2cap的bind分析     按照国际惯例,在建了socket之后,必然会有bind,哈哈~~ if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0, 阅读详情
昨天晚上完成了使用BlueZ协议栈中的lib实现rfcomm层连接的程序,并且移植到了arm-linux上运行通过.程序实现了客户端发送字符串在服务端控制台显示.但是在输入大量的字符时会出现没有响应的情况.看了下书估计和socket中的MTU(Max Transportion Unit)有关系,但也没有继续去试验了,应为在我的应用中一般不会直接使用rfcomm作为连接协议,而是使用l2cap协议.所以今天就来试试l2cap协议方式的socket连接.
以下为客户端的程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>
int main( int argc , char **argv)
{
   struct sockaddr_l2 addr={0};
   int s,status;
   char *dest,*buf; //="00:11:67:32:61:62";

   if(argc==2)
     {
       dest=argv[1];
     }
   else
     {
       printf("useage:client addr/n");
       exit(1);
     }
   // a l l o c a t e a s oc k e t
   s=socket(PF_BLUETOOTH,SOCK_SEQPACKET,BTPROTO_L2CAP);
   if(s<0)
     {
       perror("create socket error");
       exit(1);
     }
   // s e t the conne c t ion parameter s (who to connect to )
   addr.l2_family=AF_BLUETOOTH;
   addr.l2_psm=htobs(0x1001);
   str2ba(dest,&addr.l2_bdaddr);
   // connect to s e r v e r
   printf("connectting.../n");
   status=connect(s,(struct sockaddr *)&addr,sizeof(addr));
   // send a message
   if(status==0){
     printf("scuess!/n");
     status=write(s,"hello!",6);
  
   do{
     scanf("%s",buf);
     status=write(s,buf,strlen(buf));
     if(status<0) perror("uh oh");
   }while(strcmp(buf,"goodbye")!=0);
   }
   else
     {
       printf("Failed!/n");
     }

   close(s);
   return 0;
}

以下为服务端的程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>
int main (int argc,char **argv)
{
   struct sockaddr_l2 loc_addr ={0},rem_addr={0};
   char buf[1024] ={0};//,*addr;
   int s,client, bytes_read,result;
   int opt = sizeof(rem_addr);
  
   //allocate socket
   printf("Creating socket.../n");
   s =socket(PF_BLUETOOTH,SOCK_SEQPACKET,BTPROTO_L2CAP);
   if(s<0)
     {
       perror("create socket error");
       exit(1);
     }
   else
     {
       printf("success!/n");
     }
   // bind socket to port 1 of the first available
   // local bluetooth adapter
   loc_addr.l2_family=AF_BLUETOOTH;
   loc_addr.l2_bdaddr=*BDADDR_ANY;
   loc_addr.l2_psm=htobs(0x1001);
  
   printf("Binding socket.../n");
   result=bind(s,(struct sockaddr *)&loc_addr, sizeof(loc_addr));
   if(result<0)
     {
       perror("bind socket error:");
       exit(1);
     }
   else
     {
       printf("success!/n");
     }
   // put socket into listening mode
   /*result=ba2str(&loc_addr.rc_bdaddr,addr);
   if(result<0)
     {
       perror("addr convert error");
       exit(1);
     }
     printf("local addr is:%s/n",addr);*/
   printf("Listen... ");
   result=listen(s,1);
   if(result<0)
     {
       printf("error:%d/n:",result);
       perror("listen error:");
       exit(1);
     }
   else
     {
       printf("requested!/n");
     }
   // ac c ept one conne c t ion
   printf("Accepting.../n");
   client= accept(s,(struct sockaddr *)&rem_addr,&opt);
   if(client<0)
     {
       perror("accept error");
       exit(1);
     }
   else
     {
       printf("OK!/n");
     }
   ba2str(&rem_addr.l2_bdaddr,buf);
   fprintf(stderr,"accepted connection from %s /n",buf);
   memset(buf,0,sizeof(buf));
   // read data from the client
   while(1)
     {
       bytes_read = read(client,buf,sizeof(buf));
       if(bytes_read>0){
     printf("received[%s]/n",buf);
     if(strcmp(buf,"goodbye")==0)
       exit(1);
     memset(buf,0,bytes_read);
       }
     }
   //close connection

   close(client);
   close(s);
   return 0 ;
}

整个程序和rfcomm协议下的socket程序区别不是很大,只是在创建socket的时候使用协议和数据结构有所不同.在使用中发现在默认MTU的设置下,能够一次传输的字符串长度明显长于rfcomm模式下,且较为稳定.
但是在默认情况下,这样创建的连接并不能算是可信赖的连接.下次再来研究下如何创建一个可信赖的连接./
<iframe frameborder="0" id="gn_notemagic" style="position: absolute; display: block; opacity: 0.7; z-index: 500; width: 17px; height: 21px; top: 69px; right: 100px;" src="http://www.google.com/gn/static_files/blank.html"></iframe>
四 蓝牙低功耗(BLE)协议栈 之 L2CAP层 一 介绍 L2CAP(逻辑链路控制和适配协议层)是一个复用层,可以让低功耗蓝牙复用三条不同的信道。它也支持数据的分割、数据重组、通道多路复用、通道流量控制和错误检测,使得较大的报文可以在底层无线电中传输。L2CAP层提供逻辑通道,即L2CAP通道,这些通道在一条或多条逻辑链路上复用。在经典蓝牙无线电中,L2CAP层提供的功能比这更多,也更为复杂。 通道管理器(Channel Manager)提供一个功能控制的控制面板,并负责所有内部信令、L2CAP点对点信令以及高层和低层的信令。 重传和流控制块(Retr 阅读详情

相关推荐

蓝牙(七)L2CAP层协议解析

1、L2CAP概述 L2CAP-全称是逻辑链路控制与适配层,为两个通信的蓝牙设备提供一个端到端的通道。 L2CAP主要功能: 1.协议信道复用(protocol/channel multiplexing) 2.分段与重组(segmentation and reassembly SAR) 3.每个信道流控(per-channel flow control) 4.差错控制(error ...

xsophiax的专栏 1万+

mysql psm 编程_实战Linux Bluetooth编程(四) L2CAP层编程

作者:Sam (甄峰)(L2CAP协议简介,L2CAP在BlueZ中的实现以及L2CAP编程接口)一:L2CAP协议简介:Logical Link Control and Adaptation Protocol(L2CAP)逻辑连接控制和适配协议(L2CAP)为上层协议提供面向连接和无连接的数据服务,并提供多协议功能和分割重组操作。L2CAP充许上层协议和应用软件传输和接收最大长度为64K...

weixin_42680139的博客 369

Linux 官方蓝牙协议栈 BlueZ 第三篇:Classic Bluetooth 编程实战——基于 libbluetooth 的 RFCOMM、L2CAP 与 SDP 全流程

本篇着重讲解 Classic Bluetooth(BR/EDR)在 Linux/BlueZ 下的编程实践,围绕 libbluetooth C API,深入介绍 RFCOMM、L2CAP、SDP 的客户端与服务端示例,包含连接管理、服务发现、错误处理与性能优化,助你构建可靠的经典蓝牙应用。

hemoparrot的专栏 1449

Andorid BluetoothSocket的工作原理之三

Android BluetoothSocket工作原理

YingbinLi的博客 838

Foxglove Studio实战:5步搞定自动驾驶数据可视化(附避坑指南)

本文详细介绍了如何使用Foxglove Studio高效搭建自动驾驶数据可视化工作流。通过五个核心步骤:环境准备、数据导入、面板搭建、交互分析与自动化集成,帮助开发者快速掌握这一专为机器人系统设计的开源平台。文章重点解析了其与ROS/ROS 2、MCAP等数据源的无缝对接,以及3D点云、多传感器融合、团队标注等核心功能,并附有实用的性能优化与避坑指南,旨在提升算法调试与团队协作效率。

d3e4f的博客 337

基于PID算法的循迹小车

这一期为创客们带来基于PID算法的循迹小车制作 1.标准赛道示意图: (该赛道包含了:左直角、右直角、十字路口等路况) 2.灰度传感器安装示意图: (可根据实际情况调节各传感器之间的间距) 3.硬件原理图: 4.控制逻辑: 5.程序如下: #define leftA_PIN 7 #define leftB_PIN 6 #define left_Pwm_PIN 5 #define STBY...

qq_44343584的博客 4万+

实战Linux Bluetooth编程(六) L2CAP编程实例

例一:发送Signaling Packet:Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.多个Command可以在一个C-frame(control frame)中发送。  如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接S

baozhongchao的专栏 8104

Dify 从入门到精通:第一篇 - 基础介绍与快速上手

Dify是一个开源的低代码平台,旨在简化大型语言模型(LLM)应用的开发流程。本文作为"Dify从入门到精通"系列的首篇,全面介绍了Dify的核心概念、安装步骤和基本使用方法。文章首先解析了Dify的多模型支持、低代码开发等特点,然后详细讲解了基于Docker的安装配置过程,包括系统要求、环境变量设置等。通过创建一个邮件助手应用的实际示例,展示了Dify的可视化工作流设计功能。最后简要介绍了高级特性和最佳实践,为后续深入学习奠定基础。本文为开发者提供了从零开始使用Dify构建AI应用的完

IT深耕十余载,大道之简 1147

linux蓝牙编程 bluez

从别的地方转了一篇蓝牙编程的,感觉比较详细,接下来自己慢慢验证一下。 实战Linux Bluetooth编程实战Linux Bluetooth编程(一) 协议栈概述前言:随着嵌入式系统的飞速发展,很多嵌入式平台上需要Bluetooth设备和应用。但在Linux下如何对Bluetooth编程,一直没有一份很好的中文文档。Sam结合自己的工作,一

iotplan.com 物联网技术专栏 6188

游戏大厂如何解析引擎技术

本文系统解析了游戏大厂如何评估和定制游戏引擎。游戏引擎作为游戏开发的核心基础,大厂会从性能、跨平台支持、渲染能力、网络模块等8个维度进行技术解析,通过文档查勘、源码阅读、Demo测试等7个步骤深度评估。解析后通常有三种决策:直接使用、深度定制或自研重构。文章以腾讯、网易、米哈游等为例,展示了不同厂商的引擎定制策略,并分析了技术解析面临的挑战和未来趋势。最终指出,体系化的引擎技术解析是打造高质量游戏的关键,需要持续的技术投入和团队协作。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 535

六、大模型(LLMs)参数高效微调(PEFT) 面

链接: https://pan.baidu.com/s/1TYqdCK53tDFEYGtAvpnTbA 提取码: 6a9s。考核中的核心考点,并针对这些考点提供了详尽的解答。通过网盘分享的文件:06大模型(LLMs)参数高效微调(PEFT) 面。)有哪些方法,能不能稍微介绍一下它们间?这种微调方法和全参数比起来有什么劣势吗?能不能总结一下各种参数高效微调方法?高效参数微调,如何进行存储?多种不同的高效微调方法对比。模型显存占用的部分有哪些?微调方法为啥能加速训练?微调计算可训练参数的比例。

weixin_51988935的博客 535

传统蓝牙L2CAP的连接流程(以被连接为例)

一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等 第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等 第四篇:传统蓝牙host介绍,主要

朝气蓬勃 6391

SAP-ABAP:SAP创建CDS视图(SQL语句创建)实例详解

通过Eclipse和ADT创建CDS视图是SAP开发中的一项重要技能。CDS视图不仅简化了数据建模,还提供了高性能和灵活性。掌握CDS视图的开发和使用,可以帮助你更好地支持SAP S/4HANA和Fiori应用的开发。

baidu_35680696的博客 1825

蓝牙L2CAP(经典蓝牙)

(2)PDU(protol data unit),l2cap封装后的数据,PDU的类型有B-frame、I-frame、S-frame、C-frame、G-frame、K-frame。(4)I-frame,用来支持流控制模式(flow control),重传模式(retransmission)和流模式(streaming),详情看相关模式章节。(3)C-frame,信号数据格式,用来收发命令的,格式和B-frame一样,但payload有具体规定。

weixin_43930052的博客 2243

Python爬虫实战:基于Playwright与异步技术的专利数据抓取系统

专利数据是企业技术创新、市场竞争分析和行业趋势预测的关键情报来源。然而,专利数据通常分散在各个国家的专利局网站,数据结构复杂,反爬机制严格,使得高效抓取成为技术挑战。本文将详细介绍如何构建一个基于最新Python技术的专利数据抓取系统,涵盖Selenium的现代化替代方案Playwright、异步编程、智能代理轮换等高级技术。

2201_76125261的博客 1562

130页5万字某市档案馆数字档案馆建设方案

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除!完整资料领取见文末,部分资料内容:国家档案局证实颁布《数字档案馆建设指南》, 明确了数字档案馆建设原则、要求、目标,对相关系统建设内容、功能要求进行了概括和详细说明。数字档案馆系统建设应以 OAIS&nbsp;参考模型为设计基础,以实现数字资源的长期保存与可信管理。设计的数字档案馆系统架构如下图。图-1 数字档案馆体系结构数字档案馆建设包括五大层次和三大保障体系:

zuoan1993的博客 1180

基于 L2CAP 协议的蓝牙 BLE 设备通信指南

每个信道分配一个2字节的信道ID——CID(Channel ID),每个信道功用不同,比如CID=0x0004的信道表示属性协议(Attribute Protocol)专用信道。BLE协议默认的MTU为23字节。// MTU默认23字节: op code(1 字节),handle(2 字节,小端),payload(0-20字节)// MTU默认23字节: op code(1 字节),handle(2 字节,小端),payload(0-20字节)协议复用可以理解为,不同的协议走不同的信道,互不干扰。

jax2730的博客 1324

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝牙BLE协议之——L2CAP层

​ 蓝牙低功耗(BLE)的L2CAP层是协议栈核心逻辑链路控制层,位于ATT/GATT等上层协议与HCI/LL控制层之间,文章基于蓝牙6.0协议栈核心规范文档,由SIG规定 ​

to_the_world的博客 1722

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

蓝牙5 BR/EDR L2CAP层协议分析

l2cap功能一览

yuzhongqingsi的专栏 1699

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深入解析蓝牙L2CAP层:信道模式与帧结构全指南

本文深入解析蓝牙协议栈中的L2CAP层,详细阐述了其作为逻辑链路控制与适配协议的核心功能。文章重点剖析了L2CAP的信道模式(包括基础模式、流控模式、重传模式等)与帧结构(B帧、I帧、S帧、C帧),并对比了低功耗蓝牙与传统蓝牙在L2CAP实现上的关键差异,为开发者优化连接稳定性和数据传输效率提供实用指南。

y2z3a4b5c的博客 1017
上一篇: rfcomm层的socket程序编写
下一篇: 好久都登不上来啊
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值