本文标签: Android提高
上次介绍了《Android利用麦克风采集并显示模拟信号》,这种采集手段适用于无IO控制、单纯读取信号的情况。如果传感器本身需要包含控制电路(例如采集血氧信号需要红外和红外线交替发射),那么传感器本身就需要带一片主控IC,片内采集并输出数字信号了。Android手机如何在不改硬件电路的前提下与这类数字传感器交互呢?可选的通信方式就有USB和蓝牙,两种方式各有好处:USB方式可以给传感器供电,蓝牙方式要自备电源;USB接口标准不一,蓝牙普遍支持SPP协议。本文选择蓝牙方式做介绍,介绍Android的蓝牙API以及蓝牙客户端的用法。
在Android 2.0,官方终于发布了蓝牙API(2.0以下系统的非官方的蓝牙API可以参考这里:http://code.google.com/p/android-bluetooth/)。Android手机一般以客户端的角色主动连接SPP协议设备(接上蓝牙模块的数字传感器),连接流程是:
1.使用registerReceiver注册BroadcastReceiver来获取蓝牙状态、搜索设备等消息;
2.使用BlueAdatper的搜索;
3.在BroadcastReceiver的onReceive()里取得搜索所得的蓝牙设备信息(如名称,MAC,RSSI);
4.通过设备的MAC地址来建立一个BluetoothDevice对象;
5.由BluetoothDevice衍生出BluetoothSocket,准备SOCKET来读写设备;
6.通过BluetoothSocket的createRfcommSocketToServiceRecord()方法来选择连接的协议/服务,这里用的是SPP(UUID:00001101-0000-1000-8000-00805F9B34FB);
7.Connect之后(如果还没配对则系统自动提示),使用BluetoothSocket的getInputStream()和getOutputStream()来读写蓝牙设备。
先来看看本文程序运行的效果图,所选的SPP协议设备是一款单导联心电采集表:
本文的代码较多,可以到这里下载:http://www.pudn.com/downloads305/sourcecode/comm/android/detail1359043.html
本文程序包含两个Activity(testBlueTooth和WaveDiagram),testBlueTooth是搜索建立蓝牙连接。BluetoothAdapter、BluetoothDevice和BluetoothSocket的使用很简单,除了前三者提供的功能外,还可以通过给系统发送消息来控制、获取蓝牙信息,例如:
注册BroadcastReceiver:
在BroadcastReceiver的onReceive()枚举所有消息的内容:
// 显示所有收到的消息及其细节
for (int i = 0; i < lstName.length; i++) {
String keyName = lstName[i].toString();
Log.e(keyName, String.valueOf(b.get(keyName)));
}
在DDMS里面可以看到BluetoothDevice.ACTION_FOUND返回的消息:
程序另外一个Activity~~~WaveDiagram用于读取蓝牙数据并绘制波形图,这里要注意一下JAVA的byte的取值范围是跟C/C++不一样的,Android接收到的byte数据要做"& 0xFF"处理,转为C/C++等值的数据。
声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android提高第十二篇之蓝牙传感应用
Linux系统与内核学习群:194051772
WP建站技术学习交流群:194062106
[e01]必须的
2010-11-26 11:07gv,顶顶你,识做滴。。
2010-11-26 11:09ding,必须的
2010-11-26 11:10ding
2010-11-26 11:14[e03]
2010-11-26 11:24啥也不说了,顶![e01]
2010-11-26 11:29关注好久,最近又有新东西··呵呵··你QQ多少,交个朋友·
2010-11-26 15:22[e01]
2010-11-26 15:23回复 jiahuibin:
2010-11-26 15:38说你的QQ吧,我加你。。。。
回复 hellogv:649413293
2010-11-26 17:26[e01] 很不错的文章
2010-11-26 23:45博主的android的教程和一般的教程就是不一样,非常有实际运用价值!关注中
2010-11-27 19:10好就得顶[e03]
2010-11-29 09:12正在弄android文件传输和存储啊 谢谢 博主哈[e03]
2010-11-29 09:29支持!![e01]
2010-11-29 13:48[e01]20101130
2010-11-30 09:42[e01]很不错 mark了
2010-11-30 09:50[e01]
2010-11-30 10:24[e01]
2010-11-30 15:08[e01]楼主QQ是多少的?
2010-11-30 17:27回复 herryz:
2010-11-30 18:40稳我有乜野事?我QQ净系摞囄倾计。。。
回复 hellogv:你甘劲,想同你学下野咯。。。
2010-11-30 22:05搂主不错! 顶~[e01]
2010-12-01 09:23强人~~~
2010-12-01 09:40呵呵,蓝牙弄好啦!不错[e03]
2010-12-01 17:35lz您好,客户端很清晰,我很想知道的是,服务端应该怎样发送数据?能给个最简单的实例不?谢谢~我测试时,pc端java写个服务端发送数据,android下就是接受不到~~
2011-01-06 22:18回复 hyayh:
2011-01-06 22:24PC JAVA 的蓝牙?最好基于SPP协议(蓝牙读写就是串口读写),可以用串口助手来调试客户端是否正常。。。。
回复 hellogv:谢谢你的解释,蓝牙方面刚开始学习,很多不懂的,我尝试下~~
2011-01-07 09:28有项目需求开发,请加QQ :973322
2011-01-14 22:58回复 godfaith:
2011-02-07 23:29不接外包。。。。谢谢
程序在模拟器上运行不起来,是因为没有蓝牙设备吗?我新手,还不是很明白
2011-02-24 10:52楼主真的好厉害
赞楼主。我有个问题。我连接一个bt外设并传送数据没有问题,但是我没办法给两个bt外设发送数据。现在我可以连接上两个外设,当第一个外设的outStream连接上bluetooth.getOutputStream()时还是可以继续发送消息,但是当第二个bt试图发送数据时就失败了。。。楼主有相关经验么?
2011-03-01 03:44[e01]
2011-03-11 16:05[e01]
2011-03-15 13:53看了你的文章,解决了手机和开发板蓝牙模块通信的问题~~~感谢
2011-03-22 22:06博主,我现在要用这个程序进行信号采集,求源码啊。我pudn号没下载量了,5555.邮箱:pjh_bupt@qq.com.
2011-04-07 19:20回复 qfyh05:
2011-04-07 19:21注册个吧,以后用得上
博主,你好,我试了下你的程序,用手机和IVT连接,再使用串口调试工具模拟,波形也画出来了,但是手指碰触手机屏幕,波形会随手指移动发生上下偏移,是为什么呢?
2011-04-13 17:48你好,我用WiFi和蓝牙整合成一个专门检测ssid的程序,现在很多错误啊,想请教,能否加你的qq呢?焦急。。。你加我吧,479237952.
2011-04-14 23:16我是用wifimanager和BlueAdatper
其中的某处error log是event_filter: Received signal org.bluez.Adapter:PropertyChanged from /org/bluez/559/hci0
2011-04-14 23:17这个UUID是不是一定要使用SPP(UUID:00001101-0000-1000-8000-00805F9B34FB);这个呢??
psdn我没下载量啊,能不能发一下源代码给我,7965367@qq.com
2011-04-15 18:44非常感谢!!!!!
下载不了,能不能给我发一份源代码。我的邮箱zhijie.gan@gmail.com 谢谢啊。
2011-04-19 16:53回复 ganzhijie:
2011-04-20 06:41过段时间就可以下载了,我本地也没有备份
回复 hellogv:文件不存在,而且下载好像还要钱哦。[e08]
2011-04-22 17:35请问系唔系一定要用SPP(UUID:00001101-0000-1000-8000-00805F9B34FB)这个UUID的?
2011-04-26 23:28回复 tjwink:
2011-04-26 23:50一定,这个就是SPP的定义
回复 hellogv:可唔可以发份代码比我?我真系好需要。。。[e06]
2011-04-26 23:59哈哈,我用楼主的心电跑血压数据竟然也能出波形!谢谢楼主![e04]
2011-04-27 13:16用SPP的UUID通常目标蓝牙模块的MAC地址就能直接与蓝牙模块配对传送信息吗?平时我们配对的时候不是需要输入一个默认的密码“1234”?
2011-04-27 17:24是不是所有蓝牙模块都支持SPP协议?如果不是的话,你知道有哪个模块支持?
2011-04-27 17:31使用楼主你的代码是不是需要事先配对?
2011-04-27 17:34回复 tjwink:
2011-04-27 20:05所有的蓝牙模块都必须支持SPP的,这个是一切通信的基础
是需要配对
非常感谢!!!
2011-04-27 23:17博主,请问你对蓝牙FTP文件传输了解么?做了一个C/S软件,客户端上传文件到服务器没问题。但是从服务器下载到客户端只能支持一些很小的文件。与第三方软件均没有任何问题。不知道问题出在哪了~~
2011-04-28 14:40回复 Fantasyforever2008:
2011-04-28 15:35这个比较复杂,建议你找开源的ftp服务器看看
回复 hellogv:嗯,好的,谢谢!
2011-04-28 16:19看了博主的文章很有收获.但是还有问题想请教.我想用android手机的蓝牙和一个带有蓝牙模块的硬件通信.现在调试用蓝牙适配器插入电脑的USB口.我用你给的android客户端程序连蓝牙适配器连接不上.请问博主蓝牙适配器那端用写程序吗?如果我想实现通信该怎么办?如果方便想加你qq.
2011-05-18 14:44回复 piaoliang456:
2011-05-18 15:01用SPP,模拟串口来通信,PC端只需要打开一个串口即可
回复 hellogv:博主在吗?PC怎么模拟串口,方便加qq吗?我对这方面不太了解.能详细说一下吗?
2011-05-18 15:56我的qq是67491245
2011-05-18 15:58回复 piaoliang456:
2011-05-18 16:17我最近灰常忙。。。而且这个不是简单说说就可以说明白的。。。
回复 hellogv:不好意思啊,如果方便的话给我你的电话我现在给你打.只需要几分钟帮我解决一下问题.
2011-05-18 16:34回复 piaoliang456:
2011-05-18 17:143.蓝牙适配器如果没安装SPP驱动则自动安装,已经安装过的话就会直接建立串口通信
4.PC的程序只需要打开蓝牙适配器模拟出来的串口,即可与手机蓝牙通信,操作就跟普通的串口通信一样。
回复 piaoliang456:
2011-05-18 17:14这个不是几分钟就可以搞定的。。。。
我说说流程吧:
1.插入蓝牙适配器
2.手机端搜到蓝牙后,通过SPP服务主动连接蓝牙适配器
回复 hellogv:谢谢回答.由于初次接触蓝牙,我现在还有不明白的地方.我现在做到你说的第2步,手机能搜到蓝牙,但是发起连接连接不上.我用的蓝牙适配器没有驱动程序,但是插到电脑上直接可以用,还有你说的PC端程序,是不是PC端也得写蓝牙通信程序呀.
2011-05-18 17:28回复 piaoliang456:
2011-05-18 17:36唉,你还是先学学最基本的windows 蓝牙编程,然后再来弄手机连接PC,这样会更好
回复 hellogv:[e06]有资料吗?推荐点.真的很需要.
2011-05-18 17:40感谢博主,今天调通了.[e04]
2011-05-20 14:29回复 piaoliang456:
2011-05-20 20:09这个。。。。。。。。。。。。
感谢楼主,已经调通了,其实什么都不用考虑,只要把传感器端设置成slaver就行了,其他的不需要设置[e04][e03]
2011-06-01 14:18楼主 代码下不了,求代码研究,feiqiyun@126.com
2011-07-11 11:33楼主,麻烦请教一个问题,android的蓝牙通讯工具写完了,安装在手机上,第一次配对正常,建立连接正常,通信正常。我关闭程序,断开蓝牙以后第二次连接,就连接不上了,bluetoothSocket.connect()抛出异常。此时android的设置里显示与下位机已配对但未连接,第二次连接时候没有出现配对请求。关机后再开机,第一次连接通信都正常,以后每次就失败了。不知道楼主遇到过没有,麻烦您了~
2011-08-04 09:54[reply]hubin2303620[/reply]
2011-08-05 07:57请确保第一次是彻底断开连接
学习了!写的很好!
2011-08-17 15:32但是我还有两个问题
1.UUID为什么不能变啊?
2.android api中有没有关于配对的API啊?
谢谢了
[reply]floweriswho[/reply]
2011-08-17 18:361.了解一下UUID就知道UUID是干嘛用了
2.SDK没有放出实现自动配对的功能
[reply]hellogv[/reply]
2011-08-17 19:21谢谢!
还有就是
public static synchronized BluetoothAdapter getDefaultAdapter()
这个方法只能在主方法用么?
刚才把这个方法放到了线程里报错了!
博主能不能发代码到我qq:101054,谢谢,那个pudn要收费的
2011-09-01 16:39[reply]xiaoyunio[/reply]
2011-09-04 14:046位的QQ号。。。
靓仔,麻烦您也发一下项目代码到我qq邮箱,谢谢!
2011-09-06 17:47邮箱:452612367@qq.com
[reply]lognic10[/reply]
2011-09-10 11:45自己到pudn下载吧
您好,请问您使用的蓝牙心电传感器在哪买的?我也打算做类似的演示,不过暂时还没有传感器。
2011-09-21 15:50[reply]lixiangyang1985[/reply]
2011-09-21 22:49自己做的。。。你买个压力传感器+单片机+蓝牙模块就行了
您好,看了你不少文章,学到了很多东西,表示感谢。
2011-09-22 16:27我现在遇到一问题,向你请教。
就本例中,画心电图,超出屏幕的部分是把参考轴重新设置为0,从开头画起。
有没有办法一直画下去,就是说在surfacevier上继续画,通过类似滚动条的东西来划动屏幕,看超出屏幕的部分?
[reply]yuanbieli[/reply]
2011-09-25 17:10这样效率不高,你可以画在ScrollView,然后在左右滚动
作者你好,我对你做的这个项目很感兴趣,所以也尝试了来做,但是缺乏那个带蓝牙模块的传感器,在网上搜了也没卖的,看了你是自己做的,想请教下,希望你能加我,我QQ是630744052,是南京的,拜托了,加我吧。
2011-09-27 17:34[reply]KAKA198812[/reply]
2011-09-27 22:51南京什么单位呢,我今年年初才从南京回深圳
[reply]hellogv[/reply]
2011-09-28 16:46我还是学生呢,想实现这个程序,但是没有带蓝牙的传感器,你加我咯,拜托了。
你好,我问个问题,系统自己带的蓝颜传送就是action_send那个intent,如果用setClass那样指定用蓝牙传送的话,貌似android系统不让传apk文件,想问下如果像你这样自己写连接用bluetoothsocket来进行流传送会存在这个问题么?或者说对于用蓝牙传送apk,你有什么好的方法!谢谢
2011-09-29 09:12[reply]bkship[/reply]
2011-09-29 09:27还有就是如果用这个bluetoothsocket 用文件流传输的话,对方手机是能被系统蓝牙直接接收这个 还是说,需要安装一个app,要我们自己来写数据接收?
[reply]bkship[/reply]
2011-09-29 18:50通过socket的话,什么文件都可以传,但是,对方也必须安装接收端才能够接收
那我想问问你那个带蓝牙的传感器是怎么做的,你说用单片机,蓝牙模块,还有传感器,那单片机你要自己编码吗
2011-10-01 15:53你好,我就是没法找到带蓝牙模块的传感器,既然你做好了,你能不能卖给我啊?
2011-10-02 10:56[reply]hellogv[/reply]
2011-10-07 22:29你就不回复我了,太难过了
我没用蓝牙来接受数据,利用摄像头来获取数据源,结果画出来的始终有条直线。开始还好,不闪。最后就跳起来了。感觉楼主的境界很深。。。
2011-10-10 12:28[reply]KAKA198812[/reply]
2011-10-10 14:12自己做,自己编码
我的蓝牙制作
2011-11-07 09:03http://hi.baidu.com/hongfadg/home
http://hi.baidu.com/hongfadg/home
2011-11-07 09:04我的蓝牙制作 http://hi.baidu.com/hongfadg/home
2011-11-07 09:04[reply]hongfadg2012[/reply]
2011-11-07 23:00我读书的时候也喜欢玩这样创新的东西….
[reply]KAKA198812[/reply]
2011-12-07 16:29买个蓝牙透传模块和单片机接,凑合用吧~
楼主:请教你一个问题,方便的话加我qq:376937140
2011-12-29 10:40我下了一个手机端蓝牙助手,发现华为手机android2.2.2版本的连接蓝牙模块时,第一次连接ok,然后断开再连发现很难连上。而用sansung手机android2.3.4版本的连接没有这个问题,我现在也在写这个手机端蓝牙串口通信的界面。
[reply]xuxindeng6565333[/reply]
2011-12-30 15:00华为第二次链接的时候,还需不需要配对?
hello,pudn挂了吗?登录不上。可以麻烦代码发我一份吗?谢谢~zhuangmz2008@gmail.com
2011-12-31 16:41怎么通过spp和其他非android设备的串口通讯,其他设备要监听什么端口?
2012-01-16 15:32[reply]griefcola[/reply]
2012-01-16 15:33其他设备没有 UUID:00001101-0000-1000-8000-00805F9B34FB
[reply]griefcola[/reply]
2012-01-16 21:30SPP是我见过最广泛的蓝牙通信协议,除非是蓝牙耳机作为固定用途的从端才会不支持的
你好,我在模拟器上运行您的程序出现错误,LogCat上出现的有错误,如,
2012-02-15 21:0202-15 12:31:26.673: E/AndroidRuntime(228): Caused by: java.lang.NullPointerException
02-15 12:31:26.673: E/AndroidRuntime(228): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.testBlueTooth/com.testBlueTooth.testBlueTooth}: java.lang.NullPointerException
求解,谢谢
楼主你好,请教一个问题,我用手机A通过SPP连接手机B时,如果两边都装有我这软件它才显示连接,要不然程序就显示连接不成功,我看有些应用只需在一端安装软件就可以连接的,那是用什么UUID?我的需求是在两台手机连接后,推送AT指令实现发短信打电话之类的功能。望楼主给点意见!谢谢
2012-02-24 10:22另:我的程序的蓝牙操作部份用的是android官方的demo:bluetoothChat
[reply]nfy84[/reply]
2012-02-24 15:48一端安装软件就可以连接的——->被连接端已经带有蓝牙服务,例如蓝牙耳机的音频和语音等
[reply]hellogv[/reply]
2012-02-25 15:33也就是说,我用SPP连接另一台手机的话,那台手机是不需要再安装什么程序的,对不?
楼主你好,你的这种实时的心电采集对波特率有什么特别的要求吗?如果说波特率太小,那么在大量采集的时候会不会不够呢?还有,波特率在android手机蓝牙上是如何修改的?麻烦回复下,谢谢
2012-04-17 16:05[reply]zym952469480[/reply]
2012-04-19 23:38蓝牙的速度够快的了,你用spp,系统自己给你选个合适的波特率了,不用再设置波特率
楼主好 我想通过编程实现手机蓝牙和蓝牙音箱的连接,但是怎么都连不上,能帮我一下么 谢谢了 万分感谢
2012-04-29 22:10[reply]sirhuoshan[/reply]
2012-05-02 14:02先看看你的蓝牙音箱支持什么服务,你的手机支不支持
蓝牙音箱支持的协议是A2DP协议。我通过手机自带的蓝牙设置,连接蓝牙音箱可以连接上,而且放歌也是蓝牙音箱发声音。但是通过编程实现连接蓝牙音箱就连接不上了。谢谢了 ,万分感谢。[reply]hellogv[/reply]
2012-05-02 15:03楼主你好,你在做这个的时候,没有出现阻塞现象么
2012-05-06 16:48[reply]didagang[/reply]
2012-05-08 15:15哥,你把上面的代码改一下就可以了…..
[reply]didagang[/reply]
2012-05-10 07:54哥,你是新手的话,就先入门慢慢学,后面再弄这个吧,我是没能力让初学者马上掌握这个的
你好,最近在整android手机接收 传感节点数据,能把你做的这个程序的源代码发给我一份吗,不胜感激~~~~ wlqbd88@163.com
2012-05-10 09:42看了博主N多文章啊,受益匪浅啊!想问个问题,我这里有一个别人的蓝牙适配器还有单片机,可以获取汽车的一些数据,然后PC有个软件可以和他连接获取数据。我现在可以通过android蓝牙和他连接获取和发送数据么?
2012-05-11 15:37[reply]icewst[/reply]
2012-05-12 10:27可以,通过spp
博主你好 我最近也在学习蓝牙的开发还是个android的小菜鸟 你给的连接我去下载了 可是里面的类不全 博主方便的话能不能给我发一份到 wangzhifei_1069@163.com 邮箱里 万分感谢
2012-05-14 14:51高手啊~ 方便的话加个QQ 812202464 让小菜学习学习啊
2012-05-14 17:28楼主你好,能不能介绍一下spp的传输规则或这方面的资料或书籍,因项目需要,不知道如何从血氧里取数据,socket 已经连接但不知道如何发指,qq: 393135188, +我 谢谢啦
2012-05-14 17:49[reply]icewst[/reply]
2012-05-17 10:58搞定,感谢
[reply]ivanlxg[/reply]
2012-05-17 21:31怎么现在都做这个了…
可以通过蓝牙进行拨号吗?
2012-05-26 14:23[reply]LuoXianXion[/reply]
2012-05-27 09:59要手机支持语音蓝牙服务
楼主你好,关于蓝牙有个问题请教你,我用2个android手机连接,总是显示匹配但未连接,不知道为什么,我去连接一个设备,这个设备要通过pin码匹配,输入正确后也是显示匹配但未连接,知道原因吗?
2012-05-28 17:06楼主我想问一下您 连接以后 能不能直接发字符串 还是一定要发dyte[]数组 我想发生一条指定字符串指令到蓝牙模块上 麻烦给我说下 谢谢了
2012-07-07 10:09顶 强大
2012-07-26 16:48楼主你好,我想问一下你测心率用的设备是蓝牙心率带吗?是哪个品牌的?我的qq:120160075能加下我吗??
2012-09-19 10:13[reply]happytaozs[/reply]
2012-09-22 09:20这个心率带是以前公司的产品
楼主您好,我现在在做一个项目,就是有关Android手机与硬件血压测量设备交换信息的。通过您的博文,我也尝试写了一个Android连接模块,测试的时候总是连接不了,一开始我以为是协议的错,尝试了很多协议,发现只有您博文中给出的协议UUID,在执行connect的时候,返回connect refused,其他都是抛出services discovery failed的错误,所以我想您博文给出的SPP协议应该没有问题。项目蓝牙连接是这样设计的,硬件蓝牙设备要一直在等待字节A,接收到这个A才返回B,并启动设备测试血压产生包络。手机写A到硬件设备,等到读到B,才算正式握手成功,然后接受血压测试的包络。在Android编程的时候,我发现要写数据A到硬件设备要先连接,得到socket,之后得到输出输入流,才能读写。可是现在执行connect()总是抛出异常。然后我想是不是可以先不连接,只通过createRfcommSocketToServiceRecord()直接得到socket,直接读写,可是在用输出输入流读写时,又抛出异常,无法读写。现在我不知道怎么得到一个真正的socket,还有就是项目硬件部分不是我负责的,我有点怀疑是不是硬件编程的问题,不是Android手机编程的问题。您是怎么看的呢?您做的android和硬件设备连接,是否也设计成通过发送AB来确认彼此,才连接呢?这是我的QQ号:1071101787,可以的话麻烦加下QQ,或者回答一下我的问题。以方便请教学习,万分感激!万分感谢!
2012-09-22 23:00[reply]hellogv[/reply]
2012-09-24 20:34您好楼主,你们公司的蓝牙心率带是哪个品牌呢?还有就是,就你了解,蓝牙心率带是不是只要跟手机或电脑的蓝牙设备配对链接好后,蓝牙心率带就直接自动给手机发送数据呢?还是先从手机上同过蓝牙向心率带发送一些参数后,后者才开始向手机发送数据呢?能加您的QQ吗?我的QQ是120160075
楼主您好!在您的程序在手机上跑起来了,Log.e("available", String.valueOf(len)); 打印出来的值怎么都不变呢?都是同一个数据,我把蓝牙心率带解下来了,还是会打印出同样的一个数据“2”这是怎么回事呢?是不是表示没有接收到数据啊?
2012-09-25 22:52楼主你好,我安装了之后可以连接蓝牙设备了,但是把蓝牙模块和传感器连接,可以配对,但是无法画出波形,求你指点!
2012-10-09 12:01[reply]HuangKang314[/reply]
2012-10-11 07:59先确认蓝牙发出的是否波形数据….
博主你好 关注这篇帖子很久了 学了不少东西 我想问下你这发送的数据类型是什么样的 为什么发送123和发送1是一样的显示呢 就好像只能识别一位一样 谢谢
2012-10-11 09:43